Replicated

장치 초기화 본문

DirectX 11

장치 초기화

라구넹 2026. 8. 1. 00:27
ComPtr< ID3D11Device > _device;
ComPtr< ID3D11DeviceContext > _deviceContext;
ComPtr< IDXGISwapChain > _swapChain;

 

_device : 리소스 생성

_deviceContext : GPU에 명령 발행

_swapChain : 화면 출력 

 

void Game::Init(HWND hand)
{
	_hwnd = hand;
	_width = GWinSizeX;
	_height = GWinSizeY;

	CreateDeviceAndSwapChain();
	CreateRenterTargetView();
	SetViewPort();
}

초기화 진입점.

순서는 강제. 스왑체인이 있어야 백버퍼를 꺼낼 수 있고, 백버퍼가 있어야 RTV(Render Target View)를 만들 수 있음

 

void Game::CreateDeviceAndSwapChain()
{
	DXGI_SWAP_CHAIN_DESC desc;
	ZeroMemory(&desc, sizeof(desc));

	{
		desc.BufferDesc.Width = _width;
		desc.BufferDesc.Height = _height;
		desc.BufferDesc.RefreshRate.Numerator = 60;
		desc.BufferDesc.RefreshRate.Denominator = 1;
		desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
		desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
		desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
		desc.SampleDesc.Count = 1;
		desc.SampleDesc.Quality = 0;
		desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
		desc.BufferCount = 1;
		desc.OutputWindow = _hwnd;
		desc.Windowed = true;
		desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
	}

	HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
		nullptr,
		D3D_DRIVER_TYPE_HARDWARE,
		nullptr,
		0,
		nullptr,
		0,
		D3D11_SDK_VERSION,
		&desc,
		_swapChain.GetAddressOf(),
		_device.GetAddressOf(),
		nullptr,
		_deviceContext.GetAddressOf()
	);

	CHECK(hr);
}

디바이스, 디바이스 컨텍스트, 스왑체인 생성

desc 밀어버리는 건 DX가 쓰레기값 진짜값으로 오인하는 경우가 있음

 

DXGI_SWAP_CHAIN_DESC

- 인자용 구조체

- Width, Height : 백버퍼 해상도로 창 크기와 별개

- RefreshRate : 주사율, 전체 화면에서만 유효

- Format : 픽셀 저장 방식

- Count : 픽셀 당 샘플 수로 1 = MSAA 끔. 안티 앨리어싱 관련 필드

- BufferUsage : 버퍼 용도 선언

- BufferCount : 백버퍼 개수

- OutputWindow : 출력 대상 윈도우

- SwapEffect : 프레젠트 후 백버퍼 처리 방식

 

RefreshRate가 분수인건 실제 모니터가 59.94Hz ( 60000/1001 )같은 값이라..

 

DXGI_FORMAT_R8G8B8A8_UNORM

- 채널당 8비트로 총 32비트

 

desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;

 이 버퍼는 렌더링 용이다 미리 정해놔야 GPU가 세팅함

 

desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

화면에 직접 그리면 그려지는 과정이 보여서 티어링 생기니까 백버퍼에 완성하고 교체하는데

디스카드는 교체 후 이전 내용을 버린다는 뜻

 

D3D_DRIVER_TYPE_HARDWARE

GPU 하드웨어 가속

 

void Game::CreateRenterTargetView()
{
	HRESULT hr;

	ComPtr<ID3D11Texture2D> backBuffer = nullptr;
	hr = _swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf());
	CHECK(hr);

	hr = _device->CreateRenderTargetView(backBuffer.Get(), nullptr, _renderTargetView.GetAddressOf());
	CHECK(hr);

}

1. 백버퍼(리소스) 꺼내기

스왑체인이 내부적으로 들고 있는 백버퍼를 꺼냄

__uuidof는 이 인터페이스로 달라는 요청.

 

2. 뷰 만들기

리소스는 뷰와 다름. GPU는 리소스에 직접 접근하지 않고 항상 뷰를 통해 접근

리소스: 실제 픽셀이 담긴 메모리 덩어리, 백버퍼

렌더 타겟 뷰 : 해당 메모리를 렌더 타겟으로 해석하라는 설명서

 

같은 텍스처 하나를 이번 패스에선 그릴 대상(RTV)로, 다음 패스에선 셰이더가 읽는 텍스처(SRV)로 쓸 수 있음

그때마다 다른 뷰를 만들어 끼움

 

의미
RTV (Render Target View) 여기다 그린다
SRV (Shader Resource View) 셰이더에서 읽는다
DSV (Depth Stencil View) 깊이, 스텐실 판정
UAV (Unordered Accessn View) 셰이더에서 읽고 쓴다

 

void Game::RenderBegin()
{
	_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), nullptr);
	_deviceContext->ClearRenderTargetView(_renderTargetView.Get(), _clearColor);
	_deviceContext->RSSetViewports(1, &_viewport);
}

매 프레임 렌더 준비

함수 접두사 == 파이프라인 단계

 

단계
IA (Input Assembler)
VS (Vertex Shader)
RS (Rasterizer)
PS (Pixel Shader)
OM (Output Shader)

 

void Game::RenderEnd()
{
	HRESULT hr = _swapChain->Present(1, 0);
	CHECK(hr);
}

완성된 백버퍼 화면과 교체

첫 인자는 VSync, 수직 동기화임

 

 

'DirectX 11' 카테고리의 다른 글

Constant Buffer  (0) 2026.08.01
텍스처, UV  (0) 2026.08.01
삼각형 띄우기  (0) 2026.08.01
Windows API로 진입점 만들기  (0) 2025.04.07
그래픽스 개요  (0) 2025.04.06