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:
};
}
C++
복사
버텍스버퍼의 일반적인 생성 순서는 아래와 같다
1.
버텍스 버퍼의 데이터 형식을 정의하는 구조체 선언
2.
생성할 버텍스버퍼를 D3D11_BUFFER_DESC 구조체로 정의
3.
서브 리소스의 초기화 데이터로 D3D11_SUBRESOURCE_DATA 구조체를 정의
4.
ID3D11Device::CreateBuffer 함수 호출
짚고 넘어가자면 버텍스 버퍼는 리소스 개념중 하나인 버퍼리소스이다
즉 버퍼리소스들(텍스처버퍼, 인덱스버퍼, 정수 버퍼등등,,)은 모두 저와 같은 형태로 생성을 한다
정점 버퍼의 생성 함수
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;
}
C++
복사
우선 버텍스 데이터를 선언한다
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);
JavaScript
복사
생성할 버텍스 버퍼를 D3D11_BUFFER_DESC 구조체로 정의하고
디폴트 사용 , 버텍스버퍼사이즈, 파이프라인에 버텍스버퍼로써 바인드, CPU액세스 하지 않음 등을 설정한다
// 버텍스버퍼① 정의
D3D11_BUFFER_DESC xyzBufferDesc;
xyzBufferDesc.Usage = D3D11_USAGE_DEFAULT; // 디폴트로 사용
xyzBufferDesc.ByteWidth = sizeof( SimpleVertex ) * 3; // 버텍스 3개
xyzBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // 버텍스버퍼로써 바인드
xyzBufferDesc.CPUAccessFlags = 0; // CPU액세스 하지 않음
xyzBufferDesc.MiscFlags = 0;
xyzBufferDesc.StructureByteStride = 0;
JavaScript
복사
다음 서브 리소스의 초기화 데이터를 정의 한다
리소스는 복수의 서브리소스의 집합이라 할 수 있다
말이 어려운거지 서브리소스는 그저 리소스내에 있는 실제 데이터를 말한다
리소스를 생성할때는 D3D11_SUBRESOURCE_DATA 구조체를 정의하고 여기서 서브리소스의 내용을 초기화한다
마지막으로 CreateBuffer 라고 호출해주면 되며 이때 받아올 포인터로 ID3D11Buffer 인터페이스를 사용한다.
해당 정점 버퍼를 파이프라인에 묶어주는 함수
void VertexBuffer::Bind()
{
UINT offset = 0;
UINT vectexSize = sizeof(Vertex);
GetDevice()->BindVertexBuffer(0, 1, buffer.GetAddressOf(), &vectexSize, &offset);
}
C++
복사