1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Shadow Mapping Implementierung

  • source_of_truth
  • 18. Juli 2012 um 21:29
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • source_of_truth
    Punkte
    25
    Beiträge
    4
    • 18. Juli 2012 um 21:29
    • #1

    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

  • herrjohann
    Punkte
    20
    Beiträge
    4
    • 19. Juli 2012 um 10:19
    • #2
    Zitat von source_of_truth

    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.

  • source_of_truth
    Punkte
    25
    Beiträge
    4
    • 19. Juli 2012 um 10:59
    • #3
    Zitat von herrjohann


    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;
  • herrjohann
    Punkte
    20
    Beiträge
    4
    • 19. Juli 2012 um 12:36
    • #4

    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 :)

  • source_of_truth
    Punkte
    25
    Beiträge
    4
    • 19. Juli 2012 um 22:44
    • #5

    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

  • source_of_truth
    Punkte
    25
    Beiträge
    4
    • 20. Juli 2012 um 10:44
    • #6

    Ich habe das Problem, texture2D(shadowMap,shadowCoordinate.st) im Frag Shader ist Müll. Da muss vorher durch den w-Anteil geteilt werden.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum