JOGL - Textur auf Quad verzerrt

Xoric

Mitglied
Hallo,

ich hab ein für mich unerklärliches Problem beim Zeichnen von Quads mit Texturen. Ich komm leider auch mit Google nicht weiter, da ich nicht weiß wonach ich hier suchen sollte. Mein Post ist etwas lang geworden, obwohl ich versucht habe nur das wesentliche zusammenzusfassen.


Mein Ziel:
Ich möchte mithilfe einer Font-Textur Text auf den Bildschirm ausgeben. Die Textur sieht so aus:

fontx.jpg


Eine Funktion liefert mir ein Rechteck bestehend aus floats (x1, y1, x2, y2), das den Koordinaten des jeweiligen Buchstaben entspricht (z.B. getRect(0) = {0.0f, 0.0f, 0.2f, 0.08333f} für das 'A').

Diesen Texturausschnitt zeichne ich jetzt mit einem Quad auf den Bildschirm.


Wenn ich ein 'A' zeichne:

funktioniert das wunderbar. Hier ist ein Screenshot meines Fensters und unten mein Code.

onlya.jpg


Java:
	public void init(GLAutoDrawable drawable)
	{
		// enable textures
		GL2 gl = drawable.getGL().getGL2();
		gl.glEnable(GL.GL_TEXTURE_2D);

		// Orthographic projection mode for 2D (Resolution 640x480)
		gl.glMatrixMode(GL2.GL_PROJECTION);
		gl.glLoadIdentity();
		gl.glOrtho(0, 640, 480, 0, 0, 1);
	}

	public void display(GLAutoDrawable drawable)
	{
		GL2 gl = drawable.getGL().getGL2();
		fontTexture().bind();

		// Zeichne ein 'A'
		FloatRect posA = new FloatRect(100.0f, 100.0f, 150.0f, 150.0f); // Position für das Quad auf dem Fenster (x1, y1, x2, y2)
		FloatRect texA = new FloatRect(0.0f, 0.0f, 0.2f, 0.08333f); // Texturkoordinaten für das 'A'
		
		gl.glBegin(GL2.GL_QUADS);
		{
			gl.glVertex3f(posA.x1, posA.y1, 0.0f);
			gl.glTexCoord2f(texA.x2, texA.y1);
					
			gl.glVertex3f(posA.x2, posA.y1, 0.0f);
			gl.glTexCoord2f(texA.x2, texA.y2);
					
			gl.glVertex3f(posA.x2, posA.y2, 0.0f);
			gl.glTexCoord2f(texA.x1, texA.y2);
					
			gl.glVertex3f(posA.x1, posA.y2, 0.0f);
			gl.glTexCoord2f(texA.x1, texA.y1);

		}
		gl.glEnd();	
	}


Wenn ich ein 'B' zeichne:

Auch für das 'B' klappt es problemlos.

onlybg.jpg


Java:
	public void display(GLAutoDrawable drawable)
	{
		GL2 gl = drawable.getGL().getGL2();
		fontTexture().bind();

		// Zeichne ein 'B'
		FloatRect posB = new FloatRect(200.0f, 100.0f, 250.0f, 150.0f); // Position für das Quad auf dem Fenster
		FloatRect texB = new FloatRect(0.2f, 0.0f, 0.4f, 0.08333f); // Texturkoordinaten für das 'B'
		
		gl.glBegin(GL2.GL_QUADS);
		{
			gl.glVertex3f(posB.x1, posB.y1, 0.0f);
			gl.glTexCoord2f(texB.x2, texB.y1);
					
			gl.glVertex3f(posB.x2, posB.y1, 0.0f);
			gl.glTexCoord2f(texB.x2, texB.y2);
					
			gl.glVertex3f(posB.x2, posB.y2, 0.0f);
			gl.glTexCoord2f(texB.x1, texB.y2);
					
			gl.glVertex3f(posB.x1, posB.y2, 0.0f);
			gl.glTexCoord2f(texB.x1, texB.y1);

		}
		gl.glEnd();	
	}


Mein Problem:

Auch wenn ich mehrere 'A' oder mehrere 'B' oder jeden beliebigen anderen Buchstaben mehrmals irgendwohin auf den Bildschirm zeichne, klappt alles einwandfrei. Das Problem tritt jetzt auf, sobald ich zwei verschiedene Buchstaben zeichnen will. Ich verwende dabei exakt den gleichen Code wie oben, nur beide Aufrufe kombiniert in einem Methodenaufruf.

