그래픽스 - 렌더링 파이프라인

 렌더링 파이프라인 개요

렌더링 파이프라인은 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는데 필요한 단계들 전체를 뜻한다.























입력 조립기 단계

메모리에서 기하 자료(정점과 인덱스)를 읽어서 기하학적 기본도형(삼각형, 직선 등)을 조립한다. 정점(Vertex)은 두 변이 만나는 점이다. 그러나 Direct3D에서 정점은 이보다 훨씬 일반적이다. 점의 공간 위치 뿐만 아니라 노말 벡터, 텍스쳐 좌표, 법선 벡터 등의 정보를 담을 수 있다.

정점을 나타내는 구조체






정점

정점들은 정점 버퍼라고 하는 특별한 Direct3D 자료구조안에 담겨서 렌더링 파이프라인에 묶인다. 이 정점들은 3개씩 묶여 삼각형이 될 수 있고, 2개씩 묶여 선분이 될 수 있다. 이런 기본도형을 형성하는 방식을 기본도형 위상구조(primitive topology)이다. 

그림1






그림2



그림 3
그림2에서 CreateInputLayout함수를 호출하여 버텍스 레이아웃 생성
그림3에서 IASetPrimitiveTopology함수를 호출하여 삼각형 구조를 적용 













색인








하나의 3차원 물체를 형성하는 삼각형들은 다수의 정점을 공유한다. 왼쪽 그림에서 V0와 V2가 공유된다. 정점이 중복되면 메모리 요구량과 그래픽 연산이 증가 되게 될 것이다. 따라서 색인(index)를 사용하는 것이다. 정점 목록을 만들어 두고, 정점들을 어떤 순서로 사용해서 삼각형을 형성하는지를 색인들로 나열함으로써 지정하면된다.

정육면체 색인 예시













정점 셰이더

입력 조립기 단계에서 기본도형들을 조립한 후에는 정점들이 정점 셰이더 단계로 입력된다. 정점 셰이더는, 정점 하나당 한번 호출되는 함수로 보면된다. 정점셰이더의 함수는 각 정점에 대해 GPU에서 실행되기 때문에 아주 빠르다.

모델 공간과 월드 공간

3D 물체를 만들 때 기하구조를 월드 공간 좌표계를 기준으로 구축하는 것이 아니라 물체 자신의 모델 공간 기준으로 구축한다. 전자를 world space, 후자를 local space라고 부른다. local space기준 좌표를 world space좌표계로 변환하는 과정을 world transform이라고 부르고, 해당 변환 행렬을 world matrix라고 부른다. 이러한 world matrix를 만들기 위해서는 Scaling Matrix(크기 변환 행렬), Rotation Matrix(회전 행렬), Translation Matrix(이동 행렬)을 곱해 만들 수 있다(W = SRT)

world matrix 생성 코드(axis gizmo를 위해 공식을 변환하였음)



각 물체 정점은 local space에서 정의 되고,
world transform을 통해 world space로 변환 된다.





















카메라 공간

최종적으로 화면에 표시되는 것은 2차원 이미지이다. 그러기 위해 가상의 카메라를 배치시켜야 한다. 이러한 카메라가 바라보는 공간을 view space라고 부른다. 카메라는 원점에 놓여 z축을 바라본다 가정하여 계산한다. world space에서 view space로의 변환을 view transform이라고 부르고, 해당 변환 행렬을 view matrix라고 부른다. view matrix는 카메라의 world matrix의 역행렬을 이용해 구할 수 있다.

view matrix 공식







위 공식을 이용한 view matrix 소스 코드












투영과 동차 절단 공간

카메라를 서술하는 요소가 하나 더 있다. 카메라가 바라보는 공간 영역이다. 이 절두체 안의 3차원 기하구조를 투영하는 것이다. 이 투영(projection)이 하나의 소실점으로 수렴하는 방식으로 이루어져야한다. 원근 투영(perspective projection)이 밑에 그림에 있는 방식이다.

원근 투영(perspective projection) 절두체(frustum)












점 V가 점 V'로 투영됨









projection matrix







projection matrix 소스 코드






레스터화기 단계

1. NDC 변환

카메라 절두체를 벗어난 기하구조는 폐기되며, 절두체의 경계면과 교차하는 기하구조는 내부의 것만 남도록 잘라내야 한다. 절단 후 w에 저장된 값으로 좌표를 나누는 연산, 원근 나누기를 마치면 좌표계가 NDC좌표계로 변하게 된다. xy의 범위는[-1,1], z의 범위는[0,1]이 된다.

2. 뷰포트 변환

NDC공간의 정점들은 후면 버퍼의 한 직사각형 영역으로 변환한다. 그 직사각형 영역이 뷰포트이다. 이 변환을 마치면 x,y성분은 픽셀 단위의 값이 된다.

3. 후면 선별

하나의 삼각형에는 면이 두 개 있다. 두 면을 구분하기 위해 삼각형의 감긴 방향을 이용해 앞, 뒤를 구분할 수 있다. 카메라가 삼각형 앞쪽 면을 보고 있는 경우 front-facing, 뒤쪽 면을 보고 있는 경우 back-facing이라고 부른다.

4. 보간

뷰포트 변환을 거친 후에는 정점의 삼각형을 덮는 각 픽셀에 대해 보간해야한다. 정점 위치 뿐만 아니라 깊이, 노말, 텍스쳐 좌표도 보간해야한다.

삼각형 정점을 보간하여 p(s, t)를 구한다.











픽셀 셰이더 단계

픽셀 셰이더는 보간된 pixel fragment마다 실행된다. 픽셀 셰이더는 조명이나 반사, 그림자 효과를 수행하는 등의 좀 더 복잡한 형태까지 다양하다.

픽셀 셰이더 소스
여기서 조명, 그림자 효과를 직접 프로그래밍 할 수 있다.


















출력 병합기 단계

픽셀 셰이더가 생성한 픽셀 단편들은 출력 병합기 단계로 입력된다. 일부 픽셀들은 깊이나 스텐실 판정에 의해 기각된다, 혼합(blending)도 이 단계에서 일어난다.








댓글

이 블로그의 인기 게시물

Opencv - 감마 보정을 이용한 이미지의 대비 및 밝기 변경

게임 엔진 - Axis Gizmo