DirectX/DirectX 2D_(구)

DX Window 창에 연동

컴맹학자 2020. 11. 4. 19:19
728x90

1. 코드

Graphics cpp 파일

Graphics.cpp 파일

#include "stdafx.h"
#include "Graphics.h"


void Graphics::Initialize()
{
	//Swap Chin 정의
	DXGI_SWAP_CHAIN_DESC desc;
	{
		ZeroMemory(&desc, sizeof(DXGI_SWAP_CHAIN_DESC));
		desc.BufferDesc.Width = 0;
		desc.BufferDesc.Height = 0;
		desc.BufferDesc.RefreshRate.Numerator = 60;	   // 화면 주사율 (분자)
		desc.BufferDesc.RefreshRate.Denominator = 1;   // 화면 주사율 (분모) 60초당 1
		desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 형식 데이터 (RGBA 에다가 8비트씩)
		desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;  // 라인관련
		desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;				  // 확대 축소 관련
		desc.BufferCount = 1;        // 버퍼 갯수
		desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // 버퍼를 어떤용도로 사용 할껀지
		desc.SampleDesc.Count = 1;	 // 엘리어싱 관련
		desc.SampleDesc.Quality = 0; // 픽셀 관련
		desc.OutputWindow = Settings::Get().GetWindowsHandle(); // 어느 윈도우에서 그릴건지
		desc.Windowed = TRUE;
		desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // 스왑할때 효과
	}

	//버젼
	std::vector<D3D_FEATURE_LEVEL> feature_levels
	{
		D3D_FEATURE_LEVEL_11_1,
		D3D_FEATURE_LEVEL_11_0,
		D3D_FEATURE_LEVEL_10_1,
		D3D_FEATURE_LEVEL_10_0,
	};

	//스왑 체인, 디바이스 한번에 만들기
	auto hr = D3D11CreateDeviceAndSwapChain
	(
		nullptr,
		D3D_DRIVER_TYPE_HARDWARE, // 그래픽 카드 가속 방법
		nullptr,
		0, // 기능
		feature_levels.data(), // 버젼 
		feature_levels.size(), // 버젼의 갯수
		D3D11_SDK_VERSION, // SDK 버젼
		&desc,
		&swap_chain,
		&device,
		nullptr, // 사용하게될 기능을 반환
		&device_context
	);

	assert(SUCCEEDED(hr)); //검사
}

void Graphics::Begin()
{
	//OM  그려질 갯수 ( 1 ~ 8 )
	device_context->OMSetRenderTargets(1, &render_target_view, nullptr);
	//RS
	device_context->RSSetViewports(1, &viewport);
	//백버퍼 삭제
	device_context->ClearRenderTargetView(render_target_view, clear_color);
}

void Graphics::End()
{
	//그림을 교환
	auto hr = swap_chain->Present(1, 0);
	assert(SUCCEEDED(hr));
}

desc 만드는 함수 에서 desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;  추가

Graphics헤더 파일

Graphics.h 파일
class Graphics final
{
public:
	//그리기 관련
	void Begin();
	void End();
};

Setting헤더 파일

Settings.h파일

#pragma once
#include "stdafx.h"

//Singletone Pattern (디자인 패턴 종류중 1개)
//하나만 생성함
class Settings final
{
public:
	static Settings& Get()
	{
		static Settings instace;
		return instace;
	}

	//함수뒤 const 키워드 붙이면 내부에서 사용되는 맴버 변수가 상수화 된다
	auto GetWindowsHandle() const-> HWND { return handle; }
	void SetWindowsHandle(HWND handle) { this->handle = handle; }

	auto GetWidth() const-> const float& { return width; };
	void SetWidth(const float& width) { this->width = width; }

	auto GetHight() const-> const float& { return height; };
	void SetHight(const float& height) { this->height = height; }

private:
	Settings() = default; // {} 만 써놓은 효과
	~Settings() = default;

private:
	HWND handle = nullptr;
	float width = 0.0f;
	float height = 0.0f;
};

Execute헤더 파일

Execute.h 파일
#pragma once
//관리 하는 클래스
class Execute final
{
public:
	Execute();
	~Execute();

	void Update();
	void Render();
private:
	class Graphics* graphics = nullptr; // 전방선언 
};

메인.

Execute.cpp 파일
#include"stdafx.h"
#include"Execute.h"
#include "Graphics.h"

Execute::Execute()
{
	graphics = new Graphics();
	graphics->Initialize();
	graphics->CreateBackBuffer
	(
		static_cast<uint>(Settings::Get().GetWidth()),
		static_cast<uint>(Settings::Get().GetHight())
	);
}

Execute::~Execute()
{
	SAFE_DELETE(graphics);
}

void Execute::Update()
{

}

void Execute::Render()
{
	//그려질 시작
	graphics->Begin();
	{


	}
	//삭제
	graphics->End();
}

 

main.cpp 파일
#include "stdafx.h" //여러 함수
#include "Window.h" //윈도우 관련
#include "Execute.h" // DX 화면에 출력

//메인창
int APIENTRY WinMain(HINSTANCE hInstace, HINSTANCE prevInstatce, LPSTR lpszCmdParam, int nCmdShow)
{
	Window::Create(hInstace, 500, 500);
	Window::Show();

	Settings::Get().SetWindowsHandle(Window::global_handle);
	Settings::Get().SetWidth(static_cast<float>(Window::GetWidth()));
	Settings::Get().SetHight(static_cast<float>(Window::GetHight()));

	Execute* execute = new Execute();

	while (Window::Update())
	{
		execute->Update();
		execute->Render();
	}

	SAFE_DELETE(execute);
	Window::Destroy();
	return 0;
}

2. 관계도

설명이좀 이상하게 됬지만... 간단히 정리하면

Windows : 윈도우창 띄우기 위한 파일

Setting : 윈도우 관련 정보를 저장 (HWND, width, hight)

Execute : 애를 통해서 그려지고 내부에서 Graphics 관련 초기화 있음

Graphics : Execute를 통해서 초기화를 하고 Setting을 통해서 윈도우 정보를 가져옴


3. 실행


4. 추가 및 요약

 

1. 추가, 수정, 새로생긴 파일및 폴더 내용만 코드 올리기로 변경

 

2. Execute class 를 통해서 DX를 출력 생성 관리를 함

 

3. Execute Render() 함수안에 graphic-> Begin(), End() 중간 괄호 안에 이제 그려줄 내용을 그리면 됨

'DirectX > DirectX 2D_(구)' 카테고리의 다른 글

DX 공간 변환  (0) 2020.11.05
DX indexbuffer, 공간변환(이론)  (0) 2020.11.05
DX Render  (0) 2020.11.05
DX 초기화, 설정, 삭제  (0) 2020.11.04
Window 화면 설정  (0) 2020.11.04