3D 정점 데이터들을 GPU 메모리 상에 할당 해야한다. 이것을 저장하는 공간을 정점 버퍼라고 한다.
버텍스 버퍼는 버텍스 셰이더에서 어트리뷰트로 사용할 수 있는 버텍스별 정보를 저장합니다. 버텍스 버퍼, 인덱스 버퍼, 상수 버퍼 등 모든 버퍼는 DirectX 11의 ID3D11Buffer 오브젝트입니다.
#pragma once
#include "yaGraphicDevice_DX11.h"
namespace ya::graphics
{
class VertexBuffer : public GpuBuffer
{
public:
VertexBuffer();
~VertexBuffer();
bool Create(const std::vector<Vertex>& vertexes);
void Bind();
private:
};
}
버텍스버퍼의 일반적인 생성 순서는 아래와 같다
짚고 넘어가자면 버텍스 버퍼는 리소스 개념중 하나인 버퍼리소스이다
즉 버퍼리소스들(텍스처버퍼, 인덱스버퍼, 정수 버퍼등등,,)은 모두 저와 같은 형태로 생성을 한다
bool VertexBuffer::Create(const std::vector<Vertex>& vertexes)
{
desc.ByteWidth = sizeof(Vertex) * vertexes.size();
desc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_VERTEX_BUFFER;
desc.Usage = D3D11_USAGE::D3D11_USAGE_DYNAMIC;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_FLAG::D3D11_CPU_ACCESS_WRITE;
D3D11_SUBRESOURCE_DATA sub = { };
sub.pSysMem = vertexes.data();
if (!(GetDevice()->CreateBuffer(&desc, &sub, buffer.GetAddressOf())))
assert(NULL, "Create vertex buffer failed!");
return true;
}
우선 버텍스 데이터를 선언한다
std::vector<graphics::Vertex> vertexes = {};
vertexes.resize(3);
vertexes[0].pos = Vector3(0.0f, 0.5f, 0.0f);
vertexes[0].color = Vector4(0.0f, 1.0f, 0.0f, 1.0f);
vertexes[1].pos = Vector3(0.5f, -0.5f, 0.0f);
vertexes[1].color = Vector4(1.0f, 0.0f, 0.0f, 1.0f);
vertexes[2].pos = Vector3(-0.5f, -0.5f, 0.0f);
vertexes[2].color = Vector4(0.0f, 0.0f, 1.0f, 1.0f);
생성할 버텍스 버퍼를 D3D11_BUFFER_DESC 구조체로 정의하고