Quick Reference
text
공유: vertex/index buffer, shader, material state
instance data: transform, color, object ID 등
input layout: InputSlotClass = PER_INSTANCE_DATA
draw: DrawIndexedInstanced(indexCount, instanceCount, ...)Instancing은 작은 draw가 많아 CPU submission이 병목일 때 효과가 큽니다. Material·texture·shader variant가 자주 갈리거나 instance 수가 적으면 묶는 비용이 이득보다 클 수 있습니다.
Buffer와 Culling
Instance stream에는 InstanceDataStepRate = 1을 사용하고 matrix를 여러 semantic row로 나눕니다. Dynamic buffer를 매 frame 갱신할 때 WRITE_DISCARD와 ring strategy로 GPU가 읽는 영역을 덮어쓰지 않습니다.
모든 instance를 한 draw로 묶으면 개별 frustum culling이 어려워질 수 있습니다. Spatial cell이나 visible instance list를 만들어 culling granularity와 draw 수 사이를 조정합니다.
자주 틀리는 점
- Instance matrix semantic index와 stride를 input layout에 잘못 넣지 않습니다.
- Texture가 다른 object를 무리하게 한 material draw에 넣지 않습니다.
- Instance count 0 draw와 빈 buffer update 경계를 처리합니다.
- Draw call 감소만 보고 vertex·pixel 병목도 함께 줄었다고 생각하지 않습니다.
참고 링크
2 sources