렌더링 파이프라인이란?
GPU를 사용하여 리소스(텍스쳐, 정점/인덱스)를 2D 이미지로 렌더링하는 과정
- 정점 버퍼의 정점 데이터(점, 선, 삼각형)를 다른 파이프라인 단계에서 사용할 프리미티브(선 리스트, 삼각형 리스트, 삼각형 스트립 등)로 조립한다.
정점 셰이더 (Vertex Shader)
- IA 단계에서 출력되는 프리미티브의 각 정점에 대한 연산 수행
- 변환, 스키닝, 조명 등
- 모든 정점을 로컬 공간 -> 클립 공간으로 변환시켜준다.
테셀레이션 (Tessellation)
- 생략 가능한 과정
- 하나의 정점을 여러 개의 정점으로 잘게 쪼갤 수 있다.
→ 원하는 해상도로 부드러운 표면을 표현할 수 있다
- 헐 셰이더 - 테셀레이터 - 도메인 셰이더 총 3단계로 구성된다
1. 헐 셰이더
- 입력 제어점으로부터 출력 체어점(Control Point)과 패치 상수 생성
2. 테셀레이터
- 도메인(선분, 삼각형, 사각형)을 작고 많은 프리미티브로 분할
3. 도메인 셰이더
- 헐 셰이더의 출력 제어점과 uv 좌표를 사용하여 표면 메쉬 생성
- 출력 패치에서 분할된 점의 정점 위치 계산
- 하나의 정점 출력
기하 셰이더 (Geometry Shader)
- 생략 가능한 과정
- VS에서 새로운 프리미티브를 만들 수도 있고, 입력된 프리미티브를 버릴 수도 있다!
- 새로운 프리미티브는 여기서 클립공간으로 변환하기도 함!
여기서 스트림 출력을 통해 렌더링 파이프라인을 빠져나올 수도 있다
스트림 출력
- GS 또는 VS에서 출력되는 정점 데이터를 연속적으로 메모리 버퍼로 GPU를 사용하여 출력한다!
- 스트림 출력을 통해 버퍼로 출력된 데이터는 렌더링 파이프라인에서 다시 사용할 수 있다!
예시
파티클 시스템 구현 시 투패스 알고리즘
1) 기하셰이더에서 메쉬 생성 후 스트림 출력을 통해 빠져나옴
2) 두 번째 렌더링 파이프라인에서 렌더링
래스터라이저 (Raseterizer)
- 벡터 정보(프리미티브) → 래스터 이미지 (픽셀)
- 각 프리미티브를 구성하는 정점 → 픽셀로 변환
- 프리미티브 내부의 점 → 보간을 통해 픽셀로 변환
- 클리핑, 원근나눗셈, 은면제거, 뷰포트 변환, 스캔 변환 등
프래그먼트 셰이더 (Fragment Shader)
- 각 픽셀들의 색상 결정
- UV, Normal Mapping 등 이용하여 텍스쳐를 입힌다.
- 조명 처리
출력 병합기 (Output Merger)
- 최종적으로 픽셀의 색상을 결정하여 렌더타겟으로 출력
- 깊이-스텐실 검사 (Depth-Stencil Test)
- 블렌딩
- 픽셀 값들을 블렌딩하여 하나의 최종 픽셀 색상을 결정
- 렌더타겟의 픽셀 색상 + PS의 색상 결합