- 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{};
};
#pragma once
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);
}
#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함수를 호출하여 만들어준다다