Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
Delphi 7 Professional
|
[OpenGL] - Multitexturing + Texturprojektion
19. Aug 2006, 15:37
Hi.
Ich habe einen schönen Raum den ich via Multitexturing Standard-,Detail- und Lichttexturen verschönere.
Jetzt wollte ich auf diese Wand eine 4. Textur projezieren lassen.
Wie man das bei normalem Texturmapping macht weiß ich, aber wie macht man das bei Multitexturing?
Habe schon versucht die Projezierte Textur extra auf eine 4. Texturebene binden zu lassen, aber das geht wahrscheinlich deshalb nicht, da ich nicht weiß wie man OpenGL sagt auf welcher Ebene es automatisch Texturkoordinaten generieren soll.
Daher meine Frage: Wie kann ich eine Textur auf eine mit Multitexturing "tapezierte Wand" projezieren?
Hier der Code (ist fast identisch mit dem von delphigl.de, kommt daher):
Delphi-Quellcode:
//[...]
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);
// Erster Durchgang : Normale Szene zeichnen
// Texturenmatrix sichern und zurücksetzen
glMatrixMode(GL_TEXTURE);
glPushMatrix;
glLoadIdentity;
// In die Modelansicht wechseln und Szene mit aktivierter Beleuchtung und Texturen zeichnen
glMatrixMode(GL_MODELVIEW);
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
DrawQB(True);
glEnable(GL_TEXTURE_2D);
// Texturenmatrix (in der die Projektorperspektive gesichert wird) wieder zurückholen
glMatrixMode(GL_TEXTURE);
glPopMatrix;
glMatrixMode(GL_MODELVIEW);
glDisable(GL_LIGHTING);
// Texgen-Flächen setzen (werden mit der invertierten Modelansichtsmatrix multiplizert)
P := Vector4f(1,0,0,0); glTexGenfv(GL_S, GL_EYE_PLANE, @P);
P := Vector4f(0,1,0,0); glTexGenfv(GL_T, GL_EYE_PLANE, @P);
P := Vector4f(0,0,1,0); glTexGenfv(GL_R, GL_EYE_PLANE, @P);
P := Vector4f(0,0,0,1); glTexGenfv(GL_Q, GL_EYE_PLANE, @P);
// Automatische Texturkoordinatengeneration aktivieren
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_GEN_Q);
// Bleding aktivieren damit der Projektor nicht die komplette Szene überzeichnet
glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR, GL_ONE);
// In die Texturenmatrix wechseln und den Projektor ausrichten
glMatrixMode(GL_TEXTURE);
glPopMatrix;
glPushMatrix;
glBindTexture(GL_TEXTURE_2D, TextureBuffer[10].TextureID);
// Position und Ausrichtung des Projektors festlegen (So wie gedrückt)
glTranslatef(x/2, y/2, down/2);
// Szene mit projezierter Textur zeichnen
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D,0);
DrawQB(False);
glDisable(GL_BLEND);
Die Prozedure DrawQB:
Delphi-Quellcode:
procedure DrawQB(a:boolean);
begin
glActiveTexture(GL_TEXTURE0_ARB);
if a then
glBindTexture(GL_TEXTURE_2D,TextureBuffer[0].TextureID);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glActiveTexture(GL_TEXTURE1_ARB);
if a then
glBindTexture(GL_TEXTURE_2D,TextureBuffer[4].TextureID);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,0);
glVertex3f(-0.5,-0.5,0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,1);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,1);
glVertex3f(-0.5,0.5,0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,1);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,1);
glVertex3f(0.5,0.5,0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1,0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,0);
glVertex3f(0.5,-0.5,0);
glEnd();
end;
Wie gesagt, mit nur einer Textur hat alles geklappt.
Danke im Voraus.
Philipp F.
|