DirectX 11 스터디 노트 - 장치 초기화 (Create Device)
DeviceAndSwapChain 생성
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
&desc,
_swapChain.GetAddressOf(),
_device.GetAddressOf(),
nullptr,
_deviceContext.GetAddressOf()
);
D3D11CreateDeviceAndSwapChain 함수
(디스플레이 어댑터와 렌더링에 사용되는 스왑 체인을 나타내는 디바이스를 만듭니다.)
https://learn.microsoft.com/ko-kr/windows/win32/api/d3d11/nf-d3d11-d3d11createdeviceandswapchain
DXGI_SWAP_CHAIN_DESC 구조체
https://learn.microsoft.com/ko-kr/windows/win32/api/dxgi/ns-dxgi-dxgi_swap_chain_desc
RenderTargetVIew 생성
DX11에서 View 라는 용어는 Description 의 의미를 갖고, 자원을 설명해주는 객체를 의미한다고 이해하면 좋다.
ComPtr<ID3D11Texture2D> backBuffer = nullptr;
_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf());
_device->CreateRenderTargetView(backBuffer.Get(), nullptr, _renderTargetView.GetAddressOf());
SwapChain 을 통해 Buffer 를 가져와서
Device 로 RenderTargetView 를 생성.
__uuidof 연산자
https://learn.microsoft.com/ko-kr/cpp/cpp/uuidof-operator?view=msvc-170
Viewport 설정
void Game::SetViewport()
{
_viewport.TopLeftX = 0.f;
_viewport.TopLeftY = 0.f;
_viewport.Width = static_cast<float>(_width);
_viewport.Height = static_cast<float>(_height);
_viewport.MinDepth = 0.f;
_viewport.MaxDepth = 1.f;
}
Render Begin/End
렌더링을 시작하고 종료하는 함수를 작성. DeviceContext 를 활용해서 필요한 함수를 호출.
OM = Output Merge
void Game::RenderBegin()
{
_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), nullptr);
_deviceContext->ClearRenderTargetView(_renderTargetView.Get(), _clearColor);
_deviceContext->RSSetViewports(1, &_viewport);
}
void Game::RenderEnd()
{
HRESULT hr = _swapChain->Present(1, 0);
CHECK(hr);
}
순서
// IA - VS - RS - PS - OM
// Input Assembler
// Vertex Shader
// Rasterizer Stage
// Pixel Shader
// Output Merger
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas
<DirectX 12를 이용한 3D 게임 프로그래밍 입문> 구입 링크
https://link.coupang.com/a/8V4Wq
(링크를 통해 도서 구입시 일정액의 수수료를 지급받습니다.)