Tangenten an Vertex-Shader übergeben (DirectX 9)
-
Erst einmal Hallo und Frohe Weihnachten an alle.
Jetzt zu meinem Problem:
Ich bin im Moment dabei, mich am Normal-Mapping zu versuchen.
Hab dazu auch einen Vertex-und Pixel-Shader gefunden, der auch relativ verständlich ist, allerdings gibt es da ein Problem für mich.
Hier der Code:VS_OUTPUT VertexShader(float4 Pos : POSITION, float3 Normal : NORMAL, float2 Tex : TEXCOORD0, float3 Tangent : TANGENT0) { . . .
Meine Vertices stelle ich durch folgende Struktur dar:
struct Vertex { Vector3D vPosition; Vector3D vNormal; Vector2D vTexcoord; };
Jetzt weiss ich nicht, wie ich die Tangente an den Vertex-Shader übergeben soll.
(Sehe ich das richtig, dass ich die Tangente in die Struktur einbauen muss? Hab aber kein FVF-Flag "D3DFVF_TANGENT" oder ähnliches gefunden.) Und Noch ein Problem: Vector3D ist bei mir 3 Bytes groß, im Vertex-Shader steht aber float4. Gibt es da noch etwas zu beachten?Vielen Dank schon mal im Voraus.
-
Das FVF ist auch ein Überbleibsel der Fixed Function Pipeline, verwend stattdessen eine VertexDeclaration. Und ein Vector3D ist 3 floats also 12 Bytes groß, es kann nur sein dass in der 4ten Komponente ein zusätzlicher float gespeichert ist der angibt welche Orientierung der Tangentspace hat, den braucht man wenn man die Bitangente im Shader berechnen will.
-
Ja, das mit den Vertex-Declarations sieht schon vielversprechend aus.
Kann ich auch mit FVFs und Vertex-Declarations zusammen arbeiten? So zum Beispiel:struct Vertex { Vector3D vPosition; Vector3D vNormal; Vector2D vTexCoord; Vector3D vTangent; static const DWORD dwFVF = D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1; }; // Kein Vertex-Shader vorhanden: pDirect3DDevice->SetFVF(Vertex::dwFVF); pDirect3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,pVertices,sizeof(Vertex)); // Vertex-Shader vorhanden: pDirect3DDevice->SetVertexDeclaration(&VertexDeclaration); // EffectSetzen; BeginPass; ... pDirect3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,pVertices,sizeof(Vertex));
Wäre nämlich ein wenig ungünstig, wenn ich alles auf Vertex-Declarations umschreiben müsste. Ansonsten dachte ich, dass ich dem Vertex-Shader die Tangenten auch einfach in dreidimensionale Texturkoordinaten schreiben könnte (Das wäre dann aber ein wenig gepfuscht), oder ist davon abzuraten?
-
AnfängerMitProblem schrieb:
Wäre nämlich ein wenig ungünstig, wenn ich alles auf Vertex-Declarations umschreiben müsste. Ansonsten dachte ich, dass ich dem Vertex-Shader die Tangenten auch einfach in dreidimensionale Texturkoordinaten schreiben könnte (Das wäre dann aber ein wenig gepfuscht), oder ist davon abzuraten?
Natürlich. Ein FVF wird intern eh nur in eine VertexDeclaration übersetzt. Allerdings würd ich in neuem Code einfach auf VertexDeclarations setzen.
-
Vielen Dank für deine Hilfe, dann werde ich mich mal an die Arbeit machen.
Falls es noch Probleme geben sollte, schreibe ich das einfach hier hinein.
-
Falls es doch unbedingt das FVF sein soll, dann schmuggel die Tangente als 3D Texturkoordinate zu deinem VertexShader.