Quick Reference
context->IASetIndexBuffer(indexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0);
context->DrawIndexed(indexCount, startIndex, baseVertex);실제 vertex index는 index buffer에서 읽은 값에 BaseVertexLocation을 더해 계산합니다. StartIndexLocation은 byte offset이 아니라 첫 index의 위치입니다.
Format 선택
DXGI_FORMAT_R16_UINT는 한 draw의 index 값이 표현 범위 안에 있을 때 memory와 bandwidth를 줄입니다. 더 큰 vertex index가 필요하면 R32_UINT를 사용합니다. Signed format이나 일반 texture format은 index buffer에 사용할 수 없습니다.
Index를 사용하면 여러 triangle이 같은 vertex data를 재사용할 수 있습니다. Cache locality를 위해 triangle 순서를 최적화할 수 있지만 먼저 올바른 winding과 범위를 확인합니다.
Submesh 그리기
여러 mesh를 큰 vertex/index buffer에 합치면 각 submesh가 startIndex, baseVertex, indexCount를 가질 수 있습니다. 음수 BaseVertexLocation도 API type상 가능하지만 결과 index가 음수가 되면 정의되지 않은 접근이므로 범위를 보장합니다.
자주 틀리는 점
- Index buffer의 실제 element type과 DXGI format을 맞춥니다.
- Index count에 triangle 수를 넣지 않습니다. Triangle list는 보통 triangle당 index 세 개입니다.
Draw와DrawIndexed를 바꾸면서 IA binding을 그대로 두지 않습니다.- 잘못된 winding으로 culling된 결과를 index 범위 오류와 혼동하지 않습니다.
참고 링크
2 sources