OpenGL dokularını bulanıklaştırmadan nasıl ölçeklendirebilirim?


15

LWJGL aracılığıyla OpenGL kullanıyorum.

Ben 16x16 bir 16x16 dokulu dört render var. Ölçek miktarını değiştirdiğimde, dörtlü büyür, sonra büyüdükçe bulanıklaşır.

Minecraft'ta olduğu gibi bulanıklaşmadan nasıl ölçeklendirebilirim?

İşte benim RenderableEntity nesnesinin içindeki kod:

public void render(){       
    Color.white.bind();
    this.spriteSheet.bind();        
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0,0);
        GL11.glVertex2f(this.x, this.y);
        GL11.glTexCoord2f(1,0);
        GL11.glVertex2f(getDrawingWidth(), this.y);
        GL11.glTexCoord2f(1,1);
        GL11.glVertex2f(getDrawingWidth(), getDrawingHeight());
        GL11.glTexCoord2f(0,1);
        GL11.glVertex2f(this.x, getDrawingHeight());
     GL11.glEnd();

}

Ve oyun sınıfımdaki initGL yöntemimden kod

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glClearColor(0.46f,0.46f,0.90f,1.0f);
GL11.glViewport(0,0,width,height);
GL11.glOrtho(0,width,height,0,1,-1);

Ve işte asıl çizimi yapan kod

public void start(){
    initGL(800,600);
    init();

    while(true){
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        for(int i=0;i<entities.size();i++){
            ((RenderableEntity)entities.get(i)).render();
        }

        Display.update();
        Display.sync(100);

        if(Display.isCloseRequested()){
            Display.destroy();
            System.exit(0);
        }
    }
}

Yanıtlar:


17

Doku büyütme türünü değiştirmeniz gerekir, şöyle:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

GlTexParameter hakkında bilgi edinin .


Doku büyütülmüş bir ölçekte gösterildiğinden, değiştirmek istediği büyütme olmaz mı?
Neverender

Yanıtınız için teşekkürler Ricket. Şimdi glTexParameter ile ilgili belgeleri okudum ve burada çalışmak için pek çok güzellik var. Ayrıca, kodunu oluşturmak için GL_TEXTURE_MINve ekledi GL_TEXTURE_MAG. Beklediğim gibi çalışıyor. Şimdi daha fazla bilgi edinmeye gidiyorum.
güzel

@ZachB, bence sen haklısın ve ona göre düzenlendi. Bu cevabı hazırlarken belgeleri çok dikkatli bir şekilde okudum , ancak muhtemelen bunu kafam karıştı. Sadece bir şekilde ve sonra diğerini test ederdim, ama şu anda test etmek için uygun bir şeyim yok.
Ricket

7

Yapamazsın. Her türlü dijital verinin doğası, bilgi kaldırıldıktan sonra asla geri konulamayacağı ve benzer şekilde ilk etapta hiç bulunmayan bilgileri dolduramayacağınızdır - yapabileceğiniz en iyi şey kaba bir yaklaşımdır, Bu da size bulanıklık verir.

GL_NEAREST kullanımı bulanıklaşmaz, bunun yerine piksel haline gelir.

Çözüm, mipmap'larla daha büyük bir doku kullanmaktır. Bu şekilde, dokulu geometrinin boyutu ne olursa olsun kaliteli olursunuz.


2
adorablepuppy, ondan " Minecraft'ta olduğu gibi" dediğim gibi pikselli efekti arıyordu - ama güzel bir yakalama. Bu şekilde sorulmasını bile düşünmedim.
Ricket

Girişiniz için de teşekkür ederim. Birkaç farklı oluşturma stilini birlikte karıştıracağım için buna ihtiyacım olacak.
güzel

Soru şu: Neden dokuyu birden çok kez üst üste koyamıyorsunuz?
joehot200

2

Bu sorunu ilk elden yaşadım - düşük çözünürlüklü (8px * 8px) dokularla blok tabanlı bir oyun yapmak. Kamera ne kadar yakın ya da ne kadar uzak olursa olsun, dokular OpenGL'nin varsayılan ayarları tarafından "harmanlanıyor" - bulanık görünüyorlardı.

Bilineer filtrelemeyi devre dışı bırakmak için "en yakın" büyütmeyi etkinleştirmeniz gerekir. Yani, kamera dokuya yakınlaştırıldığında; her piksel, en yakın olan pikselin rengi olarak tanımlanır - karıştırma yapılmaz.

Bunu şu iki çizgi ile yaparsınız:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.