2020 이전/DirectX

DirectX 11 렌더링 파이프라인

이상해C++ 2019. 1. 9. 15:44

다이렉트11에서 그래픽 파이프라인을 정의하는 인터페이스는 ID3D11Device, ID3D11DeviceContext 이다.


ID3D11Device: GPU와 GPU의 자원의 virtual representation을 제공.

ID3D11DeviceContext: 파이프라인에 대한 그래픽처리를 나타낸다.


ID3D11Device 인스턴스로 장면에서의 그래픽을 처리하는 GPU 자원으로 구성하고 획득하며, ID3D11DeviceContext로 그래픽 파이프라인에서의 적절한 쉐이더 단계에서 자원들을 처리한다. ID3D11Device 메소드는 씬을 setup하거나 device가 바뀔때 호출되지만 ID3D11DeviceContext는 매 프레임마다 호출한다.




1. Input Assembler 단계

user-filled buffer로부터 원시 데이터를 읽어들여 그 후 파이프라인 단계에서 사용될 primitive types(line list, triangle strips 등등)데이터로 assemble하는 역할을 수행한다.


2. vertex shader 단계

input assembler 단계를 통과한 vertices들을 처리하는 단계. transformation, skinning, morphing, and per-vertex lighting과 같은 작업을 수행.

vertex shader는 단일 input vertex을 받고 output으로 단일 vertex를 출력한다.


3. Hull shader 단계

다이렉트11은 테셀레이션(GPU에서 low-detail subdivision surface를 higher-detail primitves로 바꾸는)을 구현하기위한 3가지의 새로운 단계를 support합니다. Hull shader, tesselator, domain shader 단계가 그것입니다. 


4. Tesselator 단계

도메인(quad, tri or line)을 더 많은 작은 오브젝트(triangles, points or lines)로 잘게 나누는 작업을 수행한다. 


5. Domain shader 단계 


잘게 나누어진 포인트의 vertex position를 계산하는 단계.


6. Geomtry shader 단계

정점을 input으로 받아 application-specified 쉐이더를 적용하고 생성된 정점들을 출력한다.

버텍스 쉐이더와는 다르게 기하쉐이더는 입력으로 full primitive의 정점을 받는다. 기하쉐이더는 edge 인접 원시 데이터들을 입력을 받을 수 있다.


7. Stream Output shader

기하 쉐이더단계(또는 정점쉐이더 단계)에서 메모리에 있는 하나 이상의 버퍼로 정점 데이터를 연속적으로 출력하는 단계. 메모리에 출력된 데이터들은 pipeline에서 다시 읽어들일 수 있다. 


8. Rasterizer 단계

vector 정보를 레스터 이미지(픽셀)로 변환하는 단계. 


9. Pixel-shader 단계

픽셀 라이팅이나 post-processing과 같은 쉐이딩을 가능하게하는 단계.


10. Output-merger 단계 

최종출력되는 픽셀의 색상을 생성한다.  depth/stencil 테스트를 수행하여 실제로 렌더링여부를 결정하고 최종색상을 blend 한다.


참고: https://docs.microsoft.com/en-us/windows/desktop/direct3dgetstarted/understand-the-directx-11-2-graphics-pipeline