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

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 |