DirectX11 공부 5일차(Wrapping Class - ConstantBuffer, RasterizerState)
05 Jun 2021
Reading time ~2 minutes
Wrapping Class - ConstantBuffer
이젠 ConstantBuffer 뤠핑 할 순서이다.
딱히 특이한건 없고 그냥 클래스 생성 뿐이라 따로 설명은 없을거 같다….
D3D11_ConstantBuffer.h
#pragma once
class D3D11_ConstantBuffer
{
public:
D3D11_ConstantBuffer(class Graphics* graphics);
~D3D11_ConstantBuffer();
ID3D11Buffer* GetBuffer() const { return buffer; }
template<typename T>
void Create(const D3D11_USAGE& usage = D3D11_USAGE_DYNAMIC);
void Clear();
template<typename T>
T* Map();
bool UnMap();
private:
ID3D11Device* device = nullptr;
ID3D11DeviceContext* device_context = nullptr;
ID3D11Buffer* buffer = nullptr;
};
template<typename T>
inline void D3D11_ConstantBuffer::Create(const D3D11_USAGE& usage)
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.ByteWidth = sizeof(T);
desc.Usage = usage;
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
switch (usage)
{
case D3D11_USAGE_DEFAULT:
case D3D11_USAGE_IMMUTABLE:
desc.CPUAccessFlags = 0;
break;
case D3D11_USAGE_DYNAMIC:
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
break;
case D3D11_USAGE_STAGING:
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
break;
default:
break;
}
HRESULT hr = device->CreateBuffer(&desc, nullptr, &buffer);
assert(SUCCEEDED(hr));
}
template<typename T>
inline T* D3D11_ConstantBuffer::Map()
{
D3D11_MAPPED_SUBRESOURCE mapped_resource;
device_context->Map
(
buffer,
0,
D3D11_MAP_WRITE_DISCARD,
0,
&mapped_resource
);
return static_cast<T*>(mapped_resource.pData);
}
나중에 내가 만드는 프로젝트는 저번처럼 void* 말고 탬플릿 쓸거다!
D3D11_ConstantBuffer.cpp
#include "stdafx.h"
#include "D3D11_ConstantBuffer.h"
D3D11_ConstantBuffer::D3D11_ConstantBuffer(Graphics* graphics)
{
device = graphics->GetDevice();
device_context = graphics->GetDeviceContext();
}
D3D11_ConstantBuffer::~D3D11_ConstantBuffer()
{
Clear();
}
void D3D11_ConstantBuffer::Clear()
{
SAFE_RELEASE(buffer);
}
bool D3D11_ConstantBuffer::UnMap()
{
if (!device || !device_context || !buffer)
{
return false;
}
device_context->Unmap(buffer, 0);
return true;
}
변경하는 부분은 따로 적진 않겠다. 바뀐게 많이 없다.
저번에 말한 L,R value 때문에 배열 선언하고 넣는것 제외하고 없다.
Wrapping Class - RasterizerState
이젠 RasterizerState 뤠핑 할 순서이다.
여기도 설명할게 없다.
D3D11_RasterizerState.h
#pragma once
class D3D11_RasterizerState
{
public:
D3D11_RasterizerState(class Graphics* graphics);
~D3D11_RasterizerState();
ID3D11RasterizerState* GetResource() const { return state; }
void Create
(
const D3D11_CULL_MODE& cull_mode,
const D3D11_FILL_MODE& fill_mode
);
void Clear();
private:
ID3D11Device* device = nullptr;
ID3D11RasterizerState* state = nullptr;
};
D3D11_RasterizerState.cpp
#include "stdafx.h"
#include "D3D11_RasterizerState.h"
D3D11_RasterizerState::D3D11_RasterizerState(Graphics* graphics)
{
device = graphics->GetDevice();
}
D3D11_RasterizerState::~D3D11_RasterizerState()
{
Clear();
}
void D3D11_RasterizerState::Create(const D3D11_CULL_MODE& cull_mode, const D3D11_FILL_MODE& fill_mode)
{
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_RASTERIZER_DESC));
desc.CullMode = cull_mode;
desc.FillMode = fill_mode;
desc.FrontCounterClockwise = false;
HRESULT hr = device->CreateRasterizerState(&desc, &state);
assert(SUCCEEDED(hr));
}
void D3D11_RasterizerState::Clear()
{
SAFE_RELEASE(state);
}
FrontCounterClockwise
-
참일경우 삼각형의 정점이 렌더 대상에서 시계 반대 방향이면 앞을 향하는 것으로 간주되고, 시계 방향이면 뒷면을 향하는 것으로 간주됨
-
서직일경우 반대로 함