<aside> 💡

문제 원인

Backface 판단은 Normal 벡터를 기준으로 하는 것이 아닌 Mesh를 구성하는 삼각형의 인덱스에 의해 결정된다.

이번 문제는 인덱스 방향을 반대로 하여 Mesh의 앞뒤가 바뀐 것이 문제였다. DirectX 는 인덱스를 시계방향으로 설정해야 앞면으로 판단한다.

해당 문제가 발생한 이유는 OpenGL 로 되어있는 소스코드를 활용하다보니 발생한 것이다.

DirectX 와 OpenGL은 인덱스 구성방향이 반대이기 때문이다.

</aside>

<aside> 💡

문제 해결 과정

1. 먼저 쉐이더변수값을 시각화하여 디버깅

2. N dot V 의 결과가 어떻게 나오는지 시각적으로 디버깅

3. N 또는 V에 문제가 있을 것이라 판단하여 - N dot V 확인

4. PIX로 가서 값을 확인

5. 다시 한 번 더 PIX 의 레지스터값을 점검하니 이상한점이 있었다.

6. 위의 상황을 놓고 고민해보니 원인을 알 수 있었다.

노멀벡터를 2가지 방법으로 시각화

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 시각화

RGB 색상값을 통해 Normal 시각화

기하쉐이더에서 Normal 방향으로 선분을 만들어서 디버깅

기하 쉐이더를 통해 Normal 시각화

기하 쉐이더를 통해 Normal 시각화