- COM(Component Object Model) 객체
- 정의
- 컴포넌트들이 상호 통신할 수 있도록 하는 메커니즘
- 인터페이스(IUnknown 인터페이스)를 통해 상호작용이 가능
- 특징
- 언어 독립성: 어떤 언어로 만들던 다른 언어로 만든 프로그램 모듈처럼 동작 가능
- Binary Standard: 바이너리로 되어있어 이걸 사용하기 위해 특정 언어의 소스가 필요 없음
- Version Control: 예전 버전에서도 사용 가능하고, 새로운 기능 업데이트 되면 버전에 상관없이 호환 가능
- Location Transparency: 해당 컴포넌트의 관계없이 다른 컴포넌트나 프로그램에 의해 사용 가능
- 스마트 포인터 ComPtr<>
- COM 객체들을 할당, 해제할 땐 AddRef(), Release() 함수를 사용하여 하는데 이를 편하고 한번에 관리하기 위해 제공되는 스마트 포인터이다
- wrl.h와 using namespace Microsoft::WRL 을 추가하여 사용이 가능하다
- ID3D11Device
- 정의
- GPU와 통신, 그래픽 리소스 생성하는 핵심 객체
- 리소스 만드는 법
- CreateDevice()
- CreateDeviceAndSwapChain()
- ID3D11DeviceContext
- 정의
- 만들어진 리소스를 렌더링 파이프라인에 연결시켜주는 객체
- IDXGI
- 정의
- 그래픽 소프트웨어의 발전보다 출력하는 하드웨어의 발전이 느리기 때문에 이를 보완하기 위해 만든 인터페이스를 제공하는 API
- 그래픽 관련 리소스 관리와 디스플레이 출력을 관리
- IDXGISwapChain
- 정의
- 프레임을 렌더링 할 버퍼의 연결(큐)로, 주로 이중, 삼중 버퍼링을 설정하는데 사용
- 인터페이스는 프레임을 화면에 출력하는 데 필요한 스왑 체인을 생성 관리. 이 기능은 프레임 간의 전환과 동기화 담당
- CreateDeviceAndSpawnChain
void Game::CreateDeviceAndSpwaChain()
{
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);
}
ComPtr<ID3D11RenderTargetView> renderTargetView;
void Game::CreateRenderTargetView()
{
HRESULT hr;
ComPtr<ID3D11Texture2D> backBuffer{};
hr = swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf());
CHECK(hr);
device->CreateRenderTargetView(backBuffer.Get(), nullptr, renderTargetView.GetAddressOf());
}
D3D11_VIEWPORT viewport;
float clearColor[4] = { 1.0f,0.5f ,0.5f ,0.5f };
void Game::SetViewport()
{
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
viewport.Width = static_cast<float>(width);
viewport.Height = static_cast<float>(height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
}
void Game::Render()
{
RenderBegin();
RenderEnd();
}
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);
}
- 결과

- 리소스를 만들어 GPU로 백버퍼에 그림을 그린 뒤 전면 버퍼로 복사해 주어 출력해준 것이다