본문 바로가기

DX

원근 투영 실습

월드 좌표를 스크린좌표로 투영 할 때 scale 따라 바꾸어준다. 

// 원근투영(Perspective projection)
if (this->usePerspectiveProjection) {
    const float scale =
        distEyeToScreen / (this->distEyeToScreen + pointWorld.z);
    pointProj = vec2(pointWorld.x, pointWorld.y) * scale;
}

 

밑에 그림을 봤을 때 p 와 az 를 활용하여 scale 을 구한다.

 

 

DX 에서는 다른 방식으로 원근 투영을 구현한다. 지금은 최대한 간단한 방식

 

 

원근 투영 되었으나 왜곡이 생긴다. 

 

 

왜곡의 이유

아래 그림을 봤을 때 보간 값 p 와 투영 후 보간 값 p' 의 값이 다르다. 투영 후 계산된 스크린 좌표에서 Barycentric Coordinates 를 이용해 픽셀 값을 보간해서 결정하게 되면 p' 값이 나와 잘못된 계산이 된다. 따라서 보간에 대한 보정이 필요하다. 원근 투영에서는 이러한 문제가 생김.

 

 

아래 보정 식이다. 제타0,1,2 가 있는데 저건 그냥 위의 p + az 와 같다. 쉽게 말해 각 정점의 z 좌표에 따른 z 길이에 따른 보정을 진행한다.

 

코드로 표현하면 다음과 같다.

 w0 /= z0;
 w1 /= z1;
 w2 /= z2;
 const float sum = w0 + w1 + w2;

 w0 /= sum;
 w1 /= sum;
 w2 /= sum;

 

왜곡 수정 완료. 이러한 왜곡 수정 또한 dx 에서 내부적으로 자동으로 처리해준다.

 

 

 

 

 

 

'DX' 카테고리의 다른 글

조명 기초  (0) 2025.05.07
쉐이딩  (0) 2025.05.01
뒷면 제거  (0) 2025.04.30
쉐이더 개념  (0) 2025.04.30
깊이 버퍼  (0) 2025.04.30