Hallo zusammen,
ich habe ein eventuell simples aber dennoch sehr seltsames Problem mit DirectX11.
Ich möchte die Normalen eines 3D Meshes transformieren, damit ich im Pixelshader die Beleuchtung berechnen kann. Eigentlich muss man dafür ja die transponierte inverse der Weltmatrix nutzen. Nun habe ich folgendes seltsames Phänomen:
Die Szenerie sieht exakt gleich aus, wenn ich die Normalen mittels der Weltmatrix oder der Transponierten Inversen transformiere. Ich nutze eigentlich eine eigene Math lib (aus dem ersten Teil von Foundations of Game Engine Development) habe jedoch zu Testzwecken die DirectXMath lib verwendet.
Code mit transponierter inverser
|
C-/C++-Quelltext
|
1
2
3
4
5
|
mWorld = TranslationMatrix(entity.pos) * RotationYMatrix(entity.rotation.y);
Matrix4 camMatrix = mCam->GetMatrix();
mPerObject.WVP = Transpose(mWorld) * camMatrix;
mPerObject.World = DirectX::XMMatrixInverse(nullptr, DirectX::XMMatrixTranslation(0, 0, 0) * DirectX::XMMatrixRotationY(TO_RAD(entity.rotation.y)));//Transpose(mWorld);
mPerObject.WorldInvTranspose = Transpose(Inverse(mWorld));
|
Code mit normaler Weltmatrix (da der Shader column-major arbeitet muss ich hier ja noch einmal transponieren)
|
C-/C++-Quelltext
|
1
2
3
4
5
|
mWorld = TranslationMatrix(entity.pos) * RotationYMatrix(entity.rotation.y);
Matrix4 camMatrix = mCam->GetMatrix();
mPerObject.WVP = Transpose(mWorld) * camMatrix;
mPerObject.World = DirectX::XMMatrixTranspose(DirectX::XMMatrixTranslation(0, 0, 0) * DirectX::XMMatrixRotationY(TO_RAD(entity.rotation.y)));//Transpose(mWorld);
mPerObject.WorldInvTranspose = Transpose(Inverse(mWorld));
|
VertexShader (PixelShader nutzt die Normalenvektoren ohne Veränderung)
|
HLSL-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
VS_OUTPUT VS(float4 inPos : POSITION, float3 normal : NORMAL, float2 tex : TEXCOORD)
{
VS_OUTPUT output;
output.Pos = mul(inPos, WVP);
output.WPos = mul(inPos, World);
output.Normal = mul(normal, World);
output.Normal = normalize(output.Normal);
output.Tex = tex;
return output;
}
|
Rendering mit Inverser
Rendering mit Weltmatrix
Ich hoffe mir kann jemand einen Anstoß geben was hier genau schief läuft
Viele Grüße,
Soaring