Diffuser Shader - Normalen-Transformation?
Verfasst: 13.05.2012, 12:23
Hi,
ich habe wieder einmal ein - in euren Augen sicherlich triviales - Problem. Ich wollte jetzt Mal einen Lichtshader (zunächst per Vertex) erstellen, der einfach nur diffuses Licht nutzt. Dafür muss man ja einfach dot von dem Normalenvektor und der Lichtrichtung (direktional will ich) als Lichtintensität berechnen.
Laut einem Tutorial ( http://rbwhitaker.wikidot.com/diffuse-lighting-shader ) muss man den Normalenvektor vor der Berechnung jedoch mit der inversen (und transformierten) Worldmatrix multiplizieren. Das verstehe ich nicht ganz: Das bedeutet doch, dass der Normalenvektor sich im Worldspace befindet und dann zurück in den Objectspace gebracht wird
Aber wieso ist der Normalenvektor im Worldspace?
Sagen wir, wir gehen von einem Vertex direkt auf dem Kopf eines Modells auf, sodass der Normalenvektor (0,1,0) ist. Das ist für mich doch ein ganz eigener Space, nicht Mal Objectspace, die Position ist da schließlich nicht drin, es ist ja sowieso eine Richtung und gehört daher für mich nicht in die Überlegung von World/Objectspace. Wenn das Modell jetzt 100 nach rechtes bewegt wird (Worldspace), so ist der Normalenvektor doch trotzdem bei (0,1,0), wird also gar nicht beeinflusst von der Worldmatrix. Eine Rotation wäre schon wichtiger, weil sie das Modell umdreht, dann muss sich auch der Vektor ändern. Aber dann ist doch der Normalenvektor(Welt) != Normalenvektor(Object) * Worldmatrix, also macht doch auch die inverse Multiplikation keinen Sinn?
Und wieso Normal*WorldInverseTranspose? Ist das nicht gleich WorldInverse*Normal?
Wäre prima, wenn mir Mal wieder aus meiner Unwissenheit heraushelfen kann...
ich habe wieder einmal ein - in euren Augen sicherlich triviales - Problem. Ich wollte jetzt Mal einen Lichtshader (zunächst per Vertex) erstellen, der einfach nur diffuses Licht nutzt. Dafür muss man ja einfach dot von dem Normalenvektor und der Lichtrichtung (direktional will ich) als Lichtintensität berechnen.
Laut einem Tutorial ( http://rbwhitaker.wikidot.com/diffuse-lighting-shader ) muss man den Normalenvektor vor der Berechnung jedoch mit der inversen (und transformierten) Worldmatrix multiplizieren. Das verstehe ich nicht ganz: Das bedeutet doch, dass der Normalenvektor sich im Worldspace befindet und dann zurück in den Objectspace gebracht wird
Aber wieso ist der Normalenvektor im Worldspace?
Sagen wir, wir gehen von einem Vertex direkt auf dem Kopf eines Modells auf, sodass der Normalenvektor (0,1,0) ist. Das ist für mich doch ein ganz eigener Space, nicht Mal Objectspace, die Position ist da schließlich nicht drin, es ist ja sowieso eine Richtung und gehört daher für mich nicht in die Überlegung von World/Objectspace. Wenn das Modell jetzt 100 nach rechtes bewegt wird (Worldspace), so ist der Normalenvektor doch trotzdem bei (0,1,0), wird also gar nicht beeinflusst von der Worldmatrix. Eine Rotation wäre schon wichtiger, weil sie das Modell umdreht, dann muss sich auch der Vektor ändern. Aber dann ist doch der Normalenvektor(Welt) != Normalenvektor(Object) * Worldmatrix, also macht doch auch die inverse Multiplikation keinen Sinn?
Und wieso Normal*WorldInverseTranspose? Ist das nicht gleich WorldInverse*Normal?
Wäre prima, wenn mir Mal wieder aus meiner Unwissenheit heraushelfen kann...