서의 공간
[T11] Graphics class 본문
중요하지 않다고 생각되는 과정은 생략했다. 예를 들어 키보드를 추가하는 부분. 필요하다고 생각되면 추가하겠다. 다음은 현재까지의 프레임워크 구조이다(Graphics 클래스 포함).
재차 확인해야 할 것은 위 그림의 구조는 클래스 간의 '상속'관계를 나타내는 것이 아니라는 점이다. 포함관계라고 생각하자.
핵심 개념
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