Graphics Techniques

[렌더링파이프라인] 구 Mapping의 원리

doyyy_0 2024. 12. 5. 11:08

구를 그릴 때, 실린더를 그리고 위 아래의 vertex를 붙이는 방법으로 그리는 법과, 정n면체를 그리고 subdivision을 통해 구를 그리는 방법이 있습니다. 실린더의 방법으로 그리고 subdivision을 하면 wireframe으로 봤을 때 삼각형의 크기가 균일하지 않습니다. 실린더의 삼각형들의 크기가 애초에 다 다른데, 그 상태에서 subdivision을 하기 때문입니다. 

 

하지만 정n면체는 각 삼각형의 크기가 모두 같기 때문에 삼각형의 크기가 균일하다는 장점이 있습니다. 하지만, 텍스춰링을 할 때 마지막 끝 vertex가 두개가 아니라 하나이기 때문에, 잘리는 현상이 발생합니다.

 

왜냐하면 마지막 끝 점을 두개로 나누지 않으면 마지막 삼각형에서 interpolation을 0~0.9..사이의 값을 적용해버리기 때문입니다. 다음 그림으로 이해해봅시다.

 

그렇다면 어떻게 문제를 해결할까요?

바로 vertex생성 시 텍스춰좌표를 넘겨주는게 아니라, 픽셀 쉐이더에서 texture좌표를 유추하는 것입니다. 그렇다면 픽쉘쉐이더에 변환 전 vertex의 위치를 넘겨줄 필요가 있겠죠? 픽쉘 쉐이더코드는 다음과 같습니다.

float4 main(PixelShaderInput input) : SV_TARGET
{
    float3 color = float3(0.0, 0.0, 0.0);
    

    const float theta = atan2(input.posModel.z, input.posModel.x);
    const float phi = acos(input.posModel.y / length(input.posModel));
    
    input.texcoord.x = theta / (2 * PI);
    input.texcoord.y = phi / PI;
    
    return useTexture ? float4(color, 1.0) * g_texture0.Sample(g_sampler, input.texcoord) : float4(color, 1.0);
}

이렇게 픽쉘을 이용해 texture좌표를 유추하면 잘리는 현상을 막을 수 있습니다

 

 

강의 출처 : 홍정모 그래픽스 새싹코스 part2 

https://honglab.co.kr/courses