Использованный мною подход, который может быть полезен, заключается в предоставлении реализации в одном файле cpp:
(* В моем примере используется DirectX10, но для этого ответа версия dx не имеет значения )
(. H) Заголовок:
int getLayoutPosTexNormCInstancedSize();
D3D10_INPUT_ELEMENT_DESC* getLayoutPosTexNormCInstanced();
(. Cpp) Имплантация:
D3D10_INPUT_ELEMENT_DESC layoutPosTexNormCInstanced[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 32, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BINORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 44, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BLENDINDICES", 0, DXGI_FORMAT_R8G8B8A8_SINT, 0, 56, D3D10_INPUT_PER_VERTEX_DATA, 0 }, //4
{"mTransform", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
{"mTransform", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
{"mTransform", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
{"mTransform", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
};
D3D10_INPUT_ELEMENT_DESC* getLayoutPosTexNormCInstanced() { return layoutPosTexNormCInstanced; }
int getLayoutPosTexNormCInstancedSize() { return sizeof(layoutPosTexNormCInstanced) / sizeof(D3D10_INPUT_ELEMENT_DESC); }
Тогда, по крайней мере, когда вы ссылаетесь или запрашиваете входную разметку при создании буфера (ов) вершин, вы можете просто вызвать функцию getLayoutPosTexNormCInstanced, и их также можно легко переместить в класс / структуру или даже предоставить модуль многократного использования, например DLL.