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);
}
}
}
GL_TEXTURE_MIN
und hinzugefügtGL_TEXTURE_MAG
, um Code zu rendern. Funktioniert wie erwartet. Jetzt möchte ich mehr erfahren.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.
quelle
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:
quelle