[Graphics] 초기화

2025. 4. 6. 18:38·게임개발/Graphics

초기화 결과물

 

Game.h

#pragma once

class Game
{
public:
	Game();
	~Game();

public:
	void Init(HWND hwnd);
	void Update();
	void Render();

private:
	void RenderBegin();
	void RenderEnd();

private:
	/* 결과물을 그릴 백 버퍼 생성 */
	void CreateDeviceAndSwapChain();
	/* 백 퍼버에 대한 포인터, GPU가 목표 버퍼에 접근할 수 있도록 해주는 랜더타겟 뷰 객체 생성 */
	void CreateRenderTargetView();
	void SetViewport();

private:
	HWND _hwnd;
	uint32 _width = 0;
	uint32 _height = 0;
	float _clearColor[4] = { 0.5f, 0.5f , 0.5f , 0.5f };

private:
	/* DirectX */
	// ComPtr을 사용하면 ref count 신경쓰지 않아도 알아서 관리됨, wrl에 포함됨
	// ID3D11Device : 디바이스 인터페이스, 지원 점검과 자원 할당에 사용됨, unit 생성
	// ID3D11DeviceContext : 렌더링 명령을 생성하는 디바이스 컨텍스트, unit에 명령
	ComPtr<ID3D11Device> _device = nullptr;
	ComPtr<ID3D11DeviceContext> _deviceContext = nullptr;
	// SwapChain : 렌더링된 데이터를 출력에 표시하기 전에 저장하기 위해 하나 이상의 표면을 구현
	ComPtr<IDXGISwapChain> _swapChain = nullptr;

	/* RenderTarget View */
	ComPtr<ID3D11RenderTargetView> _renderTargetView;

	/* Misc : 잡다한 것들 */
	// D3D11_VIEWPORT : 화면을 묘사하는 구조체
	D3D11_VIEWPORT _viewport = {0};
};

 

Game.cpp

#include "pch.h"
#include "Game.h"

Game::Game()
{
}

Game::~Game()
{
}

void Game::Init(HWND hwnd)
{
	_hwnd = hwnd;
	_width = GWinSizeX;
	_height = GWinSizeY;

	CreateDeviceAndSwapChain();
	CreateRenderTargetView();
	SetViewport();
}

void Game::Update()
{
}

void Game::Render()
{
	/* 랜더링 시작 */
	RenderBegin();

	//TODO

	/* 랜더링 끝 */
	RenderEnd();
}

void Game::RenderBegin()
{
	/* view 개수, renderTargetView 주소, DepthStencilView(픽셀이 얼마나 깊이 있는지(Z값) */
	_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), nullptr);
	/* renderTargetView 색 초기화 */
	_deviceContext->ClearRenderTargetView(_renderTargetView.Get(), _clearColor);
	/* viewport 설정 */
	_deviceContext->RSSetViewports(1, &_viewport);
}

void Game::RenderEnd()
{
	/* rendering 결과물을 전면버퍼에 복사한 후 화면에 출력 */
	HRESULT hResult = _swapChain->Present(1, 0);
	CHECK(hResult);
}

