Rasterizer 단계
Rasterizer 단계는 아래와 같은 역할을 수행한다
Clipping
Clip Space에서 화면에 표시되는 영역을 벗어나는 부분을 제거하는 것을 의미한다
예를 들어,
t1은 버려지고
t2는 통과가 되고
t3는 View Frustrum에 걸쳐지면서 Clipping이 된다
Perspective division
homogeneous 좌표계인 Clip space 좌표를
Cartesian 좌표계로 바꾸는 작업을 의미한다
그 결과값을 NDC(normalized device coordinates)라고 한다
homogeneous 좌표계를 Cartesian 좌표계로 바꾸기 위해서는
w값인 -z로 나누게 된다
따라서,
w(-z)값이 크면, 나머지 x, y, z 값은 작아지고
w(-z)값이 작으면, 나머지 x, y, z 값은 커지면서 원근감이 표현된다
Back-face culling
카메라를 바라보지 않는 물체의 표면들을 잘라내는 작업을 의미한다
벡터의 내적을 통해 연산을 하는 것은 비효율적이기에
determinant를 통해 CCW/CW를 파악하고
CW의 표면은 잘라낸다
Face culling
항상 Back-face를 culling하는 것은 아니다
translucent(반투명한) 물체를 그리는 경우에는 culling을 하면 안 된다
예를 들어, 투명한 빈 구를 렌더링 하는 경우에
앞면이 뒷면을 통과하여 보이도록 하려면 어떤 면도 culling 하면 안 된다
cross-section view의 경우는 front face culling을 하면 된다
절단면을 보여줘야 하니 앞부분을 제거하는 것이다
OpenGL에서 face culling 옵션은
기본적으로 face culling을 하지 않는 GL_FALSE이다
face culling을 하려면,
glEnable(GL_CULL_FACE)를 통해 켜주고
glCullFace()를 통해 원하는 옵션에 맞게 작성해주어야 한다
glEnable(GL_CULL_FACE);// Face Culling 켜주기
glCullFace();// default 옵션은 GL_BACK
glCullFace(GL_FRONT);// 직접 옵션 지정
// 옵션에는 GL_FRONT, GL_BACK, CL_FRONT_AND_BACK 등이 있다
Viewport transform
해당 screen space의 해상도에 맞게 변환을 해주는 것을 의미한다
screen space의 해상도는 런타임 중에 계속 변경이 될 수 있고
단순히 창의 전체 해상도 뿐만 아니라
게임에서 맵을 보여주는 뷰포트와 시야를 보여주는 뷰포트로 구분되는 것처럼
다양한 뷰포트가 존재할 수 있다
변환하는 방법과 이를 통해 도출된 Viewport Matrix는 아래와 같다
OpenGL에서는 아래와 같은 함수를 통해 뷰포트 변환을 할 수 있고
minZ와 maxZ는 0.0과 1.0이 기본이고
특이한 상황이 아니라면 해당 값들은 수정하지 않는다
void glViewport(GLint minX, GLint minY, GLsizei w, GLsizei h);
void glDepthRangef(GLclampf minZ, GLclampf maxZ);// default: minZ 0.0, maxZ 1.0
Scan conversion
3개의 정점 사이에
fragment들의 data인 vertex attributes를 interpolation을 통해 생성하는 과정이다
여기서 vertex attributes에는 vertex pos를 제외한 나머지
normal, texcoord,... 등이 있다
이렇게 보간된 데이터들을 Fragment data라고 하고
추후 픽셀의 색을 결정하는 것은 Fragment shader에서 진행한다
interpolation을 하는 방법은
픽셀의 정 중앙을 기준으로
Bilinear Interpolation을 통해 각각 fragment의 vertex attributes를 계산한다
edge를 기준으로 한번
Scan Line을 기준으로 한번 하는 것이다
추가적으로, interpolation을 하면
normal 길이가 달라져서
추후 fragment shader에서 normalize를 진행한다
'게임 그래픽스 > [전북대] OpenGL' 카테고리의 다른 글
[OpenGL Note] Texture Wrapping과 Texture Filtering (0) | 2024.04.18 |
---|---|
[OpenGL Note] Image Texturing (0) | 2024.04.17 |
[OpenGL Note] Vertex Shader (0) | 2024.04.16 |
[OpenGL Note] Uniforms, VAO (0) | 2024.04.16 |
[OpenGL Note] Projection Transform (0) | 2024.04.15 |