2017-02-22 7 views
1

Ich versuche, DirectX-Code zu schreiben, der einen kompilierten Shader verwendet und mithilfe von Reflektion automatisch Eingabe-Layouts für Vertex-Shader erstellt. Ich habe einen einfachen Vertex-Shader, die ausgelegt ist, den Vorteil von Instancing zu nehmen, ist dies die Eingabe es akzeptiert:DirectX 11 Vertex Shader Reflexion

struct VertexIn 
{ 
    // Per-vertex data 
    float3 pos  : POSITION; 
    float4 color : COLOR; 

    // Per-instance data 
    matrix worldMatrix : WORLDMATRIX; 
}; 

Und mein Layout, wenn ich es von Hand zu schreiben, wäre:

// 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 } 

wenn ich den kompilierten Shader reflect erhalte ich die richtige Anzahl von Eingabeparametern, aber wenn ich versuche, die Eingänge Beschreibungen durch D3D11_SIGNATURE_PARAMTER_DESC zu lesen, kann ich die Details nicht finden, dass ich die D3D11_INPUT_ELEMENT_DESC Mitglieder InputSlot, InputSlotClass und InstanceDataStepRate füllen müssen? Sehe ich in die falsche Beschreibung für diese Information oder bekomme ich durch Nachdenken Instanziierungsdetails nicht möglich?

Wenn dies nicht möglich ist, dann bin zu raten, ich die einzige andere Alternative, die ich habe, ist das erwartete Vertex Eingang Layout und prüfen Sie alle Parameter zu übergeben?

Antwort

1

Es ist nicht möglich zu wissen, was die Werte für InputSlot, InputSlotClass und InstanceDataStepRate sein sollten, nur einen Vertex-Shader gegeben. Es ist eine Frage der Datenbindung, im Gegensatz zur Datenverarbeitung. Der Vertex-Shader verarbeitet Daten, aber das Eingabe-Layout legt fest, wie die Daten dem Shader zugeführt werden.

Wenn Sie beispielsweise Ihre Shader-Eingabedefinition betrachten, geben Sie keinen Hinweis (außer dem Kommentar), dass worldMatrix ein Mitglied pro Instanz ist. In der Tat, es muss nicht sein - Sie könnten leicht eine Eingabe-Layout und Vertex-Puffer-Bindung, die es nicht pro Instanz Daten gemacht, mit der gleichen Vertex-Shader-Code. zu diktieren, was die Werte des Eingangs Layout instanziert werden, und deren Instancing Vorschubgeschwindigkeit

Als Alternative könnten Sie eine semantische Namenskonvention im Shader-Code erstellen. Zum Beispiel:

matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1; 

Durch die semantische Parsen, können Sie bekommen, dass es instanziert wird, den Eingabeschlitz und Schrittgeschwindigkeit. Ein solches Schema könnte jedoch mehr Probleme bereiten als es wert ist. Irgendwann müssen Sie wissen, welche Eingabedaten Sie haben und wie sie an einen von Ihnen geschriebenen Shader gebunden sind, und diktieren so das Eingabe-Layout.

+0

Ah das ist ein fairer Punkt in Bezug auf den Kommentar im Shader selbst, erwähnt eigentlich nichts über Slot-Nummern. Ich mag die semantische Idee, könnte es versuchen. Wenn Sie erwähnen, dass Sie wissen müssen, welche Eingabedaten Sie haben, was meinen Sie damit? Aufrufe wie IASetVertexBuffers? – TheRarebit

+0

Ja, ich meine, dass Sie wissen müssen, welche Scheitelpunktdaten Sie haben (z. B. die mit IASetVertexBuffers). Sie können zwar ein Schema in den Shader einfügen, um dies zu definieren, aber am Ende müssen Sie noch die Eckendaten haben. – MuertoExcobito

+0

Okay yeah Ich verstehe, nicht alles kann automatisiert werden Ich schätze, die Idee der Eingabe-Layout-Generation ist zwar automatisiert, aber vielleicht geben Sie Ihren Vorschlägen einen Versuch. Prost für das Feedback. – TheRarebit

Verwandte Themen