다음은 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)
Rasterization: a Practical Implementation Visibility Problem the Depth Buffer Algorithm and Depth Interpolation (0) | 2022.03.15 |
---|---|
Rasterization: a Practical Implementation The Rasterization Stage (0) | 2022.03.09 |
Rasterization: a Practical Implementation Rasterization Algorithm Overview (0) | 2022.03.07 |
Visibility problem (0) | 2022.03.06 |
Perspective projection (0) | 2022.03.04 |
댓글 영역