GLSL ShadowMapping



  • Hallo.
    Nunja, ich habe aufbauend auf mehreren Artikeln zu diesem Thema(uteranderem auch von nvidia) versucht, einen(bzw. 2, da Tiefen-"Map") shader zu schreiben.
    Tja, jetzt liegt die ganze Szene im Schatten.
    Vielleicht kann ja mal jemand drüberschauen. Einfacherhalber werden alle Pixel weiß gefärbt(ohne Schatten). Also sind beleuchtete Pixel weiß und welche im Schatten werden dunkler.

    Zuerst rendere ich die Tiefentextur.
    Diese wird dann im Schatten-Renderpass genutzt.
    Der Schatten-Renderpass, rendert direkt in den Framebuffer.

    Tiefentextur:

    depth.glvert

    uniform mat4 depthMVP;
    
    void main()
    {
        gl_Position = depthMVP * gl_Vertex;
    }
    

    depth.glfrag

    void main()
    {
        gl_FragDepth = gl_FragCoord.z;
    }
    

    Schatten:

    shadow.glvert

    #version 150 compatibility
    
    uniform mat4 depthBiasMVP;
    out vec4 shadowCoord;
    
    void main()
    {
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    
        shadowCoord = depthBiasMVP * gl_Vertex;
    }
    

    shadow.glfrag

    #version 150 compatibility
    
    uniform sampler2DShadow shadowMap;
    in vec4 shadowCoord;
    
    void main()
    {
        float shadow = texture(shadowMap, vec3(shadowCoord.xy, (shadowCoord.z) / shadowCoord.w));
    
        gl_FragColor =  vec4(1.0, 1.0, 1.0, 1.0) * shadow;
    }
    

    Edit:
    Ich hab vergessen zu sagen, dass depthMVP und depthBiasMVP, durch das Hauptprogramm an die Shader gegeben werden.
    Also depthMVP ist die MVP-Matrix, von der Lichtquelle aus.
    Und depthBiasMVP ist diese MAtrix multipliziert mit der Bias-Matrix.

    Danke 🙂


  • Mod

    was ist bei dir die bias matrix? depth bias damit es keine akne gibt oder der *0.5+0.5 offset?

    mach die scene moeglichst einfach, projeziere den schatten nur auf eine ebene und werfe nur von einer box die drauf steht. fuer den anfang erspar dir texturesampling (pcf etc) und map einfach nur den depth wert auf die flaeche (sollte alles maximale tiefe sein bis auf den bereich wo der cube ist. du kannst testweise gl_FragDepth = 0.f; ausgeben, einfach nur um zu sehen, ob du die richtige cube kontur zu sehen bekommst.

    wenn der cube erstmal richtig projeziert wird, ist es einfacher die shadowmap tiefe zu debuggen.



  • Okay danke.
    Ich bin halt noch ein ziemlicher Anfänger auf dem Gebiet.
    Ist echt schwer für mich, da etwas zu verstehen.
    Wie shadowmapping funktioniert weiß ich jetzt, aber die Umsetzung wie man sieht, krieg ich micjt hin.

    Naja, ich werd deinen Rat mal befolgen 😃


Anmelden zum Antworten