Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Di 15.04.03 10:53 
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.

ausblenden Quelltext
1:
2:
var
  Tex: TTextur;


In der Initialisierung (In der Procedure InitGL) erstellen wir die Textur, und aktivieren das Texturieren von Objekten:

ausblenden 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:

ausblenden 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:

ausblenden 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..:

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

ausblenden 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:

ausblenden 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 :P

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
SammySan
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 15.04.03 11:20 
Danke, es hat mir zwar nicht geholfen, trotzdem aber sehr hilfreich

mein Problem war das ich was bei dem Karteneditor (den hab ich nur so auf die schnelle zusammengeschustert) falsch gemacht habe ... :roll:
Andi1982
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: Di 15.04.03 11:54 
Ok, also ich habs jetzt kapiert!

Ist gut dass du es anhand von 2 Beispielen klar gemacht hast! Dadurch wirds richtig nachvollziehbar!

Weiter so!

_________________
Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 22.05.05 16:35 
thread etwas veraltet aber thema schließlich immer aktuell :lol:, wie funktioniert das mit der opengl unit von delphi 6 ? die dglopengl.pas und andere wollen bei mir nich so richtig, und ich möchte die auch net unbedingt einbinden, TTextur gibts bei mir net, aber mit der opengl von d6 muss das doch auch irgendwie gehen, aber wie ? ich möchte meinem quader 6 verschiedene Texturen from a file loaden :D Wie geht das ohne opengl12.pas(ich hab die dglopengl.pas funzt aber nicht)/Textures.pas ?