게임엔진/DirectX

DX)3.Device

PJNull 2023. 3. 3.
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

댓글