2025년 4월 1일 화요일

Direct3D 0001 - Direct3D 초기화 (1) - COM, Comptr

 Direct3D는 low-level 그래픽 api(Application Programming Interface)로, GPU를 제어하고 프로그래밍하는데 사용되며 하드웨어 가속을 사용하여 가상 3d 세계를 렌더링할 수 있게 한다.
이 때, Direct3D는 COM(Component Object Model) 객체를 기반으로 하는 api이다.

COM 객체

COM은 객체 지향적인 인터페이스 표준으로, 여러 언어에서 사용될 수 있도록 설계되었다.
COM은 DirectX가 사용하는 대부분의 객체를 포함한다.
COM 객체는 인터페이스를 통해서만 조작할 수 있다.

모든 COM 인터페이스는 IUnknown COM interface를 상속한다.

Comptr class

Comptr이란 Microsoft의 WRL(Windows Runtime c++ template Library)에서 제공하는 스마트 포인터이다. 스마트 포인터이므로 자동 메모리 관리가 가능하다.

•#include <wrl.h>, Microsoft::WRL::ComPtr로 선언되어 있다.

#include <wrl.h>
using Microsoft::WRL::ComPtr;
ComPtr<ID3D12Device> device;  // 스마트 포인터 선언
D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));  // 객체 생성

•Comptr에는 세가지 중요한 메소드가 존재한다.  
•Get : 원래 포인터를 반환한다.

ID3D12Device* rawDevice = device.Get();

•Reset : Comptr 스마트 포인터가 보유한 COM객체를 해제하고, 내부 포인터를 nullptr로 설정한다. 
•GetAddressOf : 포인터의 주소를 반환한다. 현재 보유한 COM 포인터를 초기화할 때 사용되는 함수이다.

device.Reset();  // 기존 객체 해제
// 새로운 ID3D12Device 객체 생성
HRESULT result = D3D12CreateDevice(
    nullptr,
    D3D_FEATURE_LEVEL_11_0,
    IID_PPV_ARGS(device.GetAddressOf())  // 새로운 포인터 할당
); // HRESULT는 COM기반 함수들이 반환하는 에러 코드이다.

댓글 없음:

댓글 쓰기