19 InputAssembler

한경식·2024년 12월 17일
  • Geometry
    • Input Assembler 단계에 해당되는 Index Buffer, Vertex Buffer, Input Layout을 Class로 만들어 구분해 주었다
  • VertexBuffer
    • Create 함수를 Template로 만든 이유는 Vertex 구조체에 변수가 달라질 수 있기 때문이다
    • 현재는 vector3, vector2 2가지 변수만 존재하지만 Shader가 늘어나고 상황에 따라 Color등 다른 변수들도 들어가거나 빠질수도 있다
    • 그때마다 크기를 가져오는 것이 아닌 template를 활용했다다
#pragma once

class VertexBuffer
{
public:
	VertexBuffer(ComPtr<ID3D11Device> Device);
	~VertexBuffer();

	ComPtr<ID3D11Buffer> GetComPtr() { return vertexBuffer; }
	uint32 GetStride() { return stride; }
	uint32 GetOffset() { return offset; }
	uint32 GetCount() { return count; }

	template<typename T>
	void Create(const vector<Vertex>& vertices)
	{
		stride = sizeof(T);
		count = static_cast<uint32>(vertices.size());

		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(desc));
		desc.Usage = D3D11_USAGE_IMMUTABLE;
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
		desc.ByteWidth = (uint32)(sizeof(Vertex) * vertices.size());

		D3D11_SUBRESOURCE_DATA data;
		ZeroMemory(&data, sizeof(data));
		data.pSysMem = vertices.data();

		HRESULT hr = device->CreateBuffer(&desc, &data, vertexBuffer.GetAddressOf());
		CHECK(hr);
	}

private:
	ComPtr<ID3D11Device> device;
	ComPtr<ID3D11Buffer> vertexBuffer;

	uint32 stride{};
	uint32 offset{};
	uint32 count{};
};
  • IndexBuffer
#pragma once
//중복되는 정점의 갯수를 줄이기 위해 index buffer를 사용
class IndexBuffer
{
public:
	IndexBuffer(ComPtr<ID3D11Device> Device);
	~IndexBuffer();

	ComPtr<ID3D11Buffer> GetComPtr() { return indexBuffer; }
	uint32 GetStride() { return stride; }
	uint32 GetOffset() { return offset; }
	uint32 GetCount() { return count; }

	void Create(const vector<uint32>& indices);

private:
	ComPtr<ID3D11Device> device{};
	ComPtr<ID3D11Buffer> indexBuffer{};

	uint32 stride;
	uint32 offset;
	uint32 count;
};

void IndexBuffer::Create(const vector<uint32>& indices)
{
	stride = sizeof(uint32);
	count = static_cast<uint32>(indices.size());

	D3D11_BUFFER_DESC desc{};
	ZeroMemory(&desc, sizeof(desc));
	desc.Usage = D3D11_USAGE_IMMUTABLE;
	desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
	desc.ByteWidth = stride*count;

	D3D11_SUBRESOURCE_DATA data;
	ZeroMemory(&data, sizeof(data));
	data.pSysMem = indices.data();

	HRESULT hr = device->CreateBuffer(&desc, &data, indexBuffer.GetAddressOf());
	CHECK(hr);
}
  • InputLayout
#pragma once

class InputLayout
{
public:
	InputLayout(ComPtr<ID3D11Device> Device);
	~InputLayout();

	ComPtr<ID3D11InputLayout> GetComptr() { return inputLayout; }

	void Create(const vector<D3D11_INPUT_ELEMENT_DESC>& descs, ComPtr<ID3DBlob> blob);

private:
	ComPtr<ID3D11Device> device;
	ComPtr<ID3D11InputLayout> inputLayout;
};

void InputLayout::Create(const vector<D3D11_INPUT_ELEMENT_DESC>& descs, ComPtr<ID3DBlob> blob)
{
	const int32 count = static_cast<int32>(descs.size());

	HRESULT hr = device->CreateInputLayout(descs.data(), count, blob->GetBufferPointer(), blob->GetBufferSize(), inputLayout.GetAddressOf());
	CHECK(hr);
}
  • 합치기
    • 각각의 클래스들을 shared_ptr<>을 활용하여 만든 객체을 동적할당을 해준다
    • Vertex/Index Buffer는 CreateGeometry함수에서 원래 생성되는 코드를 지우고 각각의 객체에 Create 함수를 호출하는 것으로 대체 가능해진다
    • Input Layout역시 CreateInputLayout 함수에서 Create함수를 호출하여 만들어준다다
profile
게임 개발 지망생

0개의 댓글