Hi,
hier nun das versprochene Tutorial zum Texturieren von Flächen, Objekten etc...
Zuersteinmal für die, die es nochnicht getan haben: Bitte einmal die OpenGL12.pas + Textures.pas hier herunterladen.
www.koshigaya.de/Download/OpenGL.zip
Fangen wir also an..
Im ersten Tutorial (OpenGL - Einführung) hatte ich die Texturierung von Objekten ja schon kurz angesprochen, wiederhole es aber hier trotzdem nochmal
Also, zuersteinmal binden wir wieder die "Textures" Unit in unser Projekt ein und erstellen uns eine Variable Tex vom typ TTextur.
Quelltext
In der Initialisierung (In der Procedure InitGL) erstellen wir die Textur, und aktivieren das Texturieren von Objekten:
Quelltext
1: 2:
| Tex:=TTextur.Create('C:\OpenGL\Texturen\...\Textur.bmp'); glEnable(GL_TEXTURE_2D); |
Soweit müßte ja alles klar sein
Nehmen wir uns als Beispiel mal ein normales Quadrat welches wir Texturieren wollen:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Tex.Bind; glBegin(GL_QUADS); glTexCoord2f(1,0); glVertex3f(5,-5,0); glTexCoord2f(1,1); glVertex3f(5,5,0); glTexCoord2f(0,1); glVertex3f(-5,5,0); glTexCoord2f(0,0); glVertex3f(-5,-5,0); glEnd; |
Mit
Tex.Bind sagen wir OpenGL das wir ab jetzt diese Textur benutzen möchten.
Schauen wir uns nun das Quad an. Es besteht aus 4 normalen Koordinaten (glVertex3f), welche klar sein sollten, und aus 4 TexturKoordinaten (glTexCoord2f).
Mit der TexturKoordinate weisen wir jedem Vertex (Vertex nennen sich die Eckpunkte eines Objektes) zu, welchen teil unserer Textur wir an dem Vertex anzeigen möchten.
Bei unserer Textur sehen die Koordinaten so aus:
X Y
0,0 = Links unten
0,1 = Links oben
1,0 = Rechts unten
1,1 = Rechts oben
Wenn wir also einem Vertex die Texturkoordinaten glTexCoord2f(0,1) zuweisen würden, würde hier die obere linke ecke unserer Textur dargestellt werden.
Das ist leider sehr schlecht zu erklären, besser ihr schaut es euch an ein paar beispielen mal an
Mal ein kleines Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Tex.Bind; glBegin(GL_QUADS); glTexCoord2f(1,0); glVertex3f(5,-5,0); glTexCoord2f(1,1); glVertex3f(5,5,0); glTexCoord2f(0,1); glVertex3f(-5,5,0); glTexCoord2f(0,0); glVertex3f(-5,-5,0); glEnd; |
Auf diesem Quad wird die Textur ganz normal, korrekt angezeigt.
Wenn wir jetzt aber die X-Koordinaten der Textur austauschen..:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Tex.Bind; glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(5,-5,0); glTexCoord2f(0,1); glVertex3f(5,5,0); glTexCoord2f(1,1); glVertex3f(-5,5,0); glTexCoord2f(1,0); glVertex3f(-5,-5,0); glEnd; |
wird unsere Textur einmal umgedreht...
Würden wir jetzt die Y-Koordinaten auchnoch vertauschen, stände unsere Textur auf dem Kopf.
Soo... jetzt gibt es z.B. mal den fall das man eine große fläche mit einer Textur kacheln will... also ein und dieselbe Textur ganz oft nebeneinander..
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Tex.Bind; glBegin(GL_QUADS); glTexCoord2f(5,0); glVertex3f(5,-5,0); glTexCoord2f(5,5); glVertex3f(5,5,0); glTexCoord2f(0,5); glVertex3f(-5,5,0); glTexCoord2f(0,0); glVertex3f(-5,-5,0); glEnd; |
Hiermit würden wir die Textur 5mal nebeneinander/übereinander anzeigen auf unserem Quad.
genauso funktioniert es, wenn man vieleicht nur einen kleinen Ausschnitt der Textur haben möchte:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Tex.Bind; glBegin(GL_QUADS); glTexCoord2f(0.5,0); glVertex3f(5,-5,0); glTexCoord2f(0.5,0.5); glVertex3f(5,5,0); glTexCoord2f(0,0.5); glVertex3f(-5,5,0); glTexCoord2f(0,0); glVertex3f(-5,-5,0); glEnd; |
Würde zum beispiel nur 1/4tel unserer Textur auf dem Quad anzeigen..
und mehr gibt es bei Texturen eigentlich auch nicht zu beachten...
Wie gesagt, das lässt sich sehr schwer beschreiben, deswegen würde ich sagen probiert einfach ein wenig herum, und wenn fragen offen sind... einfach fragen
Au'revoir,
Aya~