#include "pch.h"
#include "Graphics.h"
Graphics::Graphics(HWND hWnd)
{
hwnd = hWnd;
CreateDeviceAndSpwaChain();
CreateRenderTargetView();
SetViewport();
}
Graphics::~Graphics()
{
}
void Graphics::RenderBegin()
{
//GPU가 그림을 그리는 것까지 성공하며 렌더링파이프라인에 OM에 후면버퍼나 전면버퍼에 그려달라고 전해주는 함수
deviceContext->OMSetRenderTargets(1, renderTargetView.GetAddressOf(), nullptr);
deviceContext->ClearRenderTargetView(renderTargetView.Get(), clearColor);
deviceContext->RSSetViewports(1, &viewport);
}
void Graphics::RenderEnd()
{
//후면 버퍼에서 전면 버퍼로 복사해서 출력해주는 함수로 중요하다
HRESULT hr = swapChain->Present(1, 0);
CHECK(hr);
}
void Graphics::CreateDeviceAndSpwaChain()
{
DXGI_SWAP_CHAIN_DESC desc;
ZeroMemory(&desc, sizeof(desc));//== memset과 같다
{
//버퍼의 해상도를 지정
desc.BufferDesc.Width = GWinSizeX;
desc.BufferDesc.Height = GWinSizeY;
//분자/분모를 통해 해상도를 만듦
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;
//GPU가 연산이 끝났을 때 최종 결과물을 그려주는 역할로 사용하겠다 라는 옵션
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
//후면버퍼 갯수
desc.BufferCount = 1;
//윈도우 헨들
desc.OutputWindow = hwnd;
desc.Windowed = true;
desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
}
////스마트 포인터를 사용하기 때문에 함수를 통해 꺼내야함, D3D11Device* a;
//device.Get();//현재 D3D11Device의 값을 꺼내줌, a
//device.GetAddressOf();//현재 D3D11Device의 값의 주소값을 꺼내줌, &a
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &desc, swapChain.GetAddressOf(), device.GetAddressOf(), nullptr, deviceContext.GetAddressOf());
//D3D_DRIVER_TYPE_ 내가가진 그래픽을 그릴 수 있는 놈을 선택
CHECK(hr);
}
void Graphics::CreateRenderTargetView()
{
HRESULT hr;
ComPtr<ID3D11Texture2D> backBuffer{};
//swapChain에 만들어 놓은 백버퍼에서 texture 리소스를 ID3D11Texture2D로 넘겨줌
hr = swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf());
CHECK(hr);
device->CreateRenderTargetView(backBuffer.Get(), nullptr, renderTargetView.GetAddressOf());
}
void Graphics::SetViewport()
{
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
viewport.Width = static_cast<float>(GWinSizeX);
viewport.Height = static_cast<float>(GWinSizeY);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
}
세분화
연결하기