2010-12-27 5 views
4

Ich bin neu in OpenGL und versuche derzeit, einen Würfel mit vier Flächen, jede mit einer anderen Textur.LWJGL OpenGL Sprite Blatt

Wie Sie alle wissen, ist die Verwendung einer separaten Textur für jeden Gesichtstyp sehr speicherintensiv und verlangsamt die Anwendung.

Im Moment versuche ich ein Texturblatt für das Sprite zu verwenden. Ich habe die Grafikdatei mit jeder Textur 16x16 Pixel mit 256 Sprites in einem Quadrat (16x16) angeordnet.

Ich weiß, dass

GL11.glTexCoord2f(1.0f, 0.0f); 
GL11.glVertex3f(1.0f, 1.0f, 1.0f); 
GL11.glTexCoord2f(0.0f, 0.0f); 
GL11.glVertex3f(0.0f, 1.0f, 1.0f); 
GL11.glTexCoord2f(0.0f, 1.0f); 
GL11.glVertex3f(0.0f, 0.0f, 1.0f); 
GL11.glTexCoord2f(1.0f, 1.0f); 
GL11.glVertex3f(1.0f, 0.0f, 1.0f); 

gibt mir ein Rechteck mit dem ganzen Blatt Sprite so u und v von glTexCoord2fhaben als 1.0f weniger.

Was ich jetzt brauchen, ist eine Formel, die die u und v jeder Sprite-ID in der Textur berechnen wird.

Die IDs gehen wie folgt in der Textur Bitmap:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
17 18 16 20 21 22 23 24... 

und ich möchte eine u und v für jede dieser IDs haben. Das letzte bisschen ist nicht sehr gut erklärt, also werde ich es besser erklären, wenn Sie möchten.

Vielen Dank im Voraus!

Antwort

5

die Orte der Textur Sprites im Bild sind in einer 16 x 16-Anordnung, die Lage einer Textur (wenn man die ersten als 0 zählt) sind:

row = texNo/16; 
col = texNo % 16; 

Die Koordinaten sind dann:

u0 = row/16; 
u1 = (row + 1)/16; 

v0 = col/16; 
v1 = (col + 1)/16; 

dann 1.0f mit u1 oder v1 als angemessen und 0.0f mit u0 oder v0 im glTexCoord2Df ruft ersetzen.

+0

Das Problem, das ich jetzt habe, ist die ID, die von 0 unten links bis 15 oben links geht und so weiter. – s5d

+0

In diesem Fall sind die Werte für Zeile und Spalte wahrscheinlich: row = (16 - texNo)% 16; col = texNr/16; –

1

Die Sprite-Folie erstreckt sich von 0.13 in u und v. Wenn es 16x16 ist, dann sind die oberen linken Ecken bei , wo n, m von 0..15 reichen. Wenn Ihre Blätter alle 16x16 sind, können Sie Ihr Leben vereinfachen, indem die 1/16-Ausklammerung in die Textur-Matrix:

 glMatrixMode(GL_TEXTURE) 
     glLoadIdentity() 
     glScalef(1f/16f, 1f/16f, 1f) 

Dass Sie bei 0,0 ein Sprite lassen würde adressieren, 1,0, 2,0, usw. mit ganzen Zahlen wegen der Skalierung in der Matrix.

Ein weiterer Vorteil der Verwendung der Texturmatrix ist, dass Ihre Texturkoordinaten Ganzzahlen werden und Sie jetzt einen Integer-Typ in Ihrem Vertex-Array oder VBO verwenden können, um die Texturkoordinaten darzustellen.

+0

Wie wäre es mit anderen Texturen mit unterschiedlicher Breite/Höhe? – s5d

+0

Die absolute Breite/Höhe des Blattes spielt keine Rolle (es wird immer auf 1x1 UV-Einheiten abgebildet). Wenn Sie sagen, dass Sie Blätter mit verschiedenen Sprite-Matrizen haben (zB 2x2, 16x16, ...), können Sie immer für das beste skalieren. –