월드 좌표를 스크린좌표로 투영 할 때 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 에서 내부적으로 자동으로 처리해준다.
