Frage

Wie kann ich die Beleuchtung nur für eine der Texturen in diesem Multitxturing -Schema deaktivieren? Ich habe versucht, Gldisable (GL_Leuchten) und Glenable (GL_Leuchten) zu verwenden, aber es erinnert sich nicht an die Einstellungen, wenn ich das Quad rendere.

Hier ist der Code -Snippet:

glDisable(GL_LIGHTING);
glEnable(GL_BLEND);

glDisable(GL_TEXTURE_RECTANGLE_ARB);
glDisable(GL_TEXTURE_2D);

//------------------------
glActiveTextureARB(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP); // texture with black/white

//------------------------
glActiveTextureARB(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, MY_TEXTURE); // normal texture
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);

glColor4f(1, 1, 1, 1);

glBegin(GL_QUADS);
    glNormal3f(0,0,1);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 1.0f);
    glVertex3f(1.0f,  1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

glActiveTextureARB(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

Bearbeiten: Die Texturlade:

glGenTextures(1, &LIGHT_MAP);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

Seltsam ist, dass ich, wenn ich das Licht in der ersten Codezeile aktiviere, die Light_Map -Textur im Multitxturquad nicht sehen kann. Auch die Beleuchtung scheint dieses Quad überhaupt nicht zu beeinflussen, sondern funktioniert in anderen Quads (die nicht mehrsatz) in meiner App.

Jede Hilfe geschätzt.

War es hilfreich?

Lösung

Ihr erster Satz macht keinen Sinn. Die GL -Beleuchtung erfolgt auf dem Scheitelpunkt. Texturierung, sei es eine einzelne Textur oder Multitxte. passiert viel danach. Details:

Die Beleuchtung, die pro Scheitelpunkt berechnet wurde, wird in jedes Fragment interpoliert und dieser Wert wird in die Texturpipeline -Stufe 0 eingegeben.

Also ... die beleuchtete Farbe L kommt herein und wird mit der Textur in der Texturstufe 0 (Ihre Lichtkarte hier) gemäß der Texturumgebung von Stufe 0 kombiniert. Sie zeigen nicht, wie Sie die Texturumgebung für eingerichtet haben Texturphase 0, also kann ich Ihnen nicht sagen, wie es weitergehen wird.

Dann wird Ihre Ausgabe aus Stufe 0 (berechnet aus Beleuchtung und Textur 0) an die Eingabe der Texturstufe 1 gesendet (wobei Ihre "normale" Textur gebunden ist. Dies wird als diffuse Textur bezeichnet). Sie verwenden hier eine Kombination mit dem Mähdrescher sowohl für RGB als auch für Alpha, was nicht typisch für LightMapping ist: Sie sind Hinzufügen Ihre Beleuchtung+Lichtmap zur diffusen Farbe. Normalerweise möchten Sie sie multiplizieren (gl_Texture_env_mode = gl_modulat anstelle von gl_combine).

Außerdem haben Sie die Source0_Alpha und Source1_Alpha nicht festgelegt, daher bin ich mir nicht sicher, was Sie genau hinzufügen, um die Alpha -Ausgabe der Stufe 1 zu generieren.

Alles in allem würde ich empfehlen, zuerst genau das aufzuschreiben, was Sie wollen (als Mathematik), und versuchen, dies der GL -Multitxturing -Pipeline zuzuordnen.

Bearbeiten: Wenn Sie Ihre Kommentare folgen, erhalten Sie den Standardwert: Wenn Sie nicht Stufe 0 Texenv angeben, erhalten Sie den Standard:

GL_TEXTURE_ENV_MODE DEFAULT STEUGEN GL_MODULD UND GL_TEXTURE_ENV_COLOR DER DEG (0, 0, 0, 0).

Ihre Farbe von der Beleuchtung wird also mit Ihrer Lightmap moduliert (was möglicherweise sinnvoll ist, je nachdem, was Sie erreichen möchten). Das wird zu Ihrem Diffusen hinzugefügt (wo es, wie gesagt, wahrscheinlich stattdessen moduliert werden sollte).

Keines davon ändert sich das, was ich früher gesagt habe: Schreiben Sie genau auf, welche Mathematik Sie für Ihr Ergebnis möchten. Daraus können wir helfen, herauszufinden, welche Texturumgebung Sie möglicherweise benötigen. Aber Sie haben nicht gesagt, welches Ergebnis Sie erzielen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top