728x90
반응형
각 기능의 분리
지난 포스팅까지 렌더링에서 필요한 구성이 무엇이 있는가와 어떤 역할을 수행하는지에 대해 알아보았다. 하지만 한 클래스안에 랜더링 과정을 몰아서 랜더링을 하게 될 경우 다음과 같은 것을 고려해보아야한다.
- 클래스에 종속되어야 되는 것은 무엇인가?
- 객체에 종속되어야 되는 것은 무엇인가?
- 리소스에 속해야 되는 것은 무엇인가?
즉, 각 기능에 따라 서로 종속되어야 될것들이 다르기 때문에 한 클래스에 모두 구현 하는 것은 메모리 낭비로 이어질 수 있기에 각 기능을 분리하여야 하며, 이번 포스팅에서는
Device 생성
이 클래스에서는 장치 초기화 관련된 Device장치가 수행하는 것들과 Render Begin/End에 관한 것들을 넣고자한다.
//Graphics.h
class Graphics
{
public:
Graphics(HWND hwnd);
~Graphics();
void RenderBegin();
void RenderEnd();
private:
void CreateDeviceAndSwapChain();
void CreateRenderTargetView();
void SetViewport();
ComPtr<ID3D11Device> _device = nullptr;
ComPtr<ID3D11DeviceContext> _deviceContext = nullptr;
ComPtr<IDXGISwapChain>_swapChain = nullptr;
ComPtr<ID3D11RenderTargetView> _renderTargetView;
}
Graphics::Graphics(HWND hwnd)
{
_hwnd = hwnd;
CreateDeviceAndSwapChain();
CreateRenderTargetView();
SetViewport();
}
void Graphics::RenderBegin()
{
_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), nullptr);
_deviceContext->ClearRenderTargetView(_renderTargetView.Get(), _clearColor);
_deviceContext->RSSetViewports(1, &_viewport);
}
void Graphics::RenderEnd()
{
HRESULT hr = _swapChain->Present(1, 0);//후면버퍼를 고속복사함
}
void Graphics::CreateDeviceAndSwapChain()
{
DXGI_SWAP_CHAIN_DESC desc;
ZeroMemory(&desc, sizeof(desc));
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;
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()
);
}
void Graphics::CreateRenderTargetView()
{
HRESULT hr;
ComPtr<ID3D11Texture2D>backbuffer = nullptr;
hr = _swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backbuffer.GetAddressOf());
CHECK(hr);
_device->CreateRenderTargetView(backbuffer.Get(), nullptr, _renderTargetView.GetAddressOf());
}
void Graphics::SetViewport()
{
_viewport.TopLeftX = 0.f;
_viewport.TopLeftY = 0.f;
_viewport.Width = static_cast<float>(GWinSizeX);
_viewport.Height = static_cast<float>(GWinSizeY);
_viewport.MinDepth = 0.f;
_viewport.MaxDepth = 1.f;
}
CreateDeviceAndSwapChain:Device와 DeviceContext,SwapChain을 생성하는 단계이다. 여러가지 설정을 할수 있으며 자세한 것은 상황에 맞게 찾아보는것이 좋다.
CreateRenderTargetView:SwapChain을 이용하여 후면버퍼를 지정하고, Device를 통해 지정한 후면버퍼를 RederTargetView로 지정하는것을 수행한다.
SetViewport:사용자의 화면설정
728x90
반응형
'게임엔진 > DirectX' 카테고리의 다른 글
DX) 6. Tessellation (0) | 2023.06.01 |
---|---|
DX) 4. IA(InputAssembler) (0) | 2023.03.03 |
DX)2.렌더링파이프라인 가이드 (0) | 2023.03.03 |
DX)1.렌더링 파이프라인 (0) | 2023.02.11 |
DirectX) 프로젝트 설정 (0) | 2022.02.26 |
댓글