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 |