<aside> 💡
Backface 판단은 Normal 벡터를 기준으로 하는 것이 아닌 Mesh를 구성하는 삼각형의 인덱스에 의해 결정된다.
이번 문제는 인덱스 방향을 반대로 하여 Mesh의 앞뒤가 바뀐 것이 문제였다. DirectX 는 인덱스를 시계방향으로 설정해야 앞면으로 판단한다.
해당 문제가 발생한 이유는 OpenGL 로 되어있는 소스코드를 활용하다보니 발생한 것이다.
DirectX 와 OpenGL은 인덱스 구성방향이 반대이기 때문이다.
</aside>
<aside> 💡
상황을 정리하면 아래와 같다.
이를 통해 결론내릴 수 있는 것은
최종화면에 구의 앞면이 아닌 구의 뒷면을 렌더링하고 있었던 것이었다.
DirectX 는 기본적으로 Cull Back 옵션을 켜면 Back Face Culling 을 수행해주는데, 앞면을 뒷면이라 판단하고 Culling을 해버린 것이다. 반대로 뒷면은 앞면이라 판단하고 Culling 을 하지 않은 것이다.
DirectX 는 Mesh 를 구성하는 인덱스순서를 기준으로 앞면과 뒷면을 판단한다.
구 Mesh를 생성할 때 Index 순서를 반시계방향으로 설정하여 앞면 뒷면을 잘못 판단하게 된 것이다. </aside>
먼저 각 변수값들이 차례차례 올바른지 테스트해볼 필요가 있었다.
float4 PSMain(VSOutput input) : SV_Target
{
// 월드 공간 법선
float3 N = normalize(input.normalWorld);
if (HasMap(USE_NORMAL_MAP))
{
float3 tangentNormal = SampleNormal(input.uv);
float3 T = normalize(input.tangentWorld);
float3 B = normalize(cross(input.normalWorld, T));
N = normalize(mul(tangentNormal, TBNMatrix(T, B, input.normalWorld)));
}
// [-1,1] 범위의 N 을 [0,1] 범위로 리매핑
float3 color = N * 0.5f + 0.5f;
return float4(color, 1.0f);
}
RGB 색상값을 통해 Normal 시각화
기하 쉐이더를 통해 Normal 시각화