Hallo zusammen,
ich habe diesmal eine Frage mathematischer Natur. Ich habe bisher meine Lichtberechnung im Tangent-Space vollzogen.
Dazu habe ich die nötigen Vektoren in den Tangent-Space gebracht.
Dies geht bekanntlich mit Hilfe der TBN Matrix:
|
HLSL-Quelltext
|
1
2
|
float3 binormal = cross(normal,tangent);
float3x3 tbnMat= float3x3(tangent, binormal, normal);
|
Anschließend berechne ich bspw. :
|
HLSL-Quelltext
|
1
|
lightDir = mul(tbnMat, lightDir);
|
Ich verwende CG (kein HLSL!), d.h. diese Funktion:
http://http.developer.nvidia.com/Cg/mul.html
Ich könnte also auch schreiben:
|
HLSL-Quelltext
|
1
2
3
|
lightDir.x = dot(tangent, lightDir);
lightDir.y = dot(binormal, lightDir);
lightDir.z = dot(normal, lightDir);
|
Nur um das bis hierher festzuhalten: Ich multipliziere die Matrix mit einem Spaltenvektor von rechts.
Nun muss ich aber aus Gründen meine Lichtberechnung ändern. Dafür möchte ich dir Normale aus der Map in den View-/Camera-Space überführen. Bisher war ich der Meinung, dass ich dafür einfach die Inverse der Matrix bilden müsste.
Ich habe aber jetzt schon öfters folgendes gesehn:
|
HLSL-Quelltext
|
1
2
3
4
|
float3 binormal = cross(normal,tangent); // Seien "normal" und "tangent" bereits im View-Space
float3x3 tbnMat= float3x3(tangent, binormal, normal);
texNormal = normalize(mul(texNormal,tbnMat)); // ich könnte auch schreiben: texNormal = normalize(mul(transpose(tbnMat),texNormal));
|
Ich multipliziere nun also meine Textur-Normale als Zeilenvektor von links mit der Matrix, bzw. von rechts mit der transponierten Matrix.
Ist die transponierte Matrix indem Fall identisch mit der Inversen oder warum wählt man diesen Weg?
Freue mich über Erklärungen.
Gruß Mark