MOONSUN
[D3D] Comptr 사용해보자 본문
처음 D3D 프로젝트를 만들면서 Com 객체들을 안전하게 해제하도록 하는 매크로를 사용하고 있었는데
Comptr을 활용하는 방식으로 변경했다.
그 내용에 대해서 간단하게 정리해보고자 한다..!
현재 NDC좌표계 좌표와 컬러값을 갖는 Vertex를 만들고 IndexBuffer를 사용해서 사각형 그리는 간단한 프로그램을 만들었다.

1. ( 기존 ) : Com 객체를 안전하게 해제 하는 매크로 만들어서 사용
템플릿으로 매크로를 만들어서 COM 객체들을 사용해주고 해제해주었다.
// COM 객체 안전 해제
template <typename T>
void SAFE_RELEASE(T* p)
{
if (p)
{
p->Release();
p = nullptr;
}
}
// h.
ID3D11Device* m_pDevice = nullptr;
ID3D11DeviceContext* m_pDeviceContext = nullptr;
IDXGISwapChain* m_pSwapChain = nullptr;
ID3D11RenderTargetView* m_pRenderTargetView = nullptr;
// cpp.
HR_T(D3D11CreateDeviceAndSwapChain(
NULL, // 기본 어댑터 사용
D3D_DRIVER_TYPE_HARDWARE, // 하드웨어 렌더링 사용
NULL, // 소프트웨어 드라이버 없음
creationFlags, // 디버그 플래그
NULL, NULL, // 기본 Feature Level 사용
D3D11_SDK_VERSION, // SDK 버전
&swapDesc, // 스왑체인 설명 구조체
&m_pSwapChain, // 스왑체인 반환
&m_pDevice, // 디바이스 반환
NULL, // Feature Level 반환 (사용 안 함)
&m_pDeviceContext)); // 디바이스 컨텍스트 반환
// 해제
SAFE_RELEASE(m_pRenderTargetView);
SAFE_RELEASE(m_pDeviceContext);
SAFE_RELEASE(m_pSwapChain);
SAFE_RELEASE(m_pDevice);
2. ( 수정 ) : Comptr 사용
Comptr을 사용하도록 변경했다.
// 헤더 추가
#include <wrl/client.h>
using Microsoft::WRL::ComPtr;
// h
ComPtr<ID3D11Device> m_pDevice;
ComPtr<ID3D11DeviceContext> m_pDeviceContext;
ComPtr<IDXGISwapChain> m_pSwapChain;
ComPtr<ID3D11RenderTargetView> m_pRenderTargetView;
// cpp
HR_T(D3D11CreateDeviceAndSwapChain(
nullptr, // 기본 어댑터 사용
D3D_DRIVER_TYPE_HARDWARE, // 하드웨어 렌더링 사용
nullptr, // 소프트웨어 드라이버 없음
creationFlags, // 디버그 플래그
nullptr, 0, // 기본 Feature Level 사용
D3D11_SDK_VERSION, // SDK 버전
&swapDesc, // 스왑체인 설명 구조체
m_pSwapChain.GetAddressOf(), // 스왑체인 반환
m_pDevice.GetAddressOf(), // 디바이스 반환
nullptr, // Feature Level 반환 (사용 안 함)
m_pDeviceContext.GetAddressOf() // 디바이스 컨텍스트 반환
));
// 해제 : 필요하면 Reset 가능. 나는 따로 해제 안해줌
// 기존 SAFE_RELEASE 매크로 제거
// m_pVertexBuffer.Reset();
// m_pIndexBuffer.Reset();
// m_pInputLayout.Reset();
// m_pVertexShader.Reset();
// m_pPixelShader.Reset();
특정 시점에서 강제로 해제하고 싶으면 Reset()을 사용하기!
'D3D' 카테고리의 다른 글
| [D3D 이론] 기저벡터(Basis Vector)와 행렬(Matrix) (0) | 2025.09.10 |
|---|---|
| [D3D] DirectX 11에서 HLSL 셰이더 컴파일 2가지 방법 (0) | 2025.09.05 |
| [D3D] Comptr(COM Smart Pointer) 란? (1) | 2025.09.05 |
| [Error] Invalid vs_2_0 output semantic 'SV_TARGET’ (0) | 2025.09.04 |
| [D3D 이론] 렌더링 파이프라인에서 각 스테이지의 역할 (0) | 2025.09.04 |