3D 정점 데이터들을 GPU 메모리 상에 할당 해야한다. 이것을 저장하는 공간을 정점 버퍼라고 한다.

버텍스 버퍼는 버텍스 셰이더에서 어트리뷰트로 사용할 수 있는 버텍스별 정보를 저장합니다. 버텍스 버퍼, 인덱스 버퍼, 상수 버퍼 등 모든 버퍼는 DirectX 11의 ID3D11Buffer 오브젝트입니다.

Untitled

정점 버퍼 클래스

#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:
	};
}

버텍스버퍼의 일반적인 생성 순서는 아래와 같다

  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;
	}

우선 버텍스 데이터를 선언한다

		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  구조체로 정의하고