Search
Duplicate

Vertex Buffer(정점 버퍼) 클래스

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++
복사