<aside> 💡
HLSL 은 행렬이 column major 이기 때문에
mul ( Vector, Matrix ) 형태의 연산이 이루어졌어야했는데
mul ( Matrix, Vector ) 형태의 연산을 해서 문제가 발생하였다.
</aside>
<aside> 💡
먼저 C++ 상에서 HLSL 로 상수버퍼 값이나 텍스쳐들이 내가 의도한 대로 전달되는지부터 점검하였는데 문제가 없었다.
PIX 로 쉐이더 코드 디버깅을 하여 알게 된 것은, 행렬곱셈 연산 이후 W 값이 0이 되어 나눗셈이 이루어지는 부분에서 값이 NaN 이 된 것을 확인하였고, 행렬연산자체가 잘못되었음을 알게되었다.
이전 Frames in Flight 도입전에는 ShadowMap 이 잘 동작했었기에, 당연히 행렬연산에는 문제가 없을 것이라 생각하여서 문제를 찾는데 시간이 소요되었다.
사실 쉐이더 코드 디버깅할 때 행렬연산을 직접 해보았으면 더 빠르게 버그를 찾았을텐데, 행렬연산이 잘 이루어지는구나 하고 명령어만 보고 넘어가서 문제해결에 더 많은 시간이 소요되었다. </aside>
<aside> 💡
아마 이전에는 Transpose를 실수로 한 번 더 해서
Row-major 행렬로 전달된 것으로 보인다.
즉, 행렬을 Shader로 전달할 때 실수 1번, 행렬연산할 때 실수 1번
이런식으로 우연히 2번 실수하여 잘 동작이 된 것이다.
Frame Resource 소스코드들을 도입하면서, 소스코드들을 수정했는데 이 과정에서 잘못된 HLSL 코드는 그대로두고, C++ 부분은 Transpose를 2번이 아닌 한 번만 하게 되면서 문제가 발생한 것이다. </aside>
std::unique_ptr<UploadBuffer<CB_ShadowMapViewProj>> cbShadowViewProj; // 1
struct CB_ShadowMapViewProj {
XMFLOAT4X4 ShadowMapViewProj[MAX_SHADOW_DSV_COUNT];
};