함수,인자가 엄청 많기 때문에
다이렉트 11을 공부할 때는 나무보다는 숲을 봐야한다.
옵션 - 특이점이 있는지만 파악하기
틀을 공부하자
유용한 팁
// I: 인터페이스 Com객체-> 생성은 함수의 결과 값 제거-> release
ID3D11Device* _device;
ID3D11DeviceContext* _deviceContext;
이거보다는
ComPtr<ID3D11Device> _device; 자동으로 관리해주는 스마트 포인터가 좋다
//Ref카운트조절 코드로 관리-> 안좋다
_device->AddRef();
_device->Release();
모두 다른 gpu연동, 관리는 어떻게? -> Com 인터페이스
ComPtr<ID3D11Device> _device; -> 유닛생산
ComPtr<ID3D11DeviceContext> _deviceContext; -> 유닛에 일시키기
궁금한건 구글링하며 찾아보자
//DXGI : DX와는 독립적으로 하위 수준 작업 관리 => 시스템,하드웨어 통신
//스왑체인-> 그리는 것과 보여주는 것 따로 해야 보통 방식 ->전면 후면 고속복사
ComPtr<IDXGISwapChain> _swapChain = nullptr;
_device.Get(); //내부적 디바이스 ID3D11Device를 가져오고 싶을때
_device.GetAddressOf(); //그값의 주소값
//HRESULT 일종의 bool값
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE, //어떤걸 쓸건지 -> gpu or software로 gpu
nullptr,
0,
nullptr, //지원하는 dx 버전 레벨 기본값은 내가 지원할 수 있는 상위버전 골라줌
0, //위에 배열 크기
D3D11_SDK_VERSION, //매크로
&desc,
_swapChain.GetAddressOf(), //**이면 주소값 가져오는 GetAddressOf()
_device.GetAddressOf(),
nullptr,
_deviceContext.GetAddressOf()
);
//성공했는지 체크해준다.
assert(SUCCEEDED(hr));
오늘 완성 코드
Game.h
#pragma once
class Game
{
public:
Game();
~Game();
public:
void Init(HWND hwnd); //윈도우 핸들받아줌
void Update();
void Render();
private:
/// <summary>
/// 그리기 함수
/// </summary>
void RenderBegin();
void RenderEnd();
private:
void CreateDeviceAndSwapChain();
/// <summary>
/// 버퍼를 묘사 Tag를 달아서 GPU에 알려주기 위함
/// </summary>
void CreateRenderTargetView();
/// <summary>
/// 뷰포트 묘사
/// </summary>
void SetViewport();
private:
HWND _hwnd;
uint32 _width = 0;
uint32 _height = 0;
private:
//Device & SwapChain
// I: 인터페이스 Comptr -> 스마트 포인터- 자동관리해줌, wrl에 있다.
ComPtr<ID3D11Device> _device;
ComPtr<ID3D11DeviceContext> _deviceContext;
//DXGI : DX와는 독립적으로 하위 수준 작업 관리 => 시스템,하드웨어 통신
//스왑체인-> 그리는 것과 보여주는 것 따로 해야 보통 방식 ->전면 후면 고속복사
ComPtr<IDXGISwapChain> _swapChain = nullptr;
///RTV 렌더타켓뷰
ComPtr<ID3D11RenderTargetView> _renderTargetView;
//Misc
D3D11_VIEWPORT _viewport = { 0 };
float _clearColor[4] = { 0.5f,0.5f,0.5f,0.5f };
};
Game.cpp
#include "pch.h"
#include "Game.h"
Game::Game()
{
}
Game::~Game()
{
}
void Game::Init(HWND hwnd)
{
_hwnd = hwnd;
_width = GWinSizeX;
_height = GwinSizeY;
//TODO
CreateDeviceAndSwapChain();
CreateRenderTargetView();
SetViewport();
}
void Game::Update()
{
}
void Game::Render()
{
RenderBegin(); //초기화
//TODO : 그리기
RenderEnd(); //제출
}
void Game::RenderBegin() //랜더링 파이프라인에 우리가 만든거 묶어주기
{
_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), nullptr); //OM: OUTPUT Mege
_deviceContext->ClearRenderTargetView(_renderTargetView.Get(), _clearColor); //색상으로 초기화해주기
_deviceContext->RSSetViewports(1, &_viewport);
}
void Game::RenderEnd()
{
HRESULT hr = _swapChain->Present(1, 0); //제출 전면 <= 후면
CHECK(hr);
}
void Game::CreateDeviceAndSwapChain()
{
DXGI_SWAP_CHAIN_DESC desc;
ZeroMemory(&desc, sizeof(desc)); //다 0으로 초기화해줌 필요한 것만 따로 초기화
{
desc.BufferDesc.Width = _width; //버퍼도 같은 크기로 800 x 600
desc.BufferDesc.Height = _height;
desc.BufferDesc.RefreshRate.Numerator = 60; //화면 주사율
desc.BufferDesc.RefreshRate.Denominator = 1;
desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
desc.SampleDesc.Count = 1; //멀티 샘플링 계단현상, 찌그러짐 어떻게 처리할지
desc.SampleDesc.Quality = 0;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //버퍼를 어떻게 쓸건지 - 그려주는 역활
desc.BufferCount = 1; //버퍼몇개
desc.OutputWindow = _hwnd; // 결과 윈도우핸들
desc.Windowed = true;
desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
}
//HRESULT 일종의 bool값
HRESULT hr = ::D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE, //어떤걸 쓸건지 -> gpu or software로 gpu
nullptr,
0,
nullptr, //지원하는 dx 버전 레벨 기본값은 내가 지원할 수 있는 상위버전 골라줌
0, //위에 배열 크기
D3D11_SDK_VERSION, //매크로
&desc,
_swapChain.GetAddressOf(), //**이면 주소값 가져오는 GetAddressOf()
_device.GetAddressOf(),
nullptr,
_deviceContext.GetAddressOf()
);
CHECK(hr);
}
void Game::CreateRenderTargetView()
{
HRESULT hr;
ComPtr<ID3D11Texture2D> backBuffer = nullptr;
hr = _swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.GetAddressOf()); //백버퍼 텍스처(PNG)로 가져오기
CHECK(hr);
//택스처라는건 그냥 쓰면 아무것도 없는데 거기에 최종 그림을 그리는 곳에 쓸거라는 태그를 달아주는 것
_device->CreateRenderTargetView(backBuffer.Get(), nullptr, _renderTargetView.GetAddressOf()); //렌더타켓뷰라는것으로 텍스처를 명시해 만들어준다.
CHECK(hr);
}
void Game::SetViewport()
{
_viewport.TopLeftX = 0.f;
_viewport.TopLeftY = 0.f;
_viewport.Width = static_cast<float>(_width);
_viewport.Height = static_cast<float>(_height);
_viewport.MaxDepth = 0.f;
_viewport.MaxDepth = 1.f;
}
오늘의 결과화면
함수 단위로 크게크게 보자
'게임공부 > Directx11' 카테고리의 다른 글
[Directx11][C++]4. 텍스처와 UV (0) | 2024.07.01 |
---|---|
[Directx11]4. 삼각형 그리기 (1) | 2024.07.01 |
[Directx11]2.초기설정 (0) | 2024.06.26 |
[Directx11]그래픽스OT (0) | 2024.06.25 |
[Directx11]2.랜더링 파이프라인2 (0) | 2024.06.21 |