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

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
NytroX
Establishment
Beiträge: 365
Registriert: 03.10.2003, 12:47

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

Beitrag 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
Zuletzt geändert von NytroX am 20.04.2010, 20:55, insgesamt 1-mal geändert.
anonym
Beiträge: 79
Registriert: 15.07.2009, 07:35
Kontaktdaten:

Re: [DX11] Input Layout - VertexShader - Frage

Beitrag 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)."
NytroX
Establishment
Beiträge: 365
Registriert: 03.10.2003, 12:47

Re: [DX11] Input Layout - VertexShader - Frage

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [DX11] Input Layout - VertexShader - Frage

Beitrag 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
Benutzeravatar
Krishty
Establishment
Beiträge: 8260
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Input Layout - VertexShader - Frage

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
NytroX
Establishment
Beiträge: 365
Registriert: 03.10.2003, 12:47

Re: [DX11] Input Layout - VertexShader - Frage

Beitrag 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.
Antworten