18 Graphics

한경식·2024년 12월 17일
#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;
}
  • 세분화

    • 강의에서 Engine을 만들 때 Pipeline순으로 만들것이다
    • 처음으로 Graphics담당하는 부분을 따로 클래스로 때서 만든 것이다
    • CreateDeviceAndSpwaChain
      • GPU와 통신할 Device 생성한 뒤 GPU에 명령을 설정/실행할 DeviceContext 생성
      • 렌더링된 결과를 화면에 출력할 Swapchain 생성
    • CreateRenderTargetView
      • GPU가 렌더링 결과를 출력할 수 있는 특정 자원을 가리키는 객체
      • 화면에 그릴 데이터를 저장하는 공간인 벡버퍼와 그 공간을 연결하는 역할
    • SetViewport
      • 렌더링될 공간을 설정
    • 기존에 만들었던 이 함수들을 Graphics클래스로 옮기는 과정이다
  • 연결하기

    • shared_ptr<>스마트 포인터로 만든 Graphics 객체를 만들어 동적으로 객체를 만들어 필요할 때 그림을 그리고 필요없을 땐 메모리를 해제하는 식으로 사용할 수 있게 해준다
    • make_shared<>는 스마트 포인터로 만든 객체를 동적으로 할당하는 방법이다
    • 이 과정을 통해 GPU에 그림을 그릴 준비를 해준다다
profile
게임 개발 지망생

0개의 댓글