Wie kann ich OpenGL-Texturen skalieren, ohne dass sie unscharf werden?

15

Ich benutze OpenGL durch LWJGL.

Ich habe ein 16x16 texturiertes Quad-Rendering bei 16x16. Wenn ich den Skalierungsbetrag ändere, wächst das Quad und wird mit zunehmender Größe unschärfer.

Wie kann ich es skalieren, ohne verschwommen zu werden, wie in Minecraft.

Hier ist der Code in meinem RenderableEntity-Objekt:

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();

}

Und hier ist Code aus meiner initGL-Methode in meiner Spielklasse

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);

Und hier ist der Code, der die eigentliche Zeichnung macht

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);
        }
    }
}
adorablepuppy
quelle

Antworten:

17

Sie müssen die Art der Texturvergrößerung folgendermaßen ändern:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Lesen Sie mehr über glTexParameter .

Ricket
quelle
Wäre es nicht die Vergrößerung, die er ändern möchte, da die Textur in einer vergrößerten Skala angezeigt wird?
Neverender
Danke für deine Antwort Ricket. Ich habe jetzt die Dokumentation zu glTexParameter gelesen und festgestellt, dass es hier viele Goodies gibt, mit denen ich arbeiten kann. Zusätzlich habe ich das GL_TEXTURE_MINund hinzugefügt GL_TEXTURE_MAG, um Code zu rendern. Funktioniert wie erwartet. Jetzt möchte ich mehr erfahren.
adorablepuppy
@ZachB, ich denke du hast recht und entsprechend bearbeitet. Ich habe die Dokumentation bei der Vorbereitung dieser Antwort sehr sorgfältig gelesen , mich aber wahrscheinlich nur verwirrt. Ich würde nur die eine und die andere Art testen, aber ich habe im Moment nichts Praktisches zum Testen.
Ricket
7

Das kannst du nicht. Die Natur digitaler Daten ist, dass einmal entfernte Informationen niemals zurückgegeben werden können, und Sie können auch keine Informationen eingeben, die noch nie vorhanden waren. Das Beste, was Sie tun können, ist eine grobe Annäherung. das gibt Ihnen Unschärfe.

Die Verwendung von GL_NEAREST wird nicht verwischen, sondern wird stattdessen pixelig.

Die Lösung besteht darin, eine größere Textur mit Mipmaps zu verwenden. Auf diese Weise erhalten Sie eine gute Qualität, unabhängig von der Größe der zu texturierenden Geometrie.

Maximus Minimus
quelle
2
adorablepuppy suchte den pixeligen Effekt, als ich von ihm sagte "wie in Minecraft " - aber schöner Fang. Ich habe nicht einmal daran gedacht, dass man mich so fragt.
Ricket
Vielen Dank auch für Ihren Beitrag. Ich brauche es, da ich einige verschiedene Rendering-Stile miteinander mischen werde.
adorablepuppy
Die Frage ist, warum du die Textur nicht mehrmals überlappen kannst.
Joehot200
2

Ich habe dieses Problem aus erster Hand erlebt - ein blockbasiertes Spiel mit niedrig auflösenden (8px * 8px) Texturen. Unabhängig davon, wie weit die Kamera entfernt war oder wie weit sie entfernt war, wurden die Texturen durch die Standardeinstellungen von OpenGL überlagert - sie wirkten verschwommen.

Sie müssen die nächstgelegene Vergrößerung aktivieren, um die bilineare Filterung zu deaktivieren. Das heißt, wenn die Kamera nahe an die Textur herangezoomt wird. Jedes Pixel ist als die Farbe des Texels definiert, das am nächsten ist - keine Überblendung.

Sie tun dies mit diesen beiden Zeilen:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Schaum
quelle