소개
DirectX 는 API(응용 프로그래밍 인터페이스)의 모음
DirectX API의 구성 요소는 Windows 기반 운영 체제에서 실행되는 하드웨어에 대한 저수준 액세스 제공
DirectX 11 구성 요소
1. Direct2D
2D 지오메트리, 비트맵 및 텍스트에 대한 고성능 및 고품질 렌더링을 제공하는 하드웨어 가속 2D 그래픽 API
2. Direct3D
하드웨어 가속 3D 그래픽 API
3. DirectWrite
Direct2D, GDI(그래픽 장치 인터페이스) 또는 응용 프로그램별 렌더링 기술을 사용할 수 있는 고품질 하위 픽셀 텍스트 렌더링 지원
4. DirectXMath
DirectX 응용 프로그램에 공통적인 일반 선형 대수 및 그래픽 수학 연산을 위한 SIMD 친화적인 C++ 유형 및 기능 제공
SIMD(Single Instruction Multiple Data) : 병렬 컴퓨팅의 한 종류, 한 개의 명령어로 여러 개의 값을 동시에 계산하는 방식
즉, 간단한 수학 연산을 위해 사용
5. XAudio2
게임용 고성능 오디오 엔진 개발을 위한 신호 처리 및 믹싱 기반을 제공하는 저수준 오디오 API
XInput Game Controller API를 사용하면 응용 프로그램이 Windows용 Xbox 360 컨트롤러에서 입력 수신 가능
7. DXGI (DirectX Graphics Infrastructure)
DXGI란, DirectX 그래픽 런타임에 독립적인 저수준의 작업을 관리하고, DirectX 그래픽을 위한 기본적이고 공통적인 프레임워크를 제공해줌
응용 프로그램에서 장치를 열거하거나 출력에 데이터를 표시하는 방법을 제어해야 하는 경우 DXGI로 직접 작업 가능
DirectX 11 파이프라인
DirectX 11 그래픽 파이프라인은 여러 단계로 구성됩니다.
다음 다이어그램은 DirectX 11 렌더링 파이프라인의 여러 단계를 보여줍니다.
이 이미지는 DirectX 11 렌더링 파이프라인의 10단계를 보여줍니다.
- 화살표는 각 단계의 데이터 흐름과 GPU에서 사용할 수 있는 버퍼, 텍스처 및 상수 버퍼와 같은 메모리 리소스의 데이터 흐름을 나타냄
- 직사각형 블록은 고정 기능 단계이며 프로그래밍 방식으로 수정 불가
- 둥근 직사각형 블록은 파이프라인의 프로그래밍 가능한 단계
- 지오메트리가 지정되고 Vertex(정점) Shader에서 예상하는 데이터 레이아웃이 구성됨
2. 정점 셰이더(Vertex Shader) 단계
- 일반적으로 오브젝트 공간에서 클립 공간으로 정점 위치를 변환하는 역할을 하지만, 골격 애니메이션 메시 또는 정점 별 조명의 스키닝(색을 입히는 작업?)을 수행하는 데 사용할 수 있음
클립 공간(Clip Space) : 각 정점 셰이더 실행의 마지막에 OpenGL은 지정된 범위의 좌표를 받아들이고, 이 범위에서 벗어난 모든 좌표를 자름 (즉, 범위 외의 것들을 제외시킴)
- 정점 셰이더에 대한 입력은 단일 정점이고 정점 셰이더의 최소 출력은 클립 공간의 단일 정점 위치 (클립 공간으로의 변환은 테셀레이터[Tessellator] 또는 기하 도형 셰이더[Geometry Shader] 중 하나가 활성화된 경우 수행 가능)
3. 헐 셰이더(Hull Shader) 단계
- 선택적 셰이더 단계이며, 입력 제어 패치가 테셀레이터 단계에서 테셀레이션되어야 하는 양을 결정하는 역할
4. 테셀레이터(Tessellator) 단계
- 헐 셰이더(Hull Shader) 단계에 의해 지정된 테셀레이션 요소에 따라 패치 프리미티브를 더 작은 프리미티브로 세분화하는 고정 기능 단계
테셀레이션(Tessellation) : 동일한 모양을 이용해 틈이나 포개짐 없이 평면이나 곧간을 완전하게 덮는 것
프리미티브(Primitives) : 점, 선, 면 등
5. 도메인 셰이더(Domain Shader) 단계
- 선택적 셰이더 단계이며, 헐 셰이더(Hull Shader)의 출력 제어점과 테셀레이터(Tessellator) 단계의 보간 좌표를 기반으로 최종 정점 속성을 계산
- 도메인 셰이더(Domain Shader)에 대한 입력은 테셀레이터(Tessellator) 단계의 단일 출력 지점이고, 출력은 테셀레이션된 기본 요소의 계산된 속성
6. 지오메트리 셰이더(Geometry Shader) 단계
- 단일 기하학적 기본 요소(포인트 기본 요소의 경우 단일 정점, 삼각형 기본 요소의 경우 세 개의 정점, 선 기본 요소의 경우 두 개의 정점)를 입력으로 사용하고 기본 요소를 삭제할 수 있는 선택적 셰이더 단계
- 프리미티브를 다른 프리미티브 유형(ex. 쿼드에 대한 포인트)으로 변환하거나 추가 프리미티브 생성
7. 스트림 출력(Stream Output) 단계
- 기본 데이터를 GPU 메모리에 다시 공급하는데 사용할 수 있는 선택적 고정 기능 단계
- 이 데이터는 다른 셰이더 세트에 의해 처리되도록 렌더링 파이프라인으로 다시 재순환될 수 있음
파티클 효과에서 파티클을 생성하거나 종료하는 데 유용함. 지오메트리 셰이더는 종료되어야 하는 파티클을 버리거나 파티클이 생성되어야 하는 경우, 새 파티클 생성
8. 래스터라이저(Rasterizer) 단계
- 프리미티브를 View Frustum으로 클리핑하고 전면 또는 후면 컬링이 활성화된 경우 기본 컬링을 수행하는 고정 기능 단계
View Frustum : 화면에 나타날 수 있는 모델링된 세계의 공간 영역.
- 또한, 각 프리미티브의 면에 걸쳐 정점 별 속성을 보간하고 보간된 값을 픽셀 셰이더에 전달
9. 픽셀 셰이더(Pixel Shader) 단계
- 래스터라이저(Rasterizer) 단계에서 보간된 정점당 값을 가져와 픽셀당 색상 값 하나(또는 그 이상)를 생성
- 단일 구성 요소 32비트 부동 소수점 값을 SV_Depth(깊이 버퍼 데이터) 의미 체계에 매핑하여 현재 픽셀의 깊이 값을 선택적으로 출력할 수도 있지만, 이것이 픽셀 셰이더 프로그램의 요구 사항은 아님
- 픽셀 셰이더는 프리미티브에 의해 덮인 각 픽셀에 대해 한 번 호출됨
10. 산출 합병(Output-Merger) 단계
- 다양한 유형의 출력 데이터(픽셀 셰이더 출력 값, 깊이 값 및 스텐실 정보)를 현재 바인딩된 렌더 대상의 내용과 결합하여 최종 파이프라인 결과 생성
참고 링크
DirectX 소개 : Introduction to DirectX 11