Quick Reference
cpp
UINT stride = sizeof(VertexPositionNormalUv);
UINT offset = 0;
ID3D11Buffer* buffers[] = { vertexBuffer.Get() };
context->IASetVertexBuffers(0, 1, buffers, &stride, &offset);Stride는 vertex 개수가 아니라 다음 vertex까지 이동할 byte 수입니다. Offset은 buffer 첫 byte에서 첫 vertex data가 시작하는 위치입니다.
Layout 연결
Interleaved buffer라면 position, normal, UV가 한 구조체 안에 있고 stride는 전체 구조체 크기입니다. Separate stream을 사용하면 slot마다 buffer와 stride를 따로 bind하고 input layout의 InputSlot을 맞춥니다.
text
slot 0: PositionNormal, stride 24
slot 1: UV, stride 8Instance data는 별도 slot과 D3D11_INPUT_PER_INSTANCE_DATA, InstanceDataStepRate를 사용합니다.
자주 틀리는 점
- C++ 구조체 padding이 있을 수 있으므로 손으로 더한 값보다
sizeof와offsetof를 사용합니다. - Buffer ByteWidth보다 draw가 읽을 vertex 범위가 크지 않은지 확인합니다.
- Stride가 0인 constant input 같은 특수 사용을 일반 vertex buffer 기본값으로 쓰지 않습니다.
- Buffer를 다시 bind할 때 stride·offset 배열도 같은 count로 전달합니다.
참고 링크
1 sources