https://learn.microsoft.com/en-us/windows-hardware/drivers/display/pipelines-for-direct3d-version-11
DirectX11의 Pipeline
Input Assembler는 CPU에서 제공받은 정보를 바탕으로 Primitive를 생성함
CPU는 Draw Call을 통해 Data Bus를 통해 GPU로 그래픽 정보를 넘겨준다.
여기에는 두 가지 방법이 있는데,
Vertex Buffer
Rendering할 Vertex 정보 만을 넘겨준다.
여기에서 문제가 될 수 있는 것은
triangle이나 quad 단위로 Vertex를 넘기는 경우,
중복된 Vertex 정보를 넘기게 된다.
이렇게 겹치는 vertex는 여러 번 전송된다.
Data Bus는 실제로 두 하드웨어 간에 연결이기 때문에,
Data의 양이 많아지면 속도가 크게 느려진다.
때문에 이를 보완하기 위해 Index Buffer를 사용한다.
Index Buffer
vertex 정보를 table에 저장해두고, primitive를 만드는데 필요한 index를 저장한다.
Index | Vertex |
---|---|
1 | (2,4,5) |
2 | (3,4,7) |
3 | (1,7,4) |
4 | (6,3,9) |
5 | (4.4,3) |
이렇게 Table을 넘겨주고, Primitive 생성 시에 index를 통해 접근하면,
중복된 Vertex Data의 양을 줄여, Data Bus에서 원활한 이동이 가능
실제로는 요래 생겼습니다. (아닐 수도 있음)
어찌 되었건 IA Stage는 이렇게 전달 받은 vertex 정보를 통해 Primitive를 생성한다.
(Primitive - Polygon Mesh 생성에서 기본이 되는 단위)
Shader들은 기본적으로 Pragrammable한 단계, 병렬로 연산을 진행함.
그래서 Vertex Shader는 무엇이냐
Pixel Shader(Fragment Shader)와 함께 Pipeline에 필수적인 단계
이름처럼 각 Vertex에 대한 정보(위치, normal, 색상 등등)를 계산
모든 Vertex를 동시에 병렬처리하기 때문에,
계산 과정에서 인근 Vertex 정보를 참조할 수 없다.
이 단계에서 3가지 Transform을 진행한다.
Object Space → Word Space → Camera Space → Clip Space
각 단계는 World Transform, View Transform, Projection Transform이다.
Projection Transform에서는 View Frustum외의 vertex를 Clipping한다.
Hull Shader에서 Tessellation Level을 결정
Tessellator가 Primitive를 분할
Domain Shader가 Height Map을 바탕으로 Displacement Mapping을 실시
Vertex를 바탕으로 더 많은 Vertex를 생성하거나 오히려 감소시켜 LOD에 사용하기도 함.
여러 그래픽적인 효과 구현에 사용
Pixel Shader로 진입하기 전에 Primitive의 내부를 Pixel로 채우는 과정
Vertex의 정보를 Rater 이미지화 한다.
이것이 Raster 이미지
굳이 이렇게 하는 이유도 역시 PCI-e Bus를 통해 전부 들여오는 것보다
GPU내에서 연산을 통해 생성하는 것이 효율적이기 때문이다.