본문 바로가기

Library/Computer Graphics

Direct3D 10 Rendering Pipeline

Diriect3D 10(D3D10)의 렌더링 파이프라인은 Direct3D 9.0(D3D9)과 매우 다르다. D3D9과 구별되는 외형상의 가장 커다란 특징이라면, 디스플레이 어댑터, 출력기기(모니터)와 같은 하드웨어 인프라를 다루는 부분을 DXGI(DirectX Graphics Infrastructure)로 완전히 독립시켰다는 것이다. DXGI 이전에는 Direct3D가 이런 하부 구조까지 책임지고 있었기 때문에, 코드를 마이그레이션 하는 경우 실제 이식 작업과 상관없는 이런 부분까지 손 대야 하는 불편함이 있었다. DXGI는 어댑터, 백버퍼(스왑체인), 출력 기기에 대한 정보를 Direct3D와 별도로 관리한다. 또, D3D9에서는 출력으로 지정된 윈도우 핸들을 실행 도중 바꿀 수 있었는데, DXGI는 이것을 허용하지 않는다. DXGI와 출력 윈도우가 과거보다 더 타이트하게 결합되어 있기 때문인데, 출력 윈도우 핸들을 바꾸고 싶다면 현재의 DXGI를 파괴하고 새로운 DXGI를 생성해야 한다. 이 변경으로 약간의 성능 향상이 있다고 한다.

D3D10의 파이프라인은 전반적으로 아주 유연하고 깔끔한 구조를 취하고 있는데, Direct3D 11 역시 D3D10의 렌더링 파이프라인에 약간의 스테이지를 추가한 것 뿐이다. D3D10의 파이프라인은 다음과 같이 구성되어 있다. 이 내용은 http://msdn.microsoft.com/en-us/library/ee415715(VS.85).aspx을 참조한 것이다.




Input-Assembler Stage : IA 스테이지는 데이터를 공급하는 것을 책임진다. IA 스테이지는 다음 파이프라인에서 보다 효과적으로 데이터를 처리하기 위해 semantics라 불리는 시스템이 생성한 정보를 추가할 수 있다.

Vertex-Shader Stage : 버텍스 쉐이더 스테이지는 변환, 스키닝, 모핑, 조명과 같은 전형적인 연산을 수행한다. 버텍스 쉐이더는 언제나 하나의 버텍스를 입력으로 받고, 하나의 버텍스를 출력한다.

Geometry-Shader Stage : 지오메트리 쉐이더 스테이지는 전체 프리미티브를 대상으로 처리한다. 지오메트리 쉐이더의 입력은 하나의 완전한 프리미티브다. 각 프리미티브들은 경계에서의 인접 프리미티브들을 구성하는 버텍스 정보도 포함할 수 있다. 이것은 하나의 삼각형에 대해서라면 최대 3개, 선에 대해서라면 최대 2 개의 버텍스를 더 포함할 수 있다는 것을 의미한다. 이외에도 지오메트리 쉐이더는 기하 증폭 / 감소를 제한적으로 지원한다. 지오메트리 쉐이더는 입력으로 주어진 프리미티브들을 무시할 수도 있고, 하나 이상의 새로운 프리미티브들을 더 생성할 수도 있다.

Stream-Output Stage : 스트림 출력 스테이지는 래스터라이저로 처리되는 도중, 파이프라인에서 메모리으로 흘러가는 데이터를 위해 디자인되었다. 데이터는 스트리밍될 수도 있고, 래스터라이저로 그냥 넘어갈 수도 있다. 메모리로 스트리밍된 데이터는 다시 파이프라인의 입력 데이터가 되거나, CPU에 의해 다시 읽혀질 수도 있다.

Rasterizer Stage : 래스터라이저는 프리미티브들을 클리핑하고, 어떻게 픽셀 쉐이더와 연결하여 처리할 것인지를 책임진다.

Pixel-Shader Stage : 픽셀 쉐이더 스테이지는 보정된 프리미티브 정보를 받고, 컬러값과 같은 각 픽셀에 해당되는 데이터를 생성한다.

Output-Merger Stage : 출력 조합기는 픽셀 쉐이더 값, 깊이 / 스텐실 정보와 같은 정보를 현재 런더 타켓 정보와 조합하여 최종적인 파이프라이닝 결과를 만들어낸다.


Reference
http://msdn.microsoft.com/en-us/library/ee415715(VS.85).aspx