Quick Reference
cpp
D3D11_INPUT_ELEMENT_DESC elements[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0,
D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
device->CreateInputLayout(elements, 2,
vertexShaderBytecode->GetBufferPointer(),
vertexShaderBytecode->GetBufferSize(), layout.GetAddressOf());Input layout은 C++ field 이름이 아니라 buffer의 byte 범위에 semantic과 format을 붙여 vertex shader input signature와 연결합니다.
맞춰야 할 축
Semantic name과 index, component type과 count, input slot, byte offset, per-vertex·per-instance 분류가 shader signature와 맞아야 합니다. HLSL float3 POSITION에 R32G32B32_FLOAT를 연결하는 식입니다.
CreateInputLayout에 vertex shader bytecode가 필요한 이유는 runtime이 실제 input signature와 layout을 검증하기 때문입니다. 같은 signature를 공유하는 shader는 input layout을 재사용할 수 있습니다.
자주 틀리는 점
SV_POSITION은 일반 vertex buffer input semantic이 아니라 system-value semantic으로 주로 shader output에서 사용합니다.- C++ struct field 순서와 description offset이 다르지 않은지 확인합니다.
- HLSL
float4와 bufferfloat3를 자동 확장에 기대지 않고 계약을 명시합니다. - Instance data의 step rate를 0으로 두면 instance마다 진행하지 않습니다.
참고 링크
2 sources