DX11) Device와 Context
직전 글 winMain 초기 정리는 winApi에 관해 초기 설정을 다뤘다.
이번 글은 DirectX11 기준으로 초기 설정에 필요한 요소들을 정리 할 것이다.
이 역시 마찬가지로 너무 많은 정보가 한꺼번에 들어오기 때문에, 보기도 어렵고 이해하기도 어렵기 때문이다.
D3D11CreateDevice
먼저 DirectX11을 사용하기 위해 Device를 만들어야한다.
Device와 Context는 미리 스마트 포인터 ComPtr로 만들어 놓아야한다.
UINT flag = 0; // 디바이스 생성 옵션 플래그
#ifdef _DEBUG
flag = D3D11_CREATE_DEVICE_DEBUG; // 디버그 모드로 디바이스 생성
#endif
D3D_FEATURE_LEVEL level = D3D_FEATURE_LEVEL_11_0; // 시용할 D3D 기능 레벨지정
if (FAILED(D3D11CreateDevice(
nullptr, // 기본 어댑터
D3D_DRIVER_TYPE_HARDWARE, // 하드웨어 가속
nullptr, // 소프트웨어 드라이버 사용 안함
flag, // 플래그(디버그)
nullptr, // 기능 레벨 배열 없음
0, // 배열 갯수
D3D11_SDK_VERSION, // SDK 버전
Device.GetAddressOf(), // 생성된 디바이스
&level, // 실제 생성된 기능 레벨
Context.GetAddressOf()))) // 생성된 컨텍스트
{
// 실패시 종료
MessageBox(nullptr, L"Device 생성 실패", L"Device 생성 실패", MB_OK);
return E_FAIL;
}
- Device와 Context를 생성하며, 그 주소를 가져다 사용하는 형태이다.
Device
DirectX11에서 Device는 그래픽 하드웨어(GPU)와의 직접적인 연결을 담당하는 객체이다.
Device의 역할
- GPU의 기능 및 하드웨어 상태를 관리.
- 셰이더(Shader) 및 렌더링 파이프라인 설정.
- Direct3D 리소스(버퍼, 텍스처 등)를 생성하고, GPU가 이를 사용할 수 있도록 초기화.
Device가 필요한 이유
- DirectX를 통해 GPU와 직접적으로 통신할 수 있는 객체가 필요하기 때문.
- 다양한 그래픽 작업에서 리소스를 할당하고 설정하는 중요한 역할 수행.
Device Context
Device Context는 Device를 통해 생성된 리소스를 GPU에서 실행하고 조작하는 역할을 담당한다.
Device Context의 역할
- GPU 명령을 실행하고, 렌더링 작업을 처리.
- 셰이더, 뷰포트, 파이프라인 상태를 설정.
- 버퍼나 텍스처 등의 그래픽 데이터를 GPU에 바인딩
Device Context가 필요한 이유
- Device는 리소스를 생성하지만, 이를 실제로 GPU에서 렌더링하려면 명령을 실행할 컨텍스트가 필요.
- 여러 개의 렌더링 컨텍스트를 만들어 다중 스레드에서 병렬로 렌더링 가능.
Device와 Context의 차이점
개념 | 역할 | 주요 기능 |
---|---|---|
Device | GPU와 직접 통신 | - 리소스 생성 - 상태 관리 |
Context | 렌더링 명령 실행 | - 셰이더 - 뷰포트 설정 - 드로우 호출 |
Device와 Context의 상호 작용 과정
- Device를 통해 리소스(버퍼, 텍스처)를 생성.
- Device Context가 해당 리소스를 GPU에 바인딩.
- Device Context에서
Draw()
같은 명령을 호출하여 렌더링 실행. - GPU가 명령을 수행하고 최종적으로 화면에 출력.
결론
- Device는 GPU의 리소스를 생성하고 Direct3D의 상태를 관리하는 객체.
- Device Context는 렌더링 명령을 실행하고, 셰이더와 데이터를 GPU에 바인딩하는 객체.
- DirectX 11에서는 보통 하나의 Device와 하나의 Immediate Context를 사용하여 렌더링을 수행.
- 멀티 스레드 렌더링을 위해 여러 개의 Context를 생성할 수도 있다.
댓글남기기