서의 공간

[T11] Graphics class 본문

Graphics API/DirectX 11 - Chili

[T11] Graphics class

홍서의 2020. 11. 27. 14:20

중요하지 않다고 생각되는 과정은 생략했다. 예를 들어 키보드를 추가하는 부분. 필요하다고 생각되면 추가하겠다. 다음은 현재까지의 프레임워크 구조이다(Graphics 클래스 포함).

[그림 11.1] 프레임워크 구조

재차 확인해야 할 것은 위 그림의 구조는 클래스 간의 '상속'관계를 나타내는 것이 아니라는 점이다. 포함관계라고 생각하자.

 

핵심 개념

1. ID3D11Device: 장치 인터페이스는 가상 어댑터에 해당한다. 자원을 만드는 데 사용된다. 가상의 디스플레이 어댑터 즉, 그래픽카드인지 아니면 그래픽카드와 나를 연결시켜주는 매개체인 건지 불분명하다.

2. IDXGISwapChain: 렌더링 된 데이터를 출력에 표시하기 전에 저장하기 위한 하나 이상의 표면을 구현한다. 그 표면은 백버퍼라고 한다.

3. ID3D11DeviceContext: 렌더링 명령을 생성하는 장치 컨텍스트에 해당한다.

4. ID3D11RenderTargetView: 렌더링 중에 액세스 할 수 있는 render-target subresources를 식별한다.
[Subresources MSDN]: Subresources (Direct3D 11 Graphics) - Win32 apps | Microsoft Docs


Graphics 클래스

더보기

Graphics.h

#pragma once
#include "ChiliWin.h"
#include <d3d11.h>

class Graphics
{
public:
	Graphics( HWND hWnd );
	Graphics( const Graphics& ) = delete;
	Graphics& operator=( const Graphics& ) = delete;
	~Graphics();
	void EndFrame();
	void ClearBuffer( float red,float green,float blue ) noexcept;
private:
	ID3D11Device* pDevice = nullptr;
	IDXGISwapChain* pSwap = nullptr;
	ID3D11DeviceContext* pContext = nullptr;
	ID3D11RenderTargetView* pTarget = nullptr;
};

Graphics.cpp

#include "Graphics.h"

#pragma comment(lib,"d3d11.lib")

Graphics::Graphics( HWND hWnd )
{
	// SwapChain을 만들기전에 Description 먼저 작성한다.
	DXGI_SWAP_CHAIN_DESC sd = {};
	sd.BufferDesc.Width = 0;	// 해상도(화질, 선명함의 정도)의 너비
	sd.BufferDesc.Height = 0;	// 해상도(화질, 선명함의 정도)의 높이
	sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;	// 대부분 이 포맷을 사용
	sd.BufferDesc.RefreshRate.Numerator = 0;	// 주사율, 분자
	sd.BufferDesc.RefreshRate.Denominator = 0;	// 주사율, 분모
	// 주어진 모니터의 해상도에 맞게 이미지가 늘어나는 방식을 설정
	sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; 
	/* 래스터가 표면에 이미지를 만드는 데 사용하는 방법을 설정,
	   순차 주사 방식 또는 비월 주사 방식을 검색해보자.*/
	sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;	
	sd.SampleDesc.Count = 1;	// SamplaDesc: 멀티 샘플링을 설정하는 구조체
	sd.SampleDesc.Quality = 0;
	/* 표면(백버퍼)를 위한 사용방법 설정,
	   백버퍼는 셰이더의 입력 또는 렌더 타겟 아웃풋이 될 수 있다. */
	sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;	 
	sd.BufferCount = 1;		// SwapChain의 버퍼 수
	sd.OutputWindow = hWnd;	// Window 핸들
	sd.Windowed = TRUE;		// TRUE -> 창 모드(전체화면 모드가 아닌)
	sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;	// 화면을 표시한 후 설정할 효과
	sd.Flags = 0;	// SwapChain 옵션 플래그

	// create device and front/back buffers, and swap chain and rendering context
    // 디바이스와 프론트/백 버퍼를 만든다.
	D3D11CreateDeviceAndSwapChain(
		nullptr,
		D3D_DRIVER_TYPE_HARDWARE,
		nullptr,
		0,
		nullptr,
		0,
		D3D11_SDK_VERSION,
		&sd,
		&pSwap,
		&pDevice,
		nullptr,
		&pContext
	);
    
    /* 
		SwapChain의 백버퍼를 얻어와서 백버퍼에 대한 뷰를 생성한다. 
		일종의 자원인 백버퍼를 파이프라인에 직접 바인딩하지 않는다.
		대신 자원에 대한 또 하나의 뷰를 만들고, 그 뷰를 파이프라인에 바인딩한다.
		뷰를 자원을 바라보는 또 하나의 시야라고 생각할 수 있다.
		또는 그냥 백버퍼에 대한 참조형 변수를 만든다라고 생각해버리자.
        백버퍼를 통해 RenderTargetView를 생성하고, 백버퍼를 필수로 해제한다.
        백버퍼의 포인터 변수인 pBackBuffer는 더 이상 사용할 필요가 없기 때문이다.
        RenderTargetView가 대신 역할을 맡아줄 것이다.
	*/
	// gain access to texture subresource in swap chain (back buffer)
	ID3D11Resource* pBackBuffer = nullptr;
	pSwap->GetBuffer( 0,__uuidof(ID3D11Resource),reinterpret_cast<void**>(&pBackBuffer) );
	pDevice->CreateRenderTargetView(
		pBackBuffer,
		nullptr,
		&pTarget
	);
	pBackBuffer->Release();
}

Graphics::~Graphics()
{
	if( pTarget != nullptr )
	{
		pTarget->Release();
	}
	if( pContext != nullptr )
	{
		pContext->Release();
	}
	if( pSwap != nullptr )
	{
		pSwap->Release();
	}
	if( pDevice != nullptr )
	{
		pDevice->Release();
	}
}

void Graphics::EndFrame()
{
	pSwap->Present( 1u,0u );
}

/*
	백버퍼를 주어진 색상으로 지운다. 
    '지운다'라는 개념은 그 색상으로 백버퍼를 채운다는 의미이다.
    빨간색으로 지운다 -> 백버퍼를 빨간색으로 채운다.
*/
void Graphics::ClearBuffer( float red,float green,float blue ) noexcept
{
	const float color[] = { red,green,blue,1.0f };
	pContext->ClearRenderTargetView( pTarget,color );
}

'Graphics API > DirectX 11 - Chili' 카테고리의 다른 글

[T16.1] Draw Triangle  (0) 2020.11.28
[T16.0] DirectX 11 파이프라인  (0) 2020.11.28
[T6] Window class  (0) 2020.11.27
[T3] Message Loop  (0) 2020.11.27
[T2] Create and show window  (0) 2020.11.27
Comments