[DX11] 렌더링 파이프라인
Input Assembler 1
- 정점 들을 CPU에서 GPU로 운반하기 위한 자료구조를 정점버퍼(VertexBuffer)라고 한다
- 정점 은 위치, 노말, 색상, UV를 담고 있고 구조체가 아니라 바이트 상태로 담고 있다
- 정점 버퍼의 내용을 D3D11_INPUT_ELEMENT_DESC를 통헤 정점 데이터(구조체)로 조립
- 정점 데이터를 VertexShader의 Input으로 전달
*D3D11_INPUT_ELEMENT_DESC : 정점 데이터(위치, 노말, 색상, UV), 쉐이더, 알파 블렌딩, z-test여부 등의 설정
*인풋레이아웃 : 그래픽카드는 사용자가 생성한 정점 정보에 대해 모르는 상태, 그래픽카드에 전송할 수 있도록 만든 인터페이스
Vertex Shader
- MVP(Model View Projection)변환 이루어짐
- 정점 변환 단계

Model
- M(Model변환)은 모델(Local, Object)공간에서 월드 공간으로의 변환(Model Space -> World Space)
- 모델 공간은 오브젝트 자신의 피벗 위치가 원점인 공간
- 게임의 월드는 단 하나의 원점을 중점으로 하는 좌표 공간
- 각 오브젝트의 좌표공간을 하나의 좌표공간으로 통합하는 과정
- 이 과정에서 SRT(크기, 회전, 이동)변환 수행
View
- View Space는 카메라 위치가 원점(0, 0, 0) 이고 카메라가 바라보는 축이 +z축인 공간
- 모든 오브젝트들을 화면에 그려내기 쉽도록 카메라 기준으로 공간 변환
Projection
- 카메라 공간(View Space) -> 클립 공간(Clip Space)
- 카메라 기준의 정점 위치를 화면에 보이기 위한 정점 위치로 변환
- 화면에 렌더링 할 수 있는 영역인 절두체(Frustum)가 정의됨
- 절두체는 Near, Far, Fov(Field of View)로 구성
- 절두체를 벗어난 폴리곤은 버림, 경계에 걸친 폴리곤은 일단 놔둠
- 직교 투영 혹은 원근 투영이 적용
- 투영이 적용되면서 X, Y 좌표 -1 ~ 1, Z좌표 0 ~ 1인 공간으로 변환
- w값은 카메라에서 멀어질수록 커지고
추후 래스터라이저에서 *NDC(Normalized Device Coordinates)로의 변환에 사용됨 - 버텍스 쉐이더의 최종 출력물은 클립 공간의 정점 데이터
NDC공간
- X, Y 좌표 -1 ~ 1, Z좌표 0 ~ 1인 공간(클립 공간 아님)
- 뷰포트 변환 일어나기 전 3D공간 상의 마지막 좌표계
- 클립 공간의(x, y, z)를 w로 나눈 결과로 원근법이 구현됨
Input Assembler 2
- 정점 데이터를 Primitive Topology로(보통 삼각형) 조립
- Index Buffer를 통해 어떤 순서로 점을 그릴지 정함
Rasterizer
투영 프러스텀에 걸친 정점들 걸러내기, 뷰포트 행렬 적용
건져내야 되는(모니터 밖, 뒷면은 X)정점 판별 Face Culling
msaa 샘플링 수행
픽셀들을 모니터에 나오도록 선별하는 작업
Pixel Shader
픽셀을 조정하는 단계
Output Merger
랜더타겟, 백 버퍼, 깊이 값 적용
랜더 타겟 - 출력된 픽셀이 렌더 타겟에 찍힌다
백 버퍼 - 픽셀이 찍힌 렌더 타겟이 백 버퍼에 적용되어 모니터에 출력
[ 용어 정리 ]
Device와 Context
그래픽카드라는 하드웨어를 제어하기 위한 인터페이스
Device는 기능지원 점검과 자원 할당 관련
Context는 렌더대상 설정, 그래픽파이프라인에 자원 묶기, GPU가 수행할 랜더링 명령 지시, 랜더링 관련
Mesh/Material
렌더링 파이프라인의 정점 정보를 크게 나누어 논 것이 메쉬, 메테리얼
정점 관련 부분 - 메쉬
색 관련 부분 - 메테리얼
DESC
설정파일
HLSL
쉐이더용 언어, 그래픽카드에 정점을 어떻게 처리할지 올림
인풋 레이아웃(INPUT_ELEMENT_DESC)
메쉬의 구조 정보를 넘겨주기 위함
쉐이더와 그래픽카드 사이에서 메쉬 정보 전달이 허용되도록 맞춰주는 인터페이스
인풋레이아웃의 원소는 순서가 중요하지 않다
단, 인풋 레이아웃의 원소와 전달해줄 메쉬를 만들 때 정보는 연결시켜주어야 함(몇 바이트부터 정보가 시작되는지)
SV_POSITION(시맨틱스)
렌더링 파이프라인을 거치는 데이터에는 [파이프라인에 의해 선택되는 값] 과 [파이프라인과 관계없는 값] 존재
SV_POSITION이라는 시맨틱스를 가진 데이터는 렌더링파이프라인에 의해 버텍스 좌표로 다루게 됨
Constant Buffer(상수 버퍼)
쉐이더에 값을 넘기기 위한 버퍼
Device의 Map~UnMap함수를 통해 파이프라인에 전달
16byte단위로 정렬됨
Depth Buffer 깊이버퍼
GPU가 특정 프레임을 렌더링할 때 깊이 정보를 저장해두는 특수한 텍스처(2차원 배열)
1개 메쉬 대상으로 렌더링 파이프라인을 거치는 상황, 이미 화면에 그려진 다른 메쉬들의 정보는 알 수 없음
다른 메쉬들의 정보를 담아두는 버퍼
깊이체크, 알파 블렌딩 등에 이용가능