vertex buffer만 사용하는 경우
메쉬가 이어지는 부분에 정점이 중첩되게 됨
=>
사각형을 만들면 vertex 2개가 낭비되며 비효율적임
vertex + index buffer
vertex buffer 정점들의 데이터 (중첩되는 부분은 제거)
index buffer 삼각형의 정점 인덱스들을 모은 데이터
vertex buffer의 정점 정보를 참고하여 index buffer의 인덱스들로 삼각형을 만들게 됨
삼각형이 인덱스로 관리되기 때문에 중첩되는 부분은 같은 삼각형 정보를 참고할 수 있음
ComPtr<ID3D12Resource> _indexBuffer;
D3D12_INDEX_BUFFER_VIEW _indexBufferView;
uint32 _indexCount = 0;
메쉬에 인덱스 버퍼 추가
void Mesh::CreateIndexBuffer(const vector<uint32>& buffer)
{
_indexCount = static_cast<uint32>(buffer.size());
uint32 bufferSize = _indexCount * sizeof(uint32);
...
_indexBufferView.BufferLocation = _indexBuffer->GetGPUVirtualAddress();
_indexBufferView.Format = DXGI_FORMAT_R32_UINT;
_indexBufferView.SizeInBytes = bufferSize;
}
인덱스 버퍼를 생성하는 부분의 구현은 vertex 구현과 거의 동일
데이터 크기가 vertex에서 int형으로 변경
void Mesh::Render()
{
CMD_LIST->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
CMD_LIST->IASetVertexBuffers(0, 1, &_vertexBufferView); // Slot: (0~15)
CMD_LIST->IASetIndexBuffer(&_indexBufferView);
...
//CMD_LIST->DrawInstanced(_vertexCount, 1, 0, 0);
CMD_LIST->DrawIndexedInstanced(_indexCount, 1, 0, 0, 0);
}
메쉬가 렌더링되는 부분을 수정
IASetIndexBuffer 함수로 index buffer view 요청을 추가
DrawInstanced 함수는 vertex buffer만 사용하여 렌더링하는 함수
DrawIndexedInstanced 함수를 이용하여 index buffer를 사용하여 렌더링하도록 수정