• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

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

  • 참일경우 삼각형의 정점이 렌더 대상에서 시계 반대 방향이면 앞을 향하는 것으로 간주되고, 시계 방향이면 뒷면을 향하는 것으로 간주됨

  • 서직일경우 반대로 함



DirectX Share Tweet +1