1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Shadow Mapping Implementierung

  • source_of_truth
  • 18. Juli 2012 um 21:29
  • Unerledigt
  • source_of_truth
    2
    source_of_truth
    Mitglied
    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
    2
    herrjohann
    Mitglied
    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
    2
    source_of_truth
    Mitglied
    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
    2
    herrjohann
    Mitglied
    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
    2
    source_of_truth
    Mitglied
    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
    2
    source_of_truth
    Mitglied
    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.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung