DirectX는 Windows 프로그램에 고성능 하드웨어 가속 멀티미디어 지원을 제공하는 low-level의 응용 프로그래밍 인터페이스(APl) 집합이다.
[그래픽 하드웨어 연결]
[응용 분야 - 게임 개발]
Compute Shader를 지원함으로써 (1)그래픽스 처리 이외에도 (2)데이터를 병렬처리할 수 있는 범용적인 프로세서로써 GPU를 활용할 수 있다.
//

Direct3D 11은 기초적인 그래픽스 기능을 제공하는 DirectXGI 상에 구축되어 있다.
DirectXGI는 여러 그래픽 API에 공통인 그래픽 관련 작업들을 묶은 것으로, 커널 모드 드라이버 및 시스템 하드웨어와 통신한다. DXGI가 담당하는 영역에는 페이지 전환(스왑체인), 어댑터, 모니터, 디스플레이 모드 등의 그래픽 시스템 정보 등이 있다.
//
스왑 체인은 프론트버퍼, 백 버퍼를 포함한 복수의 버퍼의 집합과 이들 사이의 전환 방식의 집합이다.
double buffering의 일종으로, 화면에 그려질 때 깜빡임(flicking)이나 찢어짐(tearing) 현상을 막기 위한 트릭이다.
DirectXGI의 기능으로써 제공된다.
[복수의 버퍼 집합]
DirectX에서는 화면표시, 렌더링을 위해 Front Buffer와 Back Buffer를 사용한다.
[버퍼 전환]
렌더링이 끝났을 때 Front Buffer의 내용을 갱신한다.
//
DirectX 11 에서는 멀티 스레드 호환이 강화되었다.
DirectX 10의 Device가 11에서는 Device와 DeivceContext로 분할됐다.
[Device]
리소스 생성에 주로 사용한다. (렌더 타겟 뷰, 상태 변수의 생성 등등에 사용)
각 응용 프로그램에는 하나 이상의 장치가 필요하다. 대부분은 하나의 장치만 만든다.
[Device Context]
device의 설정을 담당한다.
device에서 소유하는 resource를 사용해 파이프라인 상태를 설정하고, 렌더링 명령을 생성할 수 있다.
예시로 상태 변수가 있다.
DepthStencilState 같은 상태 변수를 만들었다면 장치 컨텍스트에 적용시켜줘야 한다.
//
Tessellation은 정밀도가 낮은 primitive data를 분할해, 보다 정밀한 primitive를 생성해 출력하는 기능이다.
[Tessellation OFF]
[Tessellation ON]
DirectX 11의 graphics pipeline에는 tessellation을 수행하는 1개 stage와 2개 shader(hull shader, domain shader)가 추가돼 realtime으로 tessellation을 수행할 수 있다.
//
shader를 pipeline에 할당할때 shader code를 드라이버에 최적화할 수 있다.
DirectX에서는 특정한 형식을 따르는 자료를 텍스처로 저장한다.
[DXGI_FORMAT 예시들]
텍스처의 자료형들은 DXGI_FORMAT이라는 열거형으로 저장된다.
DXGI_FORMAT_R32G32B32_FLOAT // red,green,blue 32bit float DXGI_FORMAT_R16G16B16A16_UNORM // red,green,blue,alpha 16bit로 0~1사이 Normalized 값 DXGI_FORMAT_R32G32_UINT // red, green 32bit 정수 DXGI_FORMAT_R8G8B8A8_UNORM // red,green,blue,alpha 8 bit로 0~1값 DXGI_FORMAT_R8G8B8A8_SNORM // red,green,blue,alpha 8 bit로 -1~1 값 DXGI_FORMAT_R8G8B8A8_SINT // red,green,blue,alpha 8 bit로 -128~127 값 DXGI_FORMAT_R8G8B8A8_UINT // red,green,blue,alpha 8 bit로 0~255 값
- 자료형에는 색상 정보 외에도 3차원 벡터와 같은 다양한 값을 담을 수 있음
DXGI_FORMAT_R8G8B8A8_TYPELESS // TYPELESS형
- Typeless: 메모리만 확보해두고 해석 방식은 텍스쳐를 파이프라인에 묶을 때 결정
//
GPU가 어떤 일을 하기 위해선 shader 프로그램이 필요한데, shader에 넘겨주는 데이터를 Resource라고 한다.
Scene을 구성하는 기하 도형, 텍스처, 쉐이더 데이터가 모두 resource다.
resource는 buffer와 texture로 구성된다.
생명주기: 생성 -> 바인딩 -> 해지
//
resource view는 resource를 rendering pipeline에 binding해줄 수 있는 객체이다.
하나 이상의 graphics pipeline 단계에서 같은 resource에 접근할 때 resource view로 접근한다.
[예외]
resource는 view를 통해 pipeline에 binding하지만, view 없이 binding 가능한 resource도 있다.
[Resource view list]
//
resource view의 일종으로, Device의 back buffer에 binding되며 생성된다.
rendering pipeline의 출력 중 색상 값을 담는다.
[render target]
render target은 rendering 대상이다.
예를 들어, texture에 그린다면 texture가, window에 그린다면 back buffer가 render target이다.
[pipeline binding]
back buffer에 장면을 출력하려고 할 때 render target view를 파이프라인의 마지막 단계인 Output Merget State (OM)에 binding해야 한다.
[render target 설정]
render target 설정
render target을 설정할 때는 우선 render target view를 만들어준 후, Device Context에서 설정한다.
// backBuffer의 포인터로 render target view 생성
result = m_device->CreateRenderTargetView(backBufferPtr, NULL, &m_renderTargetView);
// device context 설정
result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1,
D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
// device context에 render target 설정
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView);
//
rendering pipeline의 출력 중 depth와 stencil 값을 담는다.
OM에서 쓰이며, depth와 stencil 모두 output test에 쓰이므로 하나의 view로 묶는다.
[stencil]
스텐실 값은 두 개 이상 오브젝트가 겹쳤을 때 뭘 표시할지 나타낸다.
depth test와는 달리 앞-뒤 값으로 결정짓는 것이 아니라, 상황에 따른 stencil 값의 대소를 따져 앞-뒤를 계산한다
[code]
// OM setting 시 render target view와 depth stencil buffer를 함께 binding한다
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView);
//

📢필수📢 Input-Assembler (IA) :📢필수📢 Vertext Shader :🔈선택🔈Hull Shader :🔈선택🔈Tessellator :🔈선택🔈Domain Shader :🔈선택🔈Geometry Shader :📢디폴트📢 Rasterizer :📢필수📢 Pixel Shader :📢디폴트📢 Output-Merge(OM) 출력 병합기 :References
[1] DX11 Feature: https://blog.naver.com/sorkelf/40160740465
[2] DX Basic Concept: https://dev-nicitis.tistory.com/46
[3] Graphics Pipeline: https://learn.microsoft.com/ko-kr/windows/uwp/graphics-concepts/graphics-pipeline