Java:
	public void display(GLAutoDrawable drawable)
	{
		GL2 gl = drawable.getGL().getGL2();
		fontTexture().bind();

		// Zeichne zuerst ein 'A'
		FloatRect posA = new FloatRect(100.0f, 100.0f, 150.0f, 150.0f); // Position für das Quad auf dem Fenster
		FloatRect texA = new FloatRect(0.0f, 0.0f, 0.2f, 0.08333f); // Texturkoordinaten für das 'A'
		
		gl.glBegin(GL2.GL_QUADS);
		{
			gl.glVertex3f(posA.x1, posA.y1, 0.0f);
			gl.glTexCoord2f(texA.x2, texA.y1);
					
			gl.glVertex3f(posA.x2, posA.y1, 0.0f);
			gl.glTexCoord2f(texA.x2, texA.y2);
					
			gl.glVertex3f(posA.x2, posA.y2, 0.0f);
			gl.glTexCoord2f(texA.x1, texA.y2);
					
			gl.glVertex3f(posA.x1, posA.y2, 0.0f);
			gl.glTexCoord2f(texA.x1, texA.y1);

		}
		gl.glEnd();	

		// Zeichne ein 'B'
		FloatRect posB = new FloatRect(200.0f, 100.0f, 250.0f, 150.0f); // Position für das Quad auf dem Fenster
		FloatRect texB = new FloatRect(0.2f, 0.0f, 0.4f, 0.08333f); // Texturkoordinaten für das 'B'
		
		gl.glBegin(GL2.GL_QUADS);
		{
			gl.glVertex3f(posB.x1, posB.y1, 0.0f);
			gl.glTexCoord2f(texB.x2, texB.y1);
					
			gl.glVertex3f(posB.x2, posB.y1, 0.0f);
			gl.glTexCoord2f(texB.x2, texB.y2);
					
			gl.glVertex3f(posB.x2, posB.y2, 0.0f);
			gl.glTexCoord2f(texB.x1, texB.y2);
					
			gl.glVertex3f(posB.x1, posB.y2, 0.0f);
			gl.glTexCoord2f(texB.x1, texB.y1);

		}
		gl.glEnd();	
	}

Das Ergebnis ist jetzt auf einmal:

bothab.jpg



Ich verwende dabei die gleichen Koordinaten für die Textur wie oben (wo es geklappt hat).

Kann sich das vielleicht jemand erklären und mir einen Tipp geben, was ich falsch mache?
Vielen herzlichen Dank für eure Hilfe und eure Zeit!

Gruß und schönen Sonntag,
Xoric
 
Zuletzt bearbeitet:
Moin,

ohne das jetzt im Detail nachvollzogen zu haben, aber die mit glTexCoord übergebenen Texturkoordinaten beziehen sich immer auf den nächsten Aufruf von glVertex. Das heißt, glTexCoord muss immer vor glVertex aufgerufen werden.

Hier gibt es auch einen älteren Thread der sich mit der Darstellung von Text beschäftigt. Das Beispiel da ist mit Shadern gelöst. Auf der nächsten Seite gibt es das Beispiel auch ohne Shader.

Gruß,
Fancy
 
Hallo Fancy,

auf die Idee bin ich nicht gekommen, aber das war auch schon der ganze Fehler! Den Code hatte ich aus einem Tutorial übernommen, in dem wohl fälschlicherweise zuerst die Vertexkoordinaten und dann erst die Texturkoordinaten gesetzt wurden. Jetzt klappt alles!

fixedi.jpg


Java:
		gl.glBegin(GL2.GL_QUADS);
		{
			gl.glTexCoord2f(texB.x1, texB.y1);
			gl.glVertex3f(posB.x1, posB.y1, 0.0f);
			
			gl.glTexCoord2f(texB.x2, texB.y1);
			gl.glVertex3f(posB.x2, posB.y1, 0.0f);
			
			gl.glTexCoord2f(texB.x2, texB.y2);
			gl.glVertex3f(posB.x2, posB.y2, 0.0f);
			
			gl.glTexCoord2f(texB.x1, texB.y2);
			gl.glVertex3f(posB.x1, posB.y2, 0.0f);
		}
		gl.glEnd();

Vielen herzlichen Dank für deine Antwort!
Gruß Xoric
 

Zurück
Oben