Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

26.01.2010, 23:26

Problem mit Bump-Mapping [solved]

Hallo

Auf dem folgenden Screenshot sieht man die Szene mit Normalen im Worldspace als Farben gerendert:


(Link)


Man beachte den rot markierten Bereich, zum Vergleich mit dem nächsten Screenshot, der (mehr oder weniger) dieselbe Szene in Echtfarben gerendert zeigt:


(Link)


In diesem Screenshot erkennt man, dass die Beleuchtung unterhalb der roten Markierung korrekt ist, oberhalb der roten Markierung aber falsch. Es scheint fast so, als würden die Normalen ziemlich genau in der Mitte gespiegelt, was aber nicht der Fall ist, wie wir am ersten Screenshot gesehen haben: Die Normalen sind in Ordnung. Innerhalb der Markierung sehen wir unten-links die hellere Kante der Steine oben und die dunklere unten, oben-rechts aber genau umgekehrt.


(Link)


Auf diesem Screenshot sehen wir nun einen der herumschwirrenden Würfel stark vergrößert. Hier scheint die Beleuchtung komplett in Ordnung zu sein. Der einzige Unterschied zwischen dem Boden und den Würfeln ist eigentlich: Die Würfel ziehen genau in der Mitte zwischen Boden und Lichtquelle ihre Bahnen, der Boden hat etwas exotische Texturkoordinaten, was aber keine Rolle spielen dürfte, da die Normalen ja in Ordnung sind, wie wir gesehen haben. Am Shader-Code scheint es ja auch nicht zu liegen, da die Würfel korrekt beleuchtet werden? Und das ist genau der Moment, wo ich mir 'wtf' denke. Deshalb möchte ich trotzdem noch etwas auf den Shader-Code eingehen.

Ich führe alle Berechnungen im Worldspace durch. Der Term, der ein falsches Ergebnis liefert, ist dot( normal, light_direction ). Das weiß ich, da ich dessen Ergebnis auch mal gerendert habe. Da normal ebenfalls korrekt ist, wie wir inzwischen wissen, kann es ja eigentlich nur an light_direction liegen. Und das sorgt bei mir für die vollendete Verwirrung, denn die Werte dieses Vektors gerendert sehen ebenfalls sehr vernünftig aus:


(Link)


Nach oben hin steigt der Z-Anteil der light_direction-Vektoren, nach links hin der X-Anteil und nach unten hin der Y-Anteil. Z ist proportional zu blau, Y zu grün und X zu rot. Obwohl die Werte, wie gesagt, für mich gut ausschauen, hier noch kurz die Rechenvorschrift, mit der ich light_direction ermittele:

C-/C++-Quelltext

1
2
vec3 light_position = vec3( u_lightmvmatrix * vec4( u_lightposition, 1.0 ) );
vec3 light_direction = normalize( light_position - pixel_position );


Bei u_lightmvmatrix handelt es sich um eine Model-View-Matrix, mit der die Position u_lightposition des Punktlichtes transformiert wird.
Und pixel_position ist ein linear zwischen Vektoren interpolierter Wert, der im Grunde einfach durch die Vorschrift pixel_position = vec3( gl_ModelViewMatrix * gl_Vertex ); im Vertexshader definiert wird.

Übrigens: Wenn ich die Lichtquelle verschiebe, verschieben sich die Fehler 'mit'. Beispiel: Ich merke mir, wie die Steine genau unterhalb dem Lichtfleck gerendert werden, verschiebe die Lichtquelle dann nach unten, an den Steinen vorbei, so dass diese Steine nun oberhalb des Lichtfleckes liegen. Es werden aber immernoch dieselben ihrer Kanten hell bzw. dunkel beleuchtet, so als hätte die Lichtquelle ihre Position überhaupt nicht verändert. Ein Problem mit der Transformationsmatrix kommt mir hier aber nicht in den Sinn, da der Lichtfleck auf den Steinen unter der Lichtquelle sich ja definitiv bewegt hat:


(Link)


Achso, und die light_direction Werte verschieben sich auch wie man erwarten würde.

Wäre für jegliche Hilfe und Hinweise sehr dankbar ;)
<< an dieser Stelle ist eine Signatur verstorben >>

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

2

27.01.2010, 00:30

Uff... hab nun bald 20 Minuten drauf geschaut... und kann zumindest in den Vektorbildern keine groben Patzer entdecken.

vec3 light_direction = normalize( light_position - pixel_position );

Ist der Vektor vom Pixel zum Licht und nicht vom Licht zum Pixel, aber in Direct3D muss das so sein oder? :-)

LG
Alyx

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

27.01.2010, 00:36

