![]() |
[OpenGL] - Multitexturing + Texturprojektion
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:
Die Prozedure DrawQB:
//[...]
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);
Delphi-Quellcode:
Wie gesagt, mit nur einer Textur hat alles geklappt.
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; Danke im Voraus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz