Quick Reference
vertex data -> D3D11_BIND_VERTEX_BUFFER
indices -> D3D11_BIND_INDEX_BUFFER
shader constants -> D3D11_BIND_CONSTANT_BUFFER
shader read -> D3D11_BIND_SHADER_RESOURCE + SRV
unordered read/write -> D3D11_BIND_UNORDERED_ACCESS + UAV
stream-output target -> D3D11_BIND_STREAM_OUTPUT + SOSetTargetsID3D11Buffer interface는 같아도 생성 description과 binding 방식이 buffer의 역할을 정합니다. 필요하지 않은 BindFlags를 미리 모두 켜지 않습니다.
Description 맞추기
D3D11_BUFFER_DESC desc{};
desc.ByteWidth = static_cast<UINT>(sizeof(Vertex) * vertices.size());
desc.Usage = D3D11_USAGE_IMMUTABLE;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;Structured buffer는 D3D11_RESOURCE_MISC_BUFFER_STRUCTURED와 element 크기의 StructureByteStride를 설정합니다. Raw view가 필요하면 BUFFER_ALLOW_RAW_VIEWS를 사용하고 view format과 flag를 맞춥니다.
Stream Output buffer는 D3D11_BIND_STREAM_OUTPUT으로 만들고 SOSetTargets에 byte offset과 함께 연결합니다. 같은 buffer를 IA 입력으로 다시 읽을 계획이면 D3D11_BIND_VERTEX_BUFFER도 함께 선언하고, SO output과 IA input으로 동시에 사용하지 않습니다.
Constant buffer bind flag는 다른 bind flag와 결합할 수 없는 제약이 있습니다. 여러 역할을 한 resource에 억지로 넣기보다 명확한 resource를 나눕니다.
자주 틀리는 점
ByteWidth를 element 개수로 넣지 않고 byte 수로 계산합니다.- 빈 vector에서
data()를 initial data로 넘기기 전에 크기를 확인합니다. - Structured buffer stride와 HLSL element layout을 맞춥니다.
- Bind flag는 access permission 전체가 아닙니다. Usage와 CPUAccessFlags도 함께 봅니다.
참고 링크
2 sources