게임개발/DirectX12

[DirectX12]#Part2 - Direct3D의 기초_COM

Hardii2 2021. 12. 23. 20:53

[DirectX12] #Part 2 - Direct 3D 기초

 

"DirectX12를 이용한 3D 게임 프로그래밍 입문" 서적의 Part 2, "Direct3D의 기초"에 해당하는 내용입니다. 

현재, 게임 개발에 입문하여 기초지식을 습득하여 기록하기 위함이며, 개념 이해와 예제코드 작성을 진행.

 

 


 

2.1 - 기본 지식

 

D3D12(Direct 3D 12)는 Low-level에 사용되는 그래픽 API로, 응용 프로그램에서 GPU를 제어하고 프로그래밍하는데 사용됩니다.

 

COM(Component Object Model), COM 객체

 

DirectX의 프로그래밍 언어의 독립성과 하위호환성을 가능케하는 기술이다. 책에서 설명하는 COM은 우리가 아주 잘 알고있는 C++의 클래스로 취급해도 무방하다. C++의 동적 메모리 할당(new) 혹은 해제가 필요하지 않고, 수명관리를 돕는 "Microsoft::WRL::ComPtr" 클래스를 이용합니다. COM객체는 참조 횟수, 즉 자신을 참조하는 객체의 수가 0이 되면 해제됩니다. 이 클래스는 우리가 C++에서 사용했던 auto_ptr, 혹은 shared_ptr 과 기능이 유사한 Smart Pointer로 보여진다. ComPtr은 범위가 벗어난 ComPtr 인스턴스를 바탕으로 자동으로 Release method, 즉 자원 해제를 수행합니다.   다음으로, ComPtr의 메소드 입니다. 

 

1. Get: 바탕 COM 인터페이스를 가리키는 포인터를 반환.

// ComPtr 선언,
ComPtr<ID3D12RootSignature> mRootSignature;
...
/* 
SetGraphicsRootSignature는 mRootSignature* 형식을 인자로 받는다.
이때, mCommandList는 명령 목록으로 뒤에서 다룬다. 
*/
mCommandList->SetGraphicsRootSignature(mRootSignature.Get());

 

2. GetAddressOf: 바탕 COM 인터페이스를 가리키는 포인터의 주소를 반환.

// 명령 목록 할당자 선언
ComPtr<ID3D12CommandAllocator> mDirectCmdListAlloc;
...
// GPU에서 명령할당을 실행하고, 2번째 매개변수는 메모리 영역을 할당할 명령목록 할당자의 주소
ThrowIfFailed(md3dDevice->CreateCommandAllocator(
	D3D12_COMMNAD_LIST_TYPE_DIRECT,
    mDirectCmdListAlloc.getAddressOf() // getAddressOf 메소드 호출 
));

 

3. Reset: ComPtr의 인스턴스를 null 포인터로 설정, 바탕 COM 인터페이스의 참조횟수를 -1 합니다.