순서
렌더링 파이프라인은 IA(Input Assembly)인 "입력 조립" 단계부터 시작하여, 버텍스 쉐이더, 헐 쉐이더, 테셀레이션 쉐이더, 도메인 쉐이더, 지오메트리 쉐이더를 거치고, (스트림 출력 단계 SO) , 래스터라이저, 픽셀 쉐이더, Output Merge인 출력병합 단계로 마무리 됩니다.
단계별 간단한 설명
1. 입력 조립
- 입력 조립 단계는 GPU가 렌더링 할 데이터에 대한 정점 버퍼들을 CPU에게 받아서 기본 도형인 프리미티브 토폴로지를 설정하는 단계입니다.
- 정점버퍼에는 위치, 노말, Color, UV 정보가 직렬화된 배열 형태로 담겨져있고, 이를 통해 조립된 프리미티브가 정점 쉐이더의 입력이 됩니다.
2. Vertex Shader (정점 쉐이더)
- 버텍스 쉐이더 단계는 정점 데이터를 받아 MVP 단계로 나눠지는 공간변환을 수행합니다.
- 첫번째로 Model 변환은 오브젝트공간(로컬 공간)을 월드 공간으로 변환합니다. TRS행렬을 SRT 순서로 곱하여 각 오브젝트들의 좌표 공간을 하나의 월드 공간에 통합하는 과정입니다.
- 두번째로 View 변환은 월드공간을 카메라 공간으로 변환합니다. 모든 오브젝트를 화면에 그려내기 쉽도록 카메라 기준으로 공간을 변환하는 과정입니다.
- 세번째로 Projection 변환은 카메라 공간을 클립 공간으로 변환하는 과정입니다. 화면에 렌더링될 수 있는 영역을 나타내는 절두체가 정의되고, 절두체를 완전히 벗어나는 폴리곤은 버리고 경계에 그려진 폴리곤은 일단 유지하는 컬링 작업을 수행합니다.
3. Hull Shader (덮개 쉐이더)
- 헐 쉐이더 단계에선 오브젝트들의 표면을 여러 개의 삼각형으로 분할하고, 각 입력패치(quad, triangle, line,,)에 해당하는 도형(지오메트리, 기하 도형 패치)을 생성 및 계산합니다.
4. Tessellation Shader (테셀레이션 쉐이더)
- 테셀레이션 쉐이더 단계에서는 한 메시의 삼각형들을 더 작은 삼각형으로 분할하여 세부적인 렌더링이 가능하게 하게 합니다. 카메라에 가까운 삼각형은 테셀레이션을 적용하고, 멀리있는 삼각형은 적용하지 않는 방식으로 LOD(Level-Of-Detail)를 구현할 수 있고 메모리를 조절하거나 계산량을 최소화할 수 있습니다.
- Low-poly 메시 : 적은 수의 삼각형들로 이루어진 메시를 담아두고, 즉석에서 삼각형들을 추가해 메모리를 적용할 수 있다.
- 애니메이션 : 물리 처리 같은 연산들을 단순한 Low-Poly 메시에 대해 수행하고, 테셀레이션 된 High-Poly 메시는 렌더링에만 사용해 계산량을 줄일 수 있다.
5. Domain Shader (도메인 쉐이더)
도메인 쉐이더는 헐 쉐이더와 테셀레이션 쉐이더를 기반으로 나온 출력 패치의 세분화된 꼭지점을 찾고 도메인 샘플에 해당하는 정점의 위치를 계산하는 단계입니다.
6. Geometry Shader (지오메트리 쉐이더)
지오메트리 쉐이더 단계에서는 입력받은 정점 데이터를 가지고 버텍스 쉐이더에서 생성되지 않은 삼각형, 선, 점을 생성하거나 수정합니다. 즉, 지오메트리(도형)을 확장하거나 축소하는 단계입니다.
- 지오메트리 쉐이더의 흔한 용도는 하나의 '점'이나 '선분'을 하나의 '사각형'으로 확장하는 것이다.
7. 래스터라이저 (Rasterizer)
래스터라이저 단계에서는 투영된 3차원 삼각형으로부터 픽셀의 색상들을 계산해내어 3D 공간을 2D 공간으로 변환합니다.
래스터라이제이션이 수행되는 동안 각 프리미티브를 구성하는 정점은 픽셀로 변환되고, 프리미티브 내부에 해당하는 점들은 보간을 통해 픽셀로 변환됩니다.
래스터라이저가 하는 일은 원근분할, 클리핑, 후면컬링, 뷰포트 변환, 스캔변환 까지 크게 5가지로 나뉘어집니다.
- 래스터라이저 단계는 그래픽 파이프라인을 크게 봤을 때 버텍스 쉐이더의 Output 값을 Input으로 받는 두번째 단계로 볼 수 있다.
- 원근분할(Perspective Division) : 클립 공간을 행렬 w 값으로 나누어 모든 원근을 계산하고, 원근 분할이 끝나면 NDC 좌표계가 된다.
- 클리핑(Cliiping) : 카메라 절두체에 걸쳐진 오브젝트 중에서 밖으로 나간 부위를 잘라내는 것
- 후면컬링(Back-face Culling) : 실제 사물을 보는 것처럼 뒷면을 display에 올리지 않거나, 반투명한 재질의 경우 앞, 뒤면을 살짝씩 보이게 하는 등의 처리를 수행하는 것. View 벡터와 Normal 벡터를 가지고 후면을 찾아내어 컬링을 수행한다. (행렬식을 사용?)
- 뷰포트변환 : 3D 공간 좌표를 2D 스크린 좌표로 변환하는 것
- 스캔변환 : 삼각형이 차지하는 공간의 픽셀 위치를 결정하고, 삼각형의 정점 별 속성을 보간하여 각 픽셀에 대한 속성을 계산하는 것. (쉽게말해 도형들을 통해 픽셀 데이터를 생성하고 해당 픽셀을 찾아내는 것)
8. Pixel Shader
픽셀 쉐이더는 레스터라이저로부터 보간된 데이터를 받아 화면에 그려지는 모든 픽셀의 색상과 깊이 값을 출력합니다. 이를 통해 투명도를 결정하거나, 라이팅과 그림자를 적용하거나, 텍스처 색상에 메시를 입히는 등의 역할을 수행합니다.
9. Output Merge (출력 병합)
아웃풋 머지 단계에서는 픽셀 쉐이더가 생성한 픽셀 단편들을 받아 최종적으로 픽셀에 그려져야할 색상을 결정하고 렌더링 합니다. 일부 픽셀은 깊이 판정이나, 스텐실 판정에 의해 버려지게 되고, 버려지지 않은 픽셀 단편은 후면 버퍼에 기록됩니다. Alpha Blending도 출력 병합 단계에서 수행됩니다.
- 깊이 판정 : 출력 픽셀의 깊이 값을 깊이 버퍼의 같은 위치의 깊이 값과 비교한다. 비교 결과에 따라 출력 픽셀을 렌더 타깃에 출력하거나 출력하지 않는다.
- 스텐실 판정을 이용하여 렌더링하지 않을 부분에 렌더링을 방어할 수 있다.
https://velog.io/@bangseungho/Chapter-3-%EB%9E%98%EC%8A%A4%ED%84%B0%ED%99%94
Chapter 3 : 래스터화
세 번째 chapter로 래스터화에 대해 배운다.
velog.io
https://novemberfirst.tistory.com/27
[Direct3D11] 렌더링 파이프라인? (Rendering Pipeline)
렌더링 파이프라인(Rendering Pipeline) GPU를 사용해 리소스를 2D 이미지로 렌더링 하는 과정이다. 파이프라인은 여러 개의 파이프라인 단계로 구성되어 있으며 프로그램 가능 단계와 고정 프로그램
novemberfirst.tistory.com
https://woo-dev.tistory.com/174
5 - 출력 병합(Output merging)
책을 보며 개인적으로 공부하는 내용이므로 틀린 부분이 있을 수 있습니다. 자료 및 내용 출처 출력 병합(Output merging) 출력 병합 단계는 렌더링 파이프라인의 마지막 단계이다. 이전 단계인 프래
woo-dev.tistory.com
'👩🏻💻기초지식 > DirectX' 카테고리의 다른 글
[DX] AABB, OBB 충돌 (0) | 2023.09.11 |
---|---|
[DX] 인스턴싱 (0) | 2023.08.22 |
[DX] 오클루전 컬링과 언리얼 엔진에서의 컬링 설정 (0) | 2023.08.22 |
[DX] 컬링 (프러스텀 컬링, 경계구/경계상자, 쿼드트리, 클리핑) (0) | 2023.08.22 |