VertexBuffer
- 정점 데이터 저장소
- 3D 모델을 이루는 점(정점)들의 집합을 GPU에 올려두는 객체
- 게임 오브젝트의 정점(Vertex) 정보를 GPU 메모리에 저장
- 정점 = 위치(Position), 색상(Color), 법선(Normal), UV 등
- 한번 올려두면 GPU에서 빠르게 렌더링 가능
수정 코드
#include "IndexBuffer.h"
#pragma once
class VertexBuffer
{
public:
VertexBuffer(ComPtr<ID3D11Device> device);
~VertexBuffer();
ComPtr<ID3D11Buffer> GetComPtr() { return _vertexBuffer; }
uint32 GetStride() const { return _stride; }
uint32 GetOffset() const { return _offset; }
uint32 GetCount() const { return _count; }
template<typename T>
void Create(const vector<T>& 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)(_stride * _count);
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 = 0;
uint32 _offset = 0;
uint32 _count = 0;
};
IndexBuffer
- 정점 재사용을 위한 인덱스 버퍼
- 같은 정점을 여러 폴리곤에서 재사용하기 위해 정점 인덱스만 관리하는 버퍼
- 정점 중복을 줄이기 위한 GPU 버퍼
- 삼각형을 그릴 때 인덱스만으로 정점을 재조합
수정 코드
#pragma once
class IndexBuffer
{
public:
IndexBuffer(ComPtr<ID3D11Device> device);
~IndexBuffer();
ComPtr<ID3D11Buffer> GetComPtr() { return _indexBuffer; }
uint32 GetStride() const { return _stride; }
uint32 GetOffset() const { return _offset; }
uint32 GetCount() const { return _count; }
void Create(const vector<uint32>& indices);
private:
ComPtr<ID3D11Device> _device;
ComPtr<ID3D11Buffer> _indexBuffer;
uint32 _stride = 0;
uint32 _offset = 0;
uint32 _count = 0;
};
#include "pch.h"
#include "IndexBuffer.h"
IndexBuffer::IndexBuffer(ComPtr<ID3D11Device> device)
: _device(device)
{
}
IndexBuffer::~IndexBuffer()
{
}
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 = (uint32)(_stride * _count);
D3D11_SUBRESOURCE_DATA data;
ZeroMemory(&data, sizeof(data));
data.pSysMem = indices.data();
HRESULT hr = _device->CreateBuffer(&desc, &data, _indexBuffer.GetAddressOf());
CHECK(hr);
}
- 정점 구조를 GPU에 알려주는 설계도
- 정점 버퍼 안의 데이터가 셰이더 입력과 어떻게 매핑되는지 정의
#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;
};
#include "pch.h"
#include "InputLayout.h"
InputLayout::InputLayout(ComPtr<ID3D11Device> device)
: _device(device)
{
}
InputLayout::~InputLayout()
{
}
void InputLayout::Create(const vector<D3D11_INPUT_ELEMENT_DESC>& descs, ComPtr<ID3DBlob> blob)
{
const int32 count = static_cast<int32>(descs.size());
_device->CreateInputLayout(descs.data(), count, blob->GetBufferPointer(), blob->GetBufferSize(), _inputLayout.GetAddressOf());
}