2017-02-22 38 views
1

Я пытаюсь написать некоторый код 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? Я искал неправильное описание этой информации или собираю информацию о невозможности через отражение?

Если это невозможно, я предполагаю, что единственной альтернативой, которую я имею, является передача ожидаемого ввода вершин и проверка всех параметров?

ответ

1

Невозможно знать, какие значения для InputSlot, InputSlotClass и InstanceDataStepRate должны быть указаны только с вершинным шейдером. Речь идет о привязке данных к обработке данных. Вершинный шейдер обрабатывает данные, но макет ввода определяет, как данные передаются в шейдер.

Например, если вы указали свое определение ввода шейдера, вы не укажете (кроме комментария), что worldMatrix является членом-экземпляром. На самом деле, это не обязательно - вы можете легко создать привязку ввода и привязку буфера вершин, которая сделала это не для данных экземпляра, используя тот же вершинный шейдерный код.

В качестве альтернативы вы можете создать семантическое соглашение об именах в коде шейдера, чтобы определить, какие значения входного макета становятся инстанцированными, и скорость их ускорения. Например:

matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1; 

Путем анализа семантического, вы можете получить, что это инстанс, слот ввода и скорость шага. Однако такая схема может быть больше проблем, чем того стоит. В какой-то момент вам нужно будет знать, какие входные данные у вас есть, и как они будут привязаны к шейдеру, который вы написали, тем самым диктуя макет ввода.

+0

А это справедливый вопрос относительно комментария в самом шейдере, он фактически ничего не говорит о номерах слотов. Мне нравится семантическая идея, может дать попробовать. Когда вы упоминаете, что вам нужно знать, какие входные данные у вас есть, что вы подразумеваете под этим? Такие вызовы, как IASetVertexBuffers? – TheRarebit

+0

Да, я имел в виду, что вам нужно знать, какие у вас есть данные вершин (например, с помощью IASetVertexBuffers). Хотя вы могли бы поместить схему в шейдер, чтобы определить, что, в конце концов, вам все равно придется иметь данные вершин. – MuertoExcobito

+0

Хорошо, да, я понимаю, не все может быть автоматизировано. Думаю, мне нравится, что автоматическое создание входных макетов автоматизировано, хотя это может дать ваши предложения попробовать. Приветствия для обратной связи. – TheRarebit

 Смежные вопросы

  • Нет связанных вопросов^_^