void Game::CreateDeviceAndSwapChain()
{
	DXGI_SWAP_CHAIN_DESC desc;
	// memset과 같음, 배열 값 0으로 모두 초기화
	ZeroMemory(&desc, sizeof(desc));

	{
		/* 버퍼 크기 초기화 */
		desc.BufferDesc.Width = _width;
		desc.BufferDesc.Height = _height;
		/* 화면 주사율, 1초에 화면에 표시되는 이미지 수. (Numerator = 분자, Denominator = 분모) */
		desc.BufferDesc.RefreshRate.Numerator = 60;
		desc.BufferDesc.RefreshRate.Denominator = 1;
		/* Display Format : RGBA 8-bit */
		desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
		/* 주사선 그리기 모드 unspecified */
		desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
		desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
		/* 픽셀단위 계단현상 보간 옵션, 1이면 MSAA 비활성화 */
		desc.SampleDesc.Count = 1;
		desc.SampleDesc.Quality = 0;
		/* 해당 버퍼를 최종 결과물을 그리는 용도로 사용 */
		desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
		/* 백 버퍼 1개 사용 */
		desc.BufferCount = 1;
		/* 출력 창 = _hwnd */
		desc.OutputWindow = _hwnd;
		/* 창모드로 실행 */
		desc.Windowed = TRUE;
		/* 렌더링 끝나고 프레젠트(화면에 보여주기)한 다음, 백 버퍼 내용은 버림 */
		desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
	}

	/*	DirectX 11 디바이스(Device), 디바이스 컨텍스트(Context), 스왑 체인(SwapChain) 생성
	* 
		D3D_DRIVER_TYPE : hardware (그래픽카드를 사용하겠다),
		D3D_FEATURE_LEVEL : DX몇 버전에 해당하는 기능 지원,
	*/
	HRESULT hResult = ::D3D11CreateDeviceAndSwapChain(
		nullptr,							// 기본 어댑터 사용
		D3D_DRIVER_TYPE_HARDWARE,			// GPU(하드웨어 가속) 사용
		nullptr,							// 소프트웨어 드라이버 없음
		0,									// 플래그 (디버그 모드 등)
		nullptr, 0,							// 피처 레벨 자동 선택 (DX11 우선)
		D3D11_SDK_VERSION,					// SDK 버전
		&desc,								// 스왑 체인 설정 정보
		_swapChain.GetAddressOf(),			// 생성된 스왑 체인 저장
		_device.GetAddressOf(),				// 생성된 디바이스 저장
		nullptr,							// 실제 선택된 피처 레벨은 무시
		_deviceContext.GetAddressOf()		// 생성된 디바이스 컨텍스트 저장
	);

	/* false라면 crash발생시킴 assert(SUCCEEDED(hResult))는 CHECK(hResult). pch에 정의함 */
	CHECK(hResult);
}

void Game::CreateRenderTargetView()
{
	HRESULT hResult;
	ComPtr<ID3D11Texture2D> backBuffer = nullptr;
	// _swapChain에서 0번째 버퍼(ID3D11Texture2D)를 얻어 backBuffer 포인터에 저장
	hResult = _swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf());
	CHECK(hResult);

	// backBuffer를 기반으로 렌더 타겟 뷰 생성 후 _renderTargetView에 저장
	_device->CreateRenderTargetView(backBuffer.Get(), nullptr, _renderTargetView.GetAddressOf());
	CHECK(hResult);
}

void Game::SetViewport()
{
	/* 시작 위치 */
	_viewport.TopLeftX = 0.f;
	_viewport.TopLeftY = 0.f;
	/* 너비와 높이 */
	_viewport.Width = static_cast<float>(_width);
	_viewport.Height = static_cast<float>(_height);
	/* 깊이 */
	_viewport.MinDepth = 0.f;
	_viewport.MaxDepth = 1.f;
}

'게임개발 > Graphics' 카테고리의 다른 글

[Graphics] Constant Buffer  (0) 2025.04.07
[Graphics] 텍스처와 UV  (0) 2025.04.07
[Graphics] 삼각형 띄우기  (0) 2025.04.07
[Graphics] 프로젝트 시작  (0) 2025.04.02
[Graphics] DirectX 11 기초  (0) 2025.04.02
'게임개발/Graphics' 카테고리의 다른 글
  • [Graphics] 텍스처와 UV
  • [Graphics] 삼각형 띄우기
  • [Graphics] 프로젝트 시작
  • [Graphics] DirectX 11 기초
Mingurii
Mingurii
minkyeong's devlog
  • Mingurii
    Mingurii
    Mingurii
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 알고리즘 - 기초 (8)
        • 재귀 (0)
        • 누적합 (8)
        • 최소신장트리 (0)
      • 알고리즘 (32)
        • 구현 (0)
        • DP (30)
        • DFS, BFS (0)
        • 백트래킹 (0)
        • 투포인터 (2)
        • 이진탐색 (0)
        • 그리디 (0)
        • 다익스트라 (0)
        • 크루스칼, 프림 (0)
        • 위상정렬 (0)
        • 플로이드-워셜 (0)
        • 유니온 파인드 (0)
        • 세그먼트 트리 (0)
      • 게임개발 (11)
        • Gameplay Ability System (0)
        • Graphics (11)
        • Lyra 분석 (0)
        • 다크 앤 다커 클론 코딩 (0)
        • After the Farmer Sleeps (0)
      • 서버 (2)
        • 공부 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    DP
    c++
    코테
    알고리즘
    1749
    9655
    서버
    DX11
    누적합
    코딩테스트
    2294
    2293
    그래픽스
    DirectX11
    행렬
    20438
    2167
    투포인터
    게임수학
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Mingurii
[Graphics] 초기화
상단으로

티스토리툴바