Я пытаюсь написать некоторый код DirectX, который принимает скомпилированный шейдер и использует отражение для автоматического создания макетов ввода для вершинных шейдеров. У меня есть простой вершинный шейдер, который разработан, чтобы воспользоваться инстансов, это вход он принимает:DirectX 11 Vertex Shader Reflection
struct VertexIn
{
// Per-vertex data
float3 pos : POSITION;
float4 color : COLOR;
// Per-instance data
matrix worldMatrix : WORLDMATRIX;
};
И мой макет, если бы я писал его от руки, будет:
// Per-vertex data
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
// Per-instance data.
{ "WORLDMATRIX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "WORLDMATRIX", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "WORLDMATRIX", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "WORLDMATRIX", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }
когда я размышляю скомпилированный шейдер я получаю правильное число входных параметров, но когда я пытаюсь прочитать описания входных через D3D11_SIGNATURE_PARAMTER_DESC
, я не могу найти детали, которые мне нужно заполнить D3D11_INPUT_ELEMENT_DESC
членов InputSlot
, InputSlotClass
и InstanceDataStepRate
? Я искал неправильное описание этой информации или собираю информацию о невозможности через отражение?
Если это невозможно, я предполагаю, что единственной альтернативой, которую я имею, является передача ожидаемого ввода вершин и проверка всех параметров?
А это справедливый вопрос относительно комментария в самом шейдере, он фактически ничего не говорит о номерах слотов. Мне нравится семантическая идея, может дать попробовать. Когда вы упоминаете, что вам нужно знать, какие входные данные у вас есть, что вы подразумеваете под этим? Такие вызовы, как IASetVertexBuffers? – TheRarebit
Да, я имел в виду, что вам нужно знать, какие у вас есть данные вершин (например, с помощью IASetVertexBuffers). Хотя вы могли бы поместить схему в шейдер, чтобы определить, что, в конце концов, вам все равно придется иметь данные вершин. – MuertoExcobito
Хорошо, да, я понимаю, не все может быть автоматизировано. Думаю, мне нравится, что автоматическое создание входных макетов автоматизировано, хотя это может дать ваши предложения попробовать. Приветствия для обратной связи. – TheRarebit