primitive 안을 pixel로 나누고 각 pixel의 색상, texture coordinate 등을 결정하는 단계
💡 Introduction
Rasterizer Stage는 개별적인 primitive(예: 삼각형)를 샘플 영역 내의 커버리지에 기반하여 pixel 또는 fragment라고 불리는 2차원 이미지 요소로 분해하는 과정이다.
Rasterizer Stage에서는 primitive의 속성인 색상과 텍스처 좌표 등이 primitive를 구성하는 pixel에 대해 보간되어 전달된다. 이를 통해 화면에 primitive의 외형을 정확하게 표현할 수 있다.
Rasterizer 후, 결과적으로 생성된 pixel은 픽셀 셰이딩 및 블렌딩과 같은 그래픽 파이프라인의 추가 단계를 거쳐 최종적인 색상 및 기타 속성이 결정되며, 이후 화면에 표시된다.
앞서 VS에서 clip spapce position을 받아서 넘어왔다. Rasterizer에서는
- Primitive Clipping
- Perspective Division
- Viewport Transform
와 같은 일을 한다. Rasterizer는 미리 만들어둔 형태로 작동을 한다.
Triangle t2는 view frustrum안에 완전히 들어와 있다. t3는 clip 되었다.
Points
:
Lines
: 선이 잘리면 그 잘린 지점에 vertex를 하나 만들고 잘린 부분은 버리고 나머진 살리고
Triangles
: 잘린 부분의 vertex를 생성해 살리고
삼각형이 시야 볼륨에 클리핑되면, 클리핑 볼륨 경계에 있는 정점을 가진 적절한 삼각형이 생성된다.
clip space coordinate의 z값으로 모든 좌표계를 나누어 z 값이 1인
NDC(normalized device coordinates)
로 표현하는 것
NDC에서 만든 것을 screen space로 옮기기 위한 작업 이 필요하다
Viewport Transform
The ‘viewport transform’ transforms vertex positions from NDC space(Clip space) to window space(viewport)
앞서 Perspective Division을 통해 구한
Clip space(NDC)
→Viewport(window space)
로의 변환과정이다.
- 이 변환은 affine transform에 해당
- 아래 그림과 같이 scaling과 translation을 합친 형태의 Viewport Transform matrix를 통해 연산이 이루어 진다.
Viewport
Viewport는 쉽게 말해서 이제 모니터 속 공간(이지만 아직 3D)을 나타내는 공간이다. clip space는 보이는 물체를 솎아내고 Perspective Division를 통해 그에 맞는 원근을 표현했지만 이는 camera가 보는 시점에서의 기준이다. 이제 우리는 모니터의 비율에 맞게 공간에 clip space의 정보들을 맵핑하고자 한다. Viewport를 정의하는 변수로는 w, h, minX, minY, minZ, maxZ가 있다.
모니터를 full로 쓴다고 했을 때 식이 다음과 같이 간단해진다.
camera에서 보기에 3D object의 뒷면에 해당하는 부분 어차피 보이지 않는다. clip space를 만드는 view transform을 통해 View Frustum 밖의 object를 Culling 했듯, cost를 줄이기 위해 보이지 않는 object의 뒷면도 Culling 하고자 한다.
그렇다면 어떻게 컴퓨터가 object의 뒷면과 앞면을 구분할까? 답은 normal vector를 정의한 부분에서 알 수 있다. 이 Normal Vector의 방향이 object의 바깥쪽을 향하는 것이 원칙임을 이용한다.
💡
Back-face Culling
Primitives have a particular facing that is defined by the order of vertices.
- cost를 줄이기 위해 object에 뒷면에 있는 것은 지운다,
- nomal vecter의 회전 방향을 이용해 뒷면에 있는 것인지 판단한다.
- 이때
det
식을 활용한다.
primitives가 어떤 순서로 되어 있냐에 따라 face가 어디를 바라보고 있는지 결정이 된다.
n1은 거의 선으로 보이게 되나. 완전히 반대가 되면 back face로 렌더링을 안해준다. 요즘은 back face를 하는 추세이다. 복잡한 mesh들이 생겨나면서 back face를 그려주는게 편하다. 성능 아낄꺼면 렌더링 안하면 된다.
face culling은 back face에 해당하는 부분은 이후에 프로세싱을 진행하지 않겠다고 잘라주는 것이다.
det로 정점이 뒷면에 있는지 앞면에 있는지 판단할 수 있다.
xy plane으로 옮겨 왔을 때 font에 있는 vertex는 CW로 돌고 뒷면에 있는 버텍스는 CCW로 회전한다. 이렇게 CW로 회전하는 것은 물체를 정면에서 바라보았을 때다. 180도 뒤집어진 오브젝트의 뒷면에 해당하는 nomal vecter를 가지고 있으면 이는 뒷면이라는 것을 알 수 있다. (OpenGL은 이와 반대이니 유의)
별도의 과정 없이 빠르게 계산할 수 있다.
back face는 항상 culling되는 것은 아니며 옵션으로 설정할 수 있다.
The main role of rasterization stage is to convert vector information into a raster image.
primitive의 래스터화는 두 가지 부분으로 이루어져 있다
- 윈도우 좌표의 정수 그리드에서
primitive가 차지하는 사각형을 결정
하는 것- 각각의 그리드 사각형에
색상
과깊이값
을 할당하는 작업
위에서는 필요없는 것들을 버리는 작업을 했다. 이제 픽셀을 다루자!
Edge equation
을 이용해 삼각형 안에 있는 점인지 판단
2d 플레인을 두개로 나누어준다
주어진 라인을 기준으로 왼쪽인지 오른쪽인지 리턴해주는것이 edge equation 함수이다.
Edge equation tests on which side of this line a given point is.
2D
det가 양수냐 음수냐로 판단이 가능하다
3D
the magnitude of the cross products
cross product magnitude 구하는 것과 같다
cross products 의 magnitude는 마름모의넓이와 같다. - absin
→ sin이니 0-180은 양수를 180을 넘어가면 음수결과를 갖는다
삼각형(v0v1v2)과 겹치는 점(p)의 속성(색상, 깊이, 법선 등)은 삼각형의 정점의 속성을 보간하여 얻을 수 있다.
Barycentric coordinate 의 가중치(λ0, λ1, λ2)는 삼각형(T0, T1, T2)의 면적과 비례한다.
edge equation returns the area of parallelogram.
→ 넓이를 바로 구할 수가 있다. 성능이 좋다.
점이 두 삼각형 위에 있을 때 top부분에 먼저 assign 그다음 right left 순으로 assign
한 픽셀이 두 개의 삼각형에 공유되는 가장자리에 위치할 경우, 어느 삼각형에 속하는지 결정해야 한다. 그렇지 않으면 해당 픽셀이 두 번 처리될 수 있기 때문이다.
해당 포스트는 강형엽 교수님의 게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