PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multitexturing und OpenGL Lighting?


Gnafoo
2003-08-10, 21:38:44
Ich habe da ein kleines OGL Multitexturing-Problem. Und zwar programmiere ich gerade einen
Terrain-Renderer und wollte die Texturen ineinander verblenden.
(wie hier beschrieben: http://www.delphi3d.net/articles/viewarticle.php?article=terraintex.htm)

Das ist soweit eigentlich auch kein Problem. (Habs bisher nur mit 2 Texturen gemacht)

Allerdings funktioniert das OGL Lighting nachher nur bei den Teilen, die die erste Textur verwenden.
Weiß jemand woran das liegt, bzw. was man dagegen tun kann ?

Das Multitexturing mache ich folgendermaßen: (nach Textur laden etc.)

glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_Texture[0]);

glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_Texture[1]);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);


Danach render ich das ganze Zeugs und benutze dabei glMaterialfv(GL_FRONT, GL_DIFFUSE, ...);
um den Alpha-Wert fürs verblenden zu setzen.

Ich hab ne Grafik angehängt, wo ich nen ziemlich direkten Übergang von Textur 1 auf Textur 2
hab (ich weiß sieht häßlich aus aber egal). Oben sieht man noch, wie der Hügel unterschiedlich
Schattert ist und unten ist alles gleich hell.

Vielleicht hab ich ja auch nur irgendwas falsch verstanden, weil ich vorher noch nie etwas mit
Multitexturing gemacht habe.

*gespanntaufantwortenwart* :)
cu DerTod2k

Xmas
2003-08-10, 23:22:49
Das ist recht einfach zu erklären. Versuche, die Combinerfunktion nachzuvollziehen und vergleiche sie mit dem, was du erreichen willst.

Du setzt erstmal nur das Texture Environment für TEXTURE1, das bedeutet das das Environment für TEXTURE0 die Default-Einstellung hat.
Diese ist als RGB-Operation MODULATE mit den Argumenten TEXTURE und PREVIOUS. PREVIOUS ist beim ersten Texture Stage aber gleich PRIMARY_COLOR, der Vertexfarbe, also dem Farbwert, der durch das Lighting berechnet wird.

Das Ergebnis des Texture Stage 0 ist also folgendes:
Textur 0 (RGB) * Primary (RGB)

Für Texture Stage 1 berechnest du folgendes:
Texture Stage 0 (RGB) * Primary (Alpha) + Textur 1 (RGB) * (1 - Primary (Alpha))

Insgesamt bedeutet das:
Textur 0 (RGB) * Primary (RGB) * Primary (Alpha) + Textur 1 (RGB) * (1 - Primary (Alpha))

Nun wird dir sicher auffallen, dass Primary (RGB), also die Lichtfarbe, auf das Endresultat gar keinen Einfluss hat, wenn Primary (Alpha) gleich Null ist.
Was du wirklich berechnen möchtest, ist erst die Grundfarbe des Terrains zu bestimmen, und dann den Einfluss des Lichts berechnen.

Also:
[Textur 0 (RGB) * Primary (Alpha) + Textur 1 (RGB) * (1 - Primary (Alpha))] * Primary (RGB)

Dummerweise ist diese Rechnung in 2 Texture Stages nicht möglich, du brauchst einen weiteren Stage.
Im ersten Stage: Modus: REPLACE, Source 0: TEXTURE
Im zweiten Stage: genau das was du schon da stehen hast
Im dritten Stage: Modus: MODULATE, Source 0: PREVIOUS, Source 1: PRIMARY_COLOR
Der dritte Stage braucht dabei keine Textur, muss aber enabled sein.

Gnafoo
2003-08-11, 11:01:20
Erstmal danke für die Antwort. Ich denke ich habs jetzt verstanden :).
Das einzige Problem: Meine alte Geforce 2 hat nur 2 Textureinheiten.
D.h. entweder ich muss mir was einfallen lassen, oder mal ein paar
Freunde fragen, ob nicht einer billig ne Graka abzugeben hat :D.

Im Moment stimmt das Ergebnis deswegen leider nicht.

Trotzdem thx
cu DerTod2k

ScottManDeath
2003-08-11, 11:54:45
oder du musst im ersten renderpass die texturen multiplizieren und in den framebuffer schreiben und in einem 2. pass dann mittels blending mit dem licht multiplizieren

oder du nutzt (für die geforce) die NV_register_combiners extension

Gnafoo
2003-08-11, 13:09:52
Original geschrieben von ScottManDeath
oder du musst im ersten renderpass die texturen multiplizieren und in den framebuffer schreiben und in einem 2. pass dann mittels blending mit dem licht multiplizieren

Was aber, wahrscheinlich recht langsam ist oder ?

Original geschrieben von ScottManDeath
oder du nutzt (für die geforce) die NV_register_combiners extension

Dann werd ich mich mal in der Richtung googlen gehen :)

cu
DerTod

Gnafoo
2003-08-11, 22:03:19
Danke für den Tipp mit der NV_register_combiners-Extension. Hat zwar ein bisschen gedauert, bis ich das Prinzip verstanden habe, aber jetzt geht alles. Sogar mit meiner guten alten Geforce2 :)

cu DerTod2k

ScottManDeath
2003-08-13, 16:54:23
it was a pleasure to serve ;)