SlimDX VertexShader

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    SlimDX VertexShader

    Hallo,
    ich versuche in SlimDX einen Effect zum rendern zu benutzen. Laden etc. funktioniert alles ohne Fehler, aber der Ebene die gerendert werden soll wird nicht gerendert.
    Das ist der Effect Code:

    Quellcode

    1. float4x4 matrixWorld;
    2. float4x4 matrixView;
    3. float4x4 matrixProjection;
    4. struct VSIN
    5. {
    6. float3 position : POSITION;
    7. };
    8. struct VSOUT
    9. {
    10. float4 position : POSITION;
    11. };
    12. VSOUT mainVS(VSIN inp)
    13. {
    14. VSOUT ret;
    15. float3 wtrans = mul(inp.position, matrixWorld).xyz;
    16. float4 vtrans = mul(wtrans, matrixView);
    17. float4 ptrans = mul(vtrans, matrixProjection);
    18. ret.position = ptrans;
    19. return ret;
    20. }
    21. float4 mainPS() : COLOR {
    22. return float4(1, 1.0, 1, 1.0);
    23. }
    24. technique FX {
    25. pass p0 {
    26. VertexShader = compile vs_3_0 mainVS();
    27. PixelShader = compile ps_3_0 mainPS();
    28. }
    29. }

    Wenn ich in der Technique VertexShader = NULL setze funktioniert alles ohne Probleme. Desshalb muss es ja am VertexShader liegen. Die Variablen werden auch alle gesetzt.

    Quellcode

    1. effect.Technique = "FX";
    2. effect.SetValue("matrixWorld", Matrix.Translation(position));
    3. effect.SetValue("matrixView", cam.ViewMatrix);
    4. effect.SetValue("matrixProjection", cam.ProjectionMatrix);

    und dann noch der Code zum zeichnen:

    Quellcode

    1. dev.VertexDeclaration = vertexBuffer.Declaration;
    2. dev.Indices = indexBuffer.Buffer;
    3. dev.SetStreamSource(0, vertexBuffer.Buffer, 0, System.Runtime.InteropServices.Marshal.SizeOf(typeof(SVertexWater)));
    4. int passes = effect.Begin(FX.None);
    5. for (int i = 0; i < passes; i++)
    6. {
    7. effect.BeginPass(i);
    8. dev.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexBuffer.Data.Length, 0, indexBuffer.Data.Length / 3);
    9. effect.EndPass();
    10. }
    11. waterEffect.End();


    Ich hoffe es gibt hier Leute die sich mit DirectX 9 und SlimDX auskennen, die mir helfen können. Ich sitze jetzt schon meherere Tage an dem Problem...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „progglord“ ()

    ret.position = ptrans;

    Bist du dir sicher, dass die Position der Primitives Anhand der Projektionsmatrix bestimmt werden soll?
    sry, hab übersehen, dass das die jeweilige drüberliegende Matrize mit einschließt...
    bzw.
    effect.SetValue("matrixWorld", Matrix.Translation(matWorld));

    Was bewirkt das Matrix.Translation? Das nur die Translations Werte verwendet werden? Sind dann die Skalierungswerte 0, oder wie bei der Identity Matrix 1...

    bzw. wie sehen deine Matrizen im Allgemeinen aus? World-Matrix = Identity? Versuch es evtl. mal...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Matrix.Translation macht nur eine Translation Matrix (also Position im Raum) und das ich als Parameter matWorld übergebe war ein Kopierfehler, ich übergebe normalerweise nat. die Position.

    Und Die World Matrix auf Matrix.Identity zu setzen bringt leider auch nichts, es werden auch die Skalierungswerte auf 1 gesetzt (ich habe nochmal Matrix.Identity * Matrix.Translation(..) probiert)
    Auch wenn ich die World Matrix völlig aus der berechnung ausschließe funktioniert es nicht.

    Die Matrizen cam.ViewMatrix und cam.ProjectionMatrix sind natürlich die View und Projektions Matrizen.
    und die Ansichts und Projektionsmatrix sind wie gesetzt? Also den Code z.B. Um dann noch zu erkennen, warum es nicht angezeigt wird, wären natürlch noch die Bemaßungen des Objekts interessant...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Wenn ich den VertexShader ausschalte also im Shader VertexShader = NULL setze, dann wird es ja korrekt gezeichnet und auch wenn ich es ohne Shader zeichne funktioniert es auch. Und dabei übergebe ich der SetTransform Funktion vom Device genau die gleichen Matrizen. Desshalb bin ich mir sicher das es nicht an den Matrizen liegt.

    Was vllt. noch erwähnenswert ist ist das ich vorher noch etwas ohne Shader zeichne und danach alle Matrizen die ich mit SetTransform gesetzt habe wieder auf Matrix.Identity zurücksetze.