Es handelt sich um OpenGL, aber trotzdem ist der Term korrekt, oder steh ich voll auf dem Schlauch?
<< an dieser Stelle ist eine Signatur verstorben >>

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

4

27.01.2010, 00:50

Ist schon spät und das Bett ruft, aber wenn du bis morgen Abend noch nichts hast, schließen wir uns mal kurz, hab da recht bewährtes Zeug, können ja dann mal schauen, wo der Haken liegt.

Gn8i
Alyx

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

27.01.2010, 11:25

Hab mir nochmal die Normalen angeschaut. Dabei ist mir Folgendes aufgefallen.


(Link)



(Link)


Auf den beiden Bildern sieht man die Normalen der rechten Seite der Würfel in einem starken Rotton, was richtig ist, die stark grünen (rechten) Kanten der Steinplattentextur auf dem Boden aber sind mir nicht rot genug, die unteren Kanten hingegegen zu rot und nicht blau genug.

Ich vermute deshalb nun, dass irgend etwas mit der Berechnung der Tangenten nicht stimmt. Was ich mir aber eigentlich nur schwer vorstellen kann, da ich die Texturkoordinaten entlang der Tangenten aufziehe (erste Texturachse entlang der Tangenten, zweite Texturachse senkrecht dazu). Werde dem jetzt nochmal genauer nachgehen.


EDIT: Gut, jetzt hab ich die Tangente an der zweiten Texturachse ausgerichtet, hatte zur Folge dass die Farben Rot und Grün auf dem Boden (siehe die beiden letzten Screenshots) sich jetzt vertauscht haben, aber das ändert nichts an meinem ursprünglichen Problem.
<< an dieser Stelle ist eine Signatur verstorben >>

6

27.01.2010, 11:40

Hat zwar mit deinem Problem nichts zu tun,
würde aber trotzdem gern wissen, warum die Framerates so niedrig sind. ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.01.2010, 11:41

Jo, die Tangenten wären das erste was ich mal kontrollieren würde. In dem Zusammenhang wär noch interessant was für "exotische Texturkoordinaten" das am Boden sind, denn die haben vielleicht keinen Einfluss auf die Normalen, wohl aber auf den Tangent Space.

Und dann verwirrt mich folgendes noch irgendwie:

Zitat

Bei u_lightmvmatrix handelt es sich um eine Model-View-Matrix, mit der die Position u_lightposition des Punktlichtes transformiert wird.
Und pixel_position ist ein linear zwischen Vektoren interpolierter Wert, der im Grunde einfach durch die Vorschrift pixel_position = vec3( gl_ModelViewMatrix * gl_Vertex ); im Vertexshader definiert wird.


Was genau hat da die Viewmatrix drin verloren, ich dachte du machst Worldspace Normalmapping!?

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

8

27.01.2010, 12:06

Zitat von »"TrikkieMikkie"«

Hat zwar mit deinem Problem nichts zu tun,
würde aber trotzdem gern wissen, warum die Framerates so niedrig sind. ;)


Ich vermute, weil mein Rechner schon etwa 7,5 Jahre alt ist, bis auf die Graka, die hab ich 2005 mal aufgerüstet gehabt.



Zitat von »"dot"«

Und dann verwirrt mich folgendes noch irgendwie:

Zitat

Bei u_lightmvmatrix handelt es sich um eine Model-View-Matrix, mit der die Position u_lightposition des Punktlichtes transformiert wird.
Und pixel_position ist ein linear zwischen Vektoren interpolierter Wert, der im Grunde einfach durch die Vorschrift pixel_position = vec3( gl_ModelViewMatrix * gl_Vertex ); im Vertexshader definiert wird.


Was genau hat da die Viewmatrix drin verloren, ich dachte du machst Worldspace Normalmapping!?


Möglicherweise war die Terminologie, die ich verwendet habe, etwas missverständlich: OpenGL hat ja eigentlich garkein Konzept von Worldspace oder Viewspace:

Zitat

OpenGL has no concept of "world space" or "camera space". There is only the matrix that all input is multiplied by.
(Quelle)

Also streng genommen führe ich die Berechnungen im Viewspace und nicht im Worldspace durch (wie ich heute Nacht noch behauptet habe :D ).
Aber in OpenGL gibt es keinen Unterschied zwischen den beiden.



Zu den Texturkoordinaten, diese sehen wie folgt aus:

Quellcode

1
2
3
4
( -100, -3,  100 ) -> ( 0 | 0 )
(  100, -3,  100 ) -> ( 28.2843 | -28.2843 )
(  100, -3, -100 ) -> ( 56.5685 | 0 )
( -100, -3, -100 ) -> ( 28.2843 | 28.2843 )


