Seite 1 von 1

[Gelöst] [DX11] Input Layout - VertexShader - Frage

Verfasst: 18.04.2010, 14:56
von NytroX
Hallo allerseits,

ich habe mich in letzter Zeit ein wenig mit DX 11 beschäftigt.
Gleich beim InputLayout ist mir in vielen Tutorials folgendes aufgefallen:

Es wird in InputLayout erstellt:

Code: Alles auswählen

D3D11_INPUT_ELEMENT_DESC elements[] =
{
	 { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}
und der Vertexbuffer mit je 3 floats gefüllt. Soweit alles super.

Im VertexShader sieht man dann aber z.B. folgendes:

Code: Alles auswählen

struct VS_IN
{
	 float4 pos	: POSITION;
};
Meine Frage:
Warum ist die Position im ImputLayout ein float3 (also DXGI_FORMAT_R32G32B32_FLOAT) und im Shader dann ein float4?

Müsste das InputLayout nicht eher so aussehen (mit RGBA):

Code: Alles auswählen

D3D11_INPUT_ELEMENT_DESC elements[] =
{
	 { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}
Und dann auch 4 floats übergeben werden?

Ist das so definiert, dass man das 4. element einfach weglassen darf und es im shader automatisch einen wert annimmt (z.B. immer auf 1.0f gesetzt wird) oder undefiniert bleibt?
Oder müsste man den VertexShader input dann eher auf "float3 pos : POSITION;" ändern?


Danke und Grüße
NytroX

Re: [DX11] Input Layout - VertexShader - Frage

Verfasst: 18.04.2010, 15:35
von anonym
Ist das so definiert, dass man das 4. element einfach weglassen darf und es im shader automatisch einen wert annimmt (z.B. immer auf 1.0f gesetzt wird) oder undefiniert bleibt?
Oder müsste man den VertexShader input dann eher auf "float3 pos : POSITION;" ändern?
Zumindest ist es bei Direct3D9 so, dass die verschiedenen D3DDECLTYPE (http://msdn.microsoft.com/en-us/library ... 85%29.aspx) vom Input Assembler nach bestimmten Mustern interpretiert werden:
D3DDECLTYPE_FLOAT1 wird zu float4(value0, 0, 0, 1)
D3DDECLTYPE_FLOAT2 wird zu float4(value0, value1, 0, 1)
D3DDECLTYPE_FLOAT3 wird zu float4(value0, value1, value2, 1)
D3DDECLTYPE_FLOAT4 wird zu float4(value0, value1, value2, value3)
D3DDECLTYPE_D3DCOLOR wird zu float4(value0/255, value1/255, value2/255, value3/255)
D3DDECLTYPE_DEC3N wird zu float4(value0/511, value1/511, value2/511, 1)
...

Für Direct3D10+ habe ich dazu leider nichts gefunden. Denke aber, dass es genauso laufen wird.

Edit:
Habe in einem alten Direct3D11-Project mit DXGI_FORMAT_R32G32B32_FLOAT zu float4:POSITION mittels PIX nachgesehen. Obwohl laut Dokumentation von D3D10+ keine Default-Werte in den Inputregistern gesetzt werden, hatten die w-Komponenten den Wert 1 (zwangsweise, sonst hätte ich nichts sehen dürfen). Bei D3D9 steht die Anmerkung "Partial (0, 0, 0, 1) - If only a subset of channels are updated, the remaining channels will default to (0, 0, 0, 1)."

Re: [DX11] Input Layout - VertexShader - Frage

Verfasst: 18.04.2010, 17:29
von NytroX
Hey super, vielen Dank.

Den Link kannte ich noch garnicht.
Mit PIX hatte ich auch geschaut, funktionieren tut es auch (DEBUG+RELEASE), aber ob man sich da drauf verlassen kann, bin ich mir halt nicht sicher.

Vielleicht sollte man ab dx10 wohl besser den 4. Wert mitgeben, oder zumindest nicht im Shader drauf bauen, dass da was sinnvolles drin steht.

Meiner Meinung nach is die DX10/DX11 doku sowieso recht mager. Wenn ich kein Plan von DX9 hätte, wäre ich schon vor langer Zeit verzweifelt :?

Naja, ich geb den 4. Wert mit 1.0f dann doch lieber jedesmal mit, man weiss ja nie, ob sie das irgendwann mal ändern...


Danke nochmal und viele Grüße
NytroX

Re: [DX11] Input Layout - VertexShader - Frage

Verfasst: 20.04.2010, 16:19
von kimmi
Ich denke, das hat mit der Tatsache zu tun, daß die Transformationen im homogenen Transformationen auf der GPU durchgeführt werden. Und die haben als Matrizen nun mal das Layout 4x4 bzw. als Vektor 1x4.

Gruß Kimmi

Re: [DX11] Input Layout - VertexShader - Frage

Verfasst: 20.04.2010, 16:34
von Krishty
Die Größe der Vektoren ist egal … da es sich mittlerweile um GPGPUs handelt ist auch das mit der Transformation hinfällig … nüchtern gesehen ist das Füllen mit 1 ein Akt der Güte.

Ich sehe das ebenfalls als fiese Lücke in der Dokumentation … leider nicht die Erste (so weiß ich bis heute nicht, ob das Setzen eines Default-States via NULL API-konform ist, und z.B. das SlimDX-Team auch nicht). Ich mache es trotzdem, weil MS ein Interesse daran hat, kompatibel zu bleiben … leider liegt die Sache mit der W-Komponente afaik nicht bei D3D, sondern beim Treiber. Teste das am besten auf exotischen Karten (Intel-Chipsets, Matrox?), bevor du es endgültig benutzt.

… oder du füllst von Hand von einem float3- in einen float4-Vektor um, das ist eindeutig und portabel und müsste vom Compiler wegoptimiert werden.

Aber ein Tipp am Rande: Wenn deine W-Komponente sowieso immer 1 ist, kannst du eine Rechenoperation sparen und bei float3 bleiben.

Re: [DX11] Input Layout - VertexShader - Frage

Verfasst: 20.04.2010, 20:54
von NytroX
… nüchtern gesehen ist das Füllen mit 1 ein Akt der Güte
Dann will ich mal gütig sein und fülle das mit 1 :D
Ich denke ich lass das auch erstmal so, wenn das irgendwann tatsächlich mal Probleme machen sollte kann ich mich immernoch damit beschäfigen.

Danke nochmal für eure Meinungen.

Gruß, NytroX.