2025년 4월 1일 화요일

Direct3D 0002 - Direct3D 초기화 (2) - Textures formats, Swap Chain

DXGI

DXGI(DirectX Graphics Infrastructure)는 그래픽 디바이스와 운영체제(Windows)간의 인터페이스를 담당하는 라이브러리이다. 이는 Direct3D와 그래픽 하드웨어를 연결하여 창, 스왑 체인, 디스플레이 출력 등을 관리한다. (스왑 체인은 후술)

DXGI_FORMAT

dxgi_format은 dxgi에서 사용되는 픽셀포맷(enum)이다.

DXGI_FORMAT_R32G32B32_FLOAT
  32비트 RGB
DXGI_FORMAT_R16G16B16A16_UNORM
DXGI_FORMAT_R32G32_UNIT
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_SNORM
DXGI_FORMAT_R8G8B8A8_SINT
DXGI_FORMAT_R8G8B8A8_UINT
DXGI_FORMAT_R16G16B16A16_TYPELESS

Swap Chain

Swap Chain과 Page flipping
애니메이션이 깜박이는 현상을 방지하기 위해, 미리 화면을 그려 back buffer에 저장하고 front buffer와 교체해준다.
매 프레임마다 화면을 교체해줄 때 front buffer와 back buffer의 역할을 바꿔준다.
이 과정을 presenting이라고 부른다.
direct3d에서는 swap chain은 IDXGISwapChain 인터페이스를 통해 사용된다.

DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
swapChainDesc.BufferCount = 2;  // 더블 버퍼링
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapChainDesc.OutputWindow = hwnd;  // 윈도우 핸들
swapChainDesc.SampleDesc.Count = 1; // 멀티샘플링 없음(다음 글에 설명)
swapChainDesc.Windowed = TRUE;

ComPtr<IDXGISwapChain> swapChain;
dxgiFactory->CreateSwapChain(commandQueue.Get(), &swapChainDesc, &swapChain);

ComPtr<ID3D12Resource> backBuffer;
swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer));

swapChain->Present(1, 0);  // VSync 활성화



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기반 함수들이 반환하는 에러 코드이다.

2025년 3월 30일 일요일

250330 - 블로그 개설 목적

1. 게임 개발 관련 정보, 강좌 등을 기재.

2. 개인 게임 개발 계획 및 진척도 기재.

3. 코딩 관련 정보, 강좌 등을 기재.