Die erste Texturachse verläuft also von einem Eckpunkt zum gegenüberliegenenden.
Die zweite Texturachse steht senkrecht zur ersten.

Die berechnete Tangente ist ( -0.707107 | 0 | 0.707107 ).


Hab das eben mal skizziert:


(Link)


Dabei ist mir aufgefallen, dass die Tangente in Wirklichkeit entlang der ersten Texturachse verläuft und nicht entlang der zweiten, wie ich eigentlich erwartet hätte.
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

27.01.2010, 12:33

Zitat von »"the[V«

oid"]Möglicherweise war die Terminologie, die ich verwendet habe, etwas missverständlich: OpenGL hat ja eigentlich garkein Konzept von Worldspace oder Viewspace


Naja nur weil es in OGL keine Funktionen gibt um die beiden einzeln zu setzen (was mir durchaus bekannt ist) bedeutet das ja noch lange nicht dass "das Konzept" dort nicht existiert. Vor allem da du Shader vewendest kannst du deine Matritzen ja sowieso basteln wie du grade lustig bist, deswegen zur Sicherheit meine Frage ;)

Zitat von »"the[V«

oid"]Also streng genommen führe ich die Berechnungen im Viewspace und nicht im Worldspace durch (wie ich heute Nacht noch behauptet habe :D ).


Ok, ist beides natürlich gleich gut solange die Normalen auch im selben Space sind (Wie transformierst du die genau, mit der Tangent und auch mit der ModelViewMatrix?)

Zitat von »"the[V«

oid"]Die berechnete Tangente ist ( -0.707107 | 0 | 0.707107 ).


Gut das schaut mal vernünftig aus (Ich geh mal davon aus dass die Tangente an allen vertices gleich ist, sollte sie an einer Ecke verkehrt rum sein würde das natürlich einiges erklären...). Und die Bitangente schaut auch immer in die richtige Richtung?


EDIT:

Zitat von »"the[V«

oid"]Dabei ist mir aufgefallen, dass die Tangente in Wirklichkeit entlang der ersten Texturachse verläuft und nicht entlang der zweiten, wie ich eigentlich erwartet hätte.


Das ist schon richtig, die Tangente sollte normal entlang der ersten laufen. Allerdings scheint mir deine Tangente in die verkehrte Richtung zu zeigen (was mir nicht gleich aufgefallen ist da ich immer wieder mal gerne auf die verkehrte z-Achse reinfall ;) )

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

10

27.01.2010, 15:39

Die Tangente ist an allen Vertices gleich, ja, hier das entsprechende Rendering:


(Link)


Der Farbwert ist ( 190, 159, 0 ), was ( 0.74, 0.62, 0 ) entspricht.
Der Z-Anteil ist negativ (Farbwert 90), weshalb wir hier die 0 sehen.
Die tatsächliche Tangente ist somit ( 0.74, 0.62, -0.35 ).

Das entsprechende Rendering der (skalierten) Texturkoordinaten:


(Link)


Scheint also wohl zu stimmen, die Tangente verläuft entlang der ersten Achse.
Das Rendering der Binormalen ergibt ebenfalls, dass die Werte überall gleich sind, nämlich ( -0.74, 0.62, -0.35 ).
Das sieht für meine Begriffe gut aus, entspricht der Tangenten mit umgekehrten X-Anteil, was Sinn macht.

Zur Berechnung der Binormalen und der Transformation Tangentspace zu Worldspace verwende ich:

C-/C++-Quelltext

1
2
vec3 binormal = cross( normal, tangent );
vec3 result = mat3( tangent, binormal, normal ) * vector;


Fällt dir dot (oder irgendwem sonst) etwas auf, was mir entgangen ist?



EDIT:

Zitat von »"the[V«

oid"]EDIT: Gut, jetzt hab ich die Tangente an der zweiten Texturachse ausgerichtet, hatte zur Folge dass die Farben Rot und Grün auf dem Boden (siehe die beiden letzten Screenshots) sich jetzt vertauscht haben, aber das ändert nichts an meinem ursprünglichen Problem.


Zitat von »"the[V«

oid"]Dabei ist mir aufgefallen, dass die Tangente in Wirklichkeit entlang der ersten Texturachse verläuft und nicht entlang der zweiten, wie ich eigentlich erwartet hätte.


Zitat von »"dot"«

Das ist schon richtig, die Tangente sollte normal entlang der ersten laufen.


Das scheint mir jetzt merkwürdig, aber ich glaube nicht, dass es irgendwas zur Sache tut (oder?)
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige