상세 컨텐츠

본문 제목

Rasterization: a Practical Implementation The projection stage

똑똑한 개발/컴퓨터 그래픽스

by 성댕쓰 2022. 3. 7. 22:48

본문

다음은 rasterization을 간단히 요약한 pseudo 코드이다.

// project v2
Vec3f v2screen; 
v2screen.x = near * v2camera.x / -v2camera.z; 
v2screen.y = near * v2camera.y / -v2camera.z; 
v2screen.z = -v2cam.z; 
 
Vec3f v1screen; 
v1screen.x = near * v1camera.x / -v1camera.z; 
v1screen.y = near * v1camera.y / -v1camera.z; 
v1screen.z = -v1camera.z; 
 
// If the two vertices have the same coordinates in the image then compare their z-coordinate
if (v1screen.x == v2screen.x && v1screen.y == v2screen.y && v1screen.z < v2screen.z) { 
    // if v1.z < v2.z then store v1 in frame-buffer
    .... 
}

near는 clipping 하기 위한 변수이다. perspective divide를 하고 z cordinate을 저장한다. z cordinate을 이용하여 visibility problem을 해결한다.

screen space 에 project 한 이후, NDC space로 remap한다. 보통 normalize convention은 [0, 1]의 범위로 값을 변환하는 것이다. 그러나 CG에서는 어떠한 (잘 모르는) 이유로 [-1, 1] 이 convention이다.

다음은 screen space x, y 좌표를 NDC space로 변환하는 공식 유도 과정이다.

x 좌표는 l(left)와 r(right) 사이에, y 좌표는 b(bottom)와 t(top)사이에 존재한다.

모든 변에 l을 뺀다.

r-l로 나눈다.

위 처럼 원래 식을 변형하여 원하는 식을 얻는다. 같은 방법으로 y좌표도 구할 수 있다.

 

이제 NDC space를 구했으니 [0, 1] 범위의 좌표로 변환하고 image width 또는 height를 곱하여 raster space를 구한다.

raster space에서 y 축은 NDC space와 반대방향이므로 처리에 주의한다.

float nearClippingPlane = 0.1; 
// point in camera space
Vec3f pCamera; 
worldToCamera.multVecMatrix(pWorld, pCamera); 
// convert to screen space
Vec2f pScreen; 
pScreen.x = nearClippingPlane * pCamera.x / -pCamera.z; 
pScreen.y = nearClippingPlane * pCamera.y / -pCamera.z; 
// now convert point from screen space to NDC space (in range [-1,1])
Vec2f pNDC; 
pNDC.x = 2 * pScreen.x / (r - l) - (r + l) / (r - l); 
pNDC.y = 2 * pScreen.y / (t - b) - (t + b) / (t - b); 
// convert to raster space and set point z-coordinate to -pCamera.z
Vec3f pRaster; 
pRaster.x = (pScreen.x + 1) / 2 * imageWidth; 
// in raster space y is down so invert direction
pRaster.y = (1 - pScreen.y) / 2 * imageHeight; 
// store the point camera space z-coordinate (as a positive value)
pRaster.z = -pCamera.z;

 

 

 

참조 : Rasterization: a Practical Implementation (The Projection Stage) (scratchapixel.com)

관련글 더보기

댓글 영역