DirectX

6. 렌더링 파이프라인

Awesome Red Tomato 2021. 12. 23. 01:52

3차원 장면의 기하학적 서술과 가상 카메라의 위치 및 방향이 주어졌을 때 현재 가상 카메라에 비친 3차원 장면의 모습에 근거하여 2차원 이미지를 생성하는 데 필요한 일련의 단계들을 렌더링 파이프라인 이라고 한다.

1. 입력 조립기 단계(input assembler, IA)

입력 조립기 단계는 메모리에서 기하 자료(정점과 색인)를 읽어 기하학적 기본도형(primitive)을 조립한다.

 

정점(vertex)은 기본적으로 두 변이 만나는 점으로 선분의 양 끝 점을 말한다. Direct3D의 정점은 공간적 위치 이외의 정보도 담을 수 있다. 정점들은 정점 버퍼(vertex buffer)라고 하는 특별한 D3D 자료구조 안에 담겨서 렌더링 파이프라인에 묶인다. 하지만 이 정점들로만은 어떤 구조인지(선인지 삼각형인지)에 대한 정보는 없기에 기하학적 기본 도형을 D3D에 알려주려면 기본도형 위상구조(primitive topology)라는 것을 설정해야 한다.

https://docs.microsoft.com/en-us/windows/win32/api/d3dcommon/ne-d3dcommon-d3d_primitive_topology

 

D3D_PRIMITIVE_TOPOLOGY (d3dcommon.h) - Win32 apps

Values that indicate how the pipeline interprets vertex data that is bound to the input-assembler stage. These primitive topology values determine how the vertex data is rendered on screen.

docs.microsoft.com

 

3차원 물체의 기본 구축 요소는 삼각형이다. 예를 들어, 사각형 하나와 팔각형 하나를 만든다고 치면 필요한 정점은 아래와 같다.

Vertex quad[6] = {
	v0, v1, v2,		// 삼각형 0
 	v0, v2, v3		// 삼각형 1
};

Vertex octagon[24] = {
	v0, v1, v2,		// 삼각형 0 
	v0, v2, v3,		// 삼각형 1
	v0, v3, v4		// 삼각형 2
	v0, v4, v5,		// 삼각형 3
	v0, v5, v6,		// 삼각형 4
	v0, v6, v7,		// 삼각형 5
	v0, v7, v8,		// 삼각형 6
	v0, v8, v1		// 삼각형 7
}

 

(a) 삼각형 두 개로 만든 사각형 (b) 삼각형 여덟 개로 만든 팔각형

 

삼각형의 정점들을 지정하는 순서가 중요한데 이를 감기 순서(winding order)라고 부른다. 위와 같이 물체들의 삼각형 메시들은 여러 개의 정점을 공유하는데 정점들의 중복이 많아질수록 메모리의 요구량과, GPU의 처리량이 많아지기 때문에 바람직하지 않다. 그래서 나온것이 색인(index)이다.

 

색인 목록을 사용하면 정점을 중복하지 않아도 된다. 색인 목록은 어떤 정점들을 어떤 순서로 사용해서 삼각형을 형성해야 하는지를 나타내는 색인들로 이루어진다. 색인을 사용하면 사각형을 위한 정점은 네 개로 충분하다.

Vertex v[4] = {v0, v1, v2, v3};

UINT indexList[6] = 
{0, 1, 2,
 0, 2, 3};

별 다를게 없어 보이지만 차이는 정점은 (v.x, v.y, v.z) 세 점을 가진 하나의 구조체이지만 인덱스는 정수 한 개 이므로 훨씬 적은 양의 메모리를 차지하는 이점이 있다.

 

 

2. 정점 셰이더 단계(Vertex Shader)

IA에서 기본 도형을 조립한 후 정점 셰이더 단계로 넘겨준다. 정점 셰이더는 그냥 정점 하나를 받아 정점 하나를 출력하는 함수로 생각해도 된다. 화면에 그려질 모든 정점은 이 정점 셰이더 단계를 거친다. 개념적으로, 하드웨어 안에서 다음과 같은 일이 일어난다고 할 수 있다.

for(UINT i = 0; i < numVertices; ++i)
{
	ouputVertex[i] = VertexShader(inputVertex[i]);
};

 

이 단계에서 처리하는 수학..들은 난 여기서 봤당

https://blog.naver.com/destiny9720/221425095052

 

29. 투영 변환 행렬 ( Projective Transformation Matrix )

앞서서 동차좌표계에 대한 개념과 일반적인 형태의 투영 변환 행렬에 대해 알아보았다. 이번의 주제는 게임...

blog.naver.com

 

 

 

3. 테셀레이션 단계

테셀레이션(tessellation)은 주어진 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형을 만드는 과정을 말한다. 14장에서 자세히 설명한다.

tessellation

 

4. 기하 셰이더 단계

이 단계는 선택적이며 12장부터 사용한다. 간단하게 설명하면 기하 셰이더는 하나의 온전한 기본 도형을 입력받아서 그것을 임의로 변경한다. 흔한 용도로는 점이나 선분을 사각형으로 확장하는 것이다.

 

 

5. 절단

시야 절두체 바깥에 있는 기하구조는 폐기해야하며, 절두체의 경계면과 교차하는 기하구조는 잘라내는데 이것을 절단(clipping) 연산이라고 부른다.

 

 

 

6. 래스터화 단계

래스터화기 단계(rasterizer stage)라고도 하는 래스터화 단계(rasterization stage)의 주 임무는 투영된 3차원 삼각형으로부터 픽셀 색상을 계산하는 것이다. 그 외에 뷰포트 변환, 후면 선별, 정점 보간 등 있다.

래스터화

 

7. 픽셀 셰이더 단계

픽셀 셰이더(pixel shader)는 프로그래머가 작성하고 GPU가 실행하는 프로그램이다. 픽셀 셰이더는 각각의 픽셀 단편에 대해 실행된다. 기본적으로 픽셀 셰이더는 그냥 색상을 돌려주는 간단한 것부터 픽셀당 조명, 반사, 그림자 효과 등 좀 더 복잡한 작업까지 수행한다.

 

 

8. 출력 병합기 단계

ps에서 생성한 픽셀 단편들은 출력 병합기(output merger, OM) 단계로 입력된다. 이 단계에서 일부 픽셀 단편들이 기각되거나 후면 버퍼에 기록되거나, 혼합된다.

'DirectX' 카테고리의 다른 글

6.2 색인(index)  (0) 2021.12.24
6.1 정점(Vertex)  (0) 2021.12.24
5. 프레임워크  (0) 2021.12.22
4. 타이머  (0) 2021.12.20
0. Direct3D 12 개요  (0) 2021.12.20