본문 바로가기

그래픽스

[DX12] Index Buffer

Vertex로 삼각형을 그릴 수 있었는데, 사각형은 어떻게 그릴까? 삼각형 두개를 이어 붙이면 된다. 하지만 그러면 정점 6개를 사용하게 되고 정점이 중복되어 데이터 낭비가 일어난다. 그래서 사용하는 것이 Index Buffer을 섞어 사용하는 것이다. 

 

출처 : Vulkan tutorial

Index Buffer은 중복되지 않은 정점만 뽑고 정점이 연결되는 순서 (indices) 를 저장한다. 예시에서 2나 0이 중복되긴 하지만 많은 데이터를 가지고 있는 정점이 중복되지 않고 정수 1개씩만 중복될 뿐이므로 데이터 낭비가 훨씬 덜하다.

 

vector<uint32> indexVec;
	{
		indexVec.push_back(0);
		indexVec.push_back(1);
		indexVec.push_back(2);
	}
	{
		indexVec.push_back(0);
		indexVec.push_back(2);
		indexVec.push_back(3);
	}

	mesh->Init(vec, indexVec);
void Mesh::Init(const vector<Vertex>& vertexBuffer, const vector<uint32>& indexBuffer)
{
	CreateVertexBuffer(vertexBuffer);
	CreateIndexBuffer(indexBuffer);
}

 

그리고  Render에서 IndexBuffer을 위한 추가설정 (IASetIndexBuffer) 을 해주고 DrawInstanced를 DrawIndexInstanced로 교체한다.

 

void Mesh::Render()
{
	CMD_LIST->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
	CMD_LIST->IASetVertexBuffers(0, 1, &_vertexBufferView); // Slot: (0~15)
	CMD_LIST->IASetIndexBuffer(&_indexBufferView);

	{
		D3D12_CPU_DESCRIPTOR_HANDLE handle = GEngine->GetCB()->PushData(0, &_transform, sizeof(_transform));
		GEngine->GetTableDescHeap()->SetCBV(handle, CBV_REGISTER::b0);
	}

	GEngine->GetTableDescHeap()->CommitTable();

	//CMD_LIST->DrawInstanced(_vertexCount, 1, 0, 0, 0);
	CMD_LIST->DrawIndexedInstanced(_indexCount, 1, 0, 0, 0);
}

'그래픽스' 카테고리의 다른 글

[DX12] Depth Stencil View  (0) 2022.07.23
[DX12] Texture Mapping  (0) 2022.07.23
[DX12] Root Signature  (0) 2022.07.22
[DX12] Constant Buffer  (0) 2022.07.22
[DX12] Frustum Culling  (0) 2022.02.28