Shadow Mapping Implementierung

  • Das Problem wurde gefixt. Es handelte sich um einen bescheuerten Tipfehler im Shader.
    Zur Erklärung des Shadow Mappings allgemein, bitte besuche den Post der unten mehrfach erwähnt wird.

    2 Mal editiert, zuletzt von source_of_truth (20. Juli 2012 um 10:43) aus folgendem Grund: gefixt

  • der Vertex Teil vom Shadow Shader ist

    Code
    ...
    void main()
    {
        shadowCoordinate = gl_TextureMatrix[1] * gl_Vertex; //coordinate in lightCoordinates
        vertex = vec3(gl_ModelViewMatrix * gl_Vertex);  //coordinate in cameraCoordinates
        ...
    }


    Du musst bei shadowCoordinate auch die Model-Matrix deines Objektes berücksichtigen (oder sind diese bereits im World-Space?):
    shadowCoordinate = gl_TextureMatrix[1] * matModel * gl_Vertex;

    Entweder du lädst diese für jedes Objekt hoch oder du verwendest gl_ModelViewMatrix und berücksichtigst die inverse View-Matrix in der gl_TextureMatrix[1] um den View-Anteil aufzuheben (ist im gelinkten Thread beschrieben).

    Außerdem würde ich eine aktuellere OpenGL Version verwenden, viele Methoden in deinem Source-Code sind in der OpenGL-Spec als deprecated markiert.


  • Entweder du lädst diese für jedes Objekt hoch oder du verwendest gl_ModelViewMatrix und berücksichtigst die inverse View-Matrix in der gl_TextureMatrix[1] um den View-Anteil aufzuheben.

    Aber die gl_TextureMatrix[1] wird bei mir doch durch: bias * shadow_projection * shadow_modelview berechnet, damit werden die Vertices doch direkt entsprechend transformiert.

    Standart ist doch diese Gleichung: projection * view * model * vertex = projection * modelview * vertex
    Schatten mit der inversen Matrix funktioniert so: shadow_projection * shadow_modelview * modelview^⁻1 * modelview * vertex
    und das ist doch gleich: shadow_projection * shadow_modelview * vertex
    was mein Code (plus den bias) doch berechnet, oder bin ich wirklich zu blöde :) ?

    Code
    glLoadMatrix(b);
    glMultMatrix(p);
    glMultMatrix(m);
    //matrix is now stored in gl_TextureMatrix[1]
    Code
    shadowCoordinate = gl_TextureMatrix[1] * gl_Vertex;
  • Mit deinen Aussagen hast du recht aber die shadow_modelview Matrix ist für jedes Objekt (mit unterschiedlicher Model-Matrix) verschieden, du verwendest aber die gleiche ModelView Matrix beim ShadowMap-Lookup für alle Objekte.
    Nach dem Erstellen der ShadowMap mit der Methode renderModelsQuick() holst du dir die ModelView-Matrix. Diese enhält entweder nur den View-Anteil (wenn du deine Matrix auf dem Matrix-Stack mit Push und Pop gesichert hast) oder den View-Anteil mit der Model Matrix des letzten gezeichneten Objekts.
    Die Matrix gl_TextureMatrix[1] ist bei dir für jedes deiner Objekte gleich und verändert sich nicht mit der "Model-Matrix" der Objekte.

    Schau dir vielleicht noch einmal die Erklärung in diesem Post an.
    Hoff du findest dich zurecht, diese Matrizen sind manchmal etwas verwirrend :)

  • Erst einmal danke ich schon einmal für deine Hilfe. :thumb: Geschafft ist es aber noch nicht, denn ich habe nur ein Objekt, dass ist das Verrückte. Sprich, die Model-Matrix ist gleich.

    Die cam.applyModelViewMatrix() Methode verschiebt nur mein Objekt, bzw erzeugt eine neue ModelViewMatrix für die Szene, abhängig von den Cameraeinstellungen.

    Code
    glLoadIdentity();
            glRotatef(pitch, 1, 0, 0);
            glRotatef(yaw, 0, 1, 0);
            glRotatef(roll, 0, 0, 1);
            glTranslatef(-x, -y, -z);

    Diese werden wie oben zu sehen in der renderShadow() überschrieben, die Kamera wird angepasst, die ShadowMap gerendert

    Einmal editiert, zuletzt von source_of_truth (19. Juli 2012 um 22:50) aus folgendem Grund: text dazugefügt

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!