Results 1 to 6 of 6

Thread: Shadow Mapping Implementierung

  1. #1
    Veteran
    Join Date
    Jul 2012
    Posts
    4
    Thanks
    0
    Thanked 0 Times in 0 Posts

    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.
    Last edited by source_of_truth; 20-07-2012 at 10:43. Reason: gefixt

  2. #2
    Principal
    Join Date
    Nov 2008
    Posts
    28
    Thanks
    2
    Thanked 4 Times in 4 Posts
    Quote Originally Posted by source_of_truth View Post

    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.

  3. #3
    Veteran
    Join Date
    Jul 2012
    Posts
    4
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Quote Originally Posted by herrjohann View Post
    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;

  4. #4
    Principal
    Join Date
    Nov 2008
    Posts
    28
    Thanks
    2
    Thanked 4 Times in 4 Posts
    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

  5. #5
    Veteran
    Join Date
    Jul 2012
    Posts
    4
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Erst einmal danke ich schon einmal für deine Hilfe. 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
    Last edited by source_of_truth; 19-07-2012 at 22:50. Reason: text dazugefügt

  6. #6
    Veteran
    Join Date
    Jul 2012
    Posts
    4
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Ich habe das Problem, texture2D(shadowMap,shadowCoordinate.st) im Frag Shader ist Müll. Da muss vorher durch den w-Anteil geteilt werden.

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •