Seite 1 von 1

DX11 Inputlayout Shader Differenzen [GELÖST]

Verfasst: 24.10.2012, 14:01
von furbolg
Hallo ZFX'ler,

nach langer Zeit will ich mich wieder mit dem Thema 3D bzw. DX beschäftigen.

Nun schwirrt mir folgende Frage im Kopf herum. Wie verhält sich ein Shader wenn das InputLayout nicht übereinstimmt ?
Zum Beispiel wenn das InputLayout POSITION, TEXCOORD und NORMAL enthält. Wie wirkt sich das auf Shader aus die mehr bzw weniger Attribute verlangen ?

Es geht mir bei diesen Fragen darum ob es Sinn macht für ein Spiel/Engine ein möglichst umfangreiches InputLayout ( alle möglichen Attribute ob unnötig oder nicht ) vorzugeben oder ob man
besser die InputLayouts "dynamisch" zusammensetzen sollte.

mfg
Furb

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 24.10.2012, 16:45
von dot
Das Input Layout muss mit der Input Signature des Shader exakt übereinstimmen:
MSDN hat geschrieben:Each input-layout object is created based on a shader signature; this allows the API to validate the input-layout-object elements against the shader-input signature to make sure that there is an exact match of types and semantics. You can create a single input-layout object for many shaders, as long as all of the shader-input signatures exactly match.

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 04:52
von furbolg
Hi dot,

danke für die Antwort.

Wie regelt man sonst diese Shader <-> InputLayout Geschichte ? Gebt ihr den Shadern entsprechende Namen (ptn_foo.hlsl etc.) ?

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 05:01
von dot
Ich versteh nicht ganz, was genau ist denn das Problem mit der "Shader <-> InputLayout Geschichte " bzw. was genau ist dabei unklar!?

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 05:33
von furbolg
Ich würde gerne die ganze Geschichte automatisieren z.B.

Code: Alles auswählen

Mesh würfel; // Mesh ist eine selbstprogrammierte Klasse welche die nötigen BufferObjekte etc enthält
würfel.addvertex(...);
würfel.adduv(...);
Das würde einen Shader mit POSITION und TEXCOORD benötigen.
Wenn jetzt noch Normals dazu kommen müsste ein anderer Shader gewählt werden ( ptn_foo.hlsl statt pt_foo.hlsl ).

Oder verstehe ich das falsch ?

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 06:27
von dot
Das hängt alles irgendwie einfach viel zu sehr vom Design deiner Anwendung ab, als dass man da irgendwas Allgemeines dazu sagen könnte. Auch ist mir immer noch unklar, auf was genau für eine Antwort du wartest. Du kannst verschiedenste Shader mit verschiedensten Input Formaten verknüpfen. Für jede Kombination aus Input Format und Shader Signature brauchst du eben ein eigenes Input Layout; das ist ja gerade der Sinn des Input Layout: Es verknüpft den Shader mit den Daten. Deine Inputdaten können aber z.B. mehr enthalten als der Shader nutzt, die überflüssigen Daten werden dann eben nicht verwendet...

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 07:14
von furbolg
dot hat geschrieben:Für jede Kombination aus Input Format und Shader Signature brauchst du eben ein eigenes Input Layout; das ist ja gerade der Sinn des Input Layout: Es verknüpft den Shader mit den Daten. Deine Inputdaten können aber z.B. mehr enthalten als der Shader nutzt, die überflüssigen Daten werden dann eben nicht verwendet...
Ach so, nochmal kurz für mich:
1. Das heisst ich kann im InputLayout spezifizieren über welche Attribute das Model/Mesh verfügt und der Shader nutzt die Daten welche er benötigt ?

2. Wenn der Shader Attribute benötigt welche im InputLayout nicht vorkommen, dann erhalte ich eine Exception/nullptr ?

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 15:17
von dot
furbolg hat geschrieben:1. Das heisst ich kann im InputLayout spezifizieren über welche Attribute das Model/Mesh verfügt und der Shader nutzt die Daten welche er benötigt ?
Nein, das Layout verknüpft einen Shader einer konkreten Signatur mit Daten einer konkreten Form. Beim Erzeugen des Input Layout übergibst du ein Array aus Input Element Deskriptoren, welches dein Daten Layout beschreibt und eine Shader Signatur. Das resultierende Input Layout verbindet Daten genau dieser Form mit Shadern genau dieser Signatur. Anderes Daten Layout und/oder andere Signatur benötigen ein anderes Input Layout. Du kannst aber eben für beliebige Vertex Buffer und beliebige Shader das selbe Input Layout verwenden, so lange da daten das selbe Daten Layout haben und die Shader sie selbe Input Signatur...
furbolg hat geschrieben:2. Wenn der Shader Attribute benötigt welche im InputLayout nicht vorkommen, dann erhalte ich eine Exception/nullptr ?
Vermutlich wird einfach die Erstellung des Layout fehlschlagen. Die Debug Runtime sollte dich auf jeden Fall darauf hinweisen. Unter gewissen Umständen schlägt auch nichts fehl und du hast dann eben sowas wie undefiniertes Verhalten. Im schlechtesten Fall funktioniert es auf manchen Karten und Treibern einfach und du bemerkst es nicht, im besten Fall stürzt es ab. In jedem Fall ist es ein Bug...

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 16:01
von furbolg
Danke dot für deine Hilfestellung, ich werde mir das ganze am Wochende in Ruhe nochmal genauer anschauen.

Ist schon ne kleine Umstellung von Dx9 (FFP ;)) auf DX11 (Shader).

Aber danke für deine Erklärungen.

Re: DX11 Inputlayout Shader Differenzen

Verfasst: 25.10.2012, 16:08
von dot
Naja, in D3D9 gabs auch schon VertexDeclarations. Aber gut, wenn du nur mit der FFP gearbeitet hast, dann ist das natürlich eine gewaltige Umstellung... ;)