Problem mit CubeMap Textur (Omni-directional ShadowM)

  • Hallo,


    Ich realisiere momentan omni-directional shadow mapping an unserer Demo und habe dabei ein Problem:


    Grundsätzlich habe ich mich an die Folien aus dem Repetitorium gehalten.
    Mittels:

    Code
    1. // fragment shader
    2. vec3 fragToLight = fragPos - l_pos.xyz;
    3. float closestDepth = texture(cubemaptexture, fragToLight).r;
    4. closestDepth *= (near_far.y - near_far.x) + near_far.x;
    5. // use depth-values.
    6. fragColor = vec4(vec3(closestDepth / near_far.y), 1.0);


    überprüfe ich, ob die depth-cubemap auch richtig erzeugt worden ist. Und wenn ich das ausführe, dann bekomme ich auch die richtige depth-map (zumindest empfinde ich, dass sie richtig ist ;) ):


    burningman_depth.jpg (in der Mitte der Szene befindet sich ein Pointlight)


    Nun habe ich aber jetzt das Problem, dass ich im If-statement zur Unterscheidung, ob sich ein Punkt im Schatten befindet oder nicht, also:


    Code
    1. if(closestDepth+bias < currentDepth){
    2. //shadow
    3. result = 1.0;
    4. }else{
    5. // no shadow
    6. result = 0.0;
    7. }


    den float Wert closestDepth nicht verwenden kann. Sobald dieser verwendet wird, rendert der Shader keine Objekte mehr, die ihm zugewiesen worden sind.
    Warum passiert das? Hat der Wert, den man aus der cubemap herausließt vielleicht ein anderes Format? Interessant ist ja, dass mittels


    Code
    1. fragColor = vec4(vec3(closestDepth / near_far.y), 1.0);

    ich keine Probleme bekomme.


    Im Debugger (codeXL) sehe ich interessanterweise nur jeweils die X+ Seite der Cubemap, alle anderen sind schwarz. Ich dachte mir aber, dass das vielleicht nur ein Fehler im Debugger (ist ein AMD Debugger, habe aber eine Nvidia Karte) ist, schließlich gelingt es mir die depth-map auch komplett zu zeichnen.


    Bin über jede Hilfe dankbar!


    Liebe Grüße

  • Aha?


    Ich seh mal kein offensichtliches Problem mit dem if. Aber kann es sein, dass "currentDepth" einfach ein Topfen ist? Vielleicht ist das uniform für die light position nicht gesetzt oder sowas?


    Sobald dieser verwendet wird, rendert der Shader keine Objekte mehr, die ihm zugewiesen worden sind.


    Was genau heißt denn das? Sind dann Objekte schwarz, gibt es vielleicht einen Compile-Fehler beim Shader, der nicht ausgegeben wird?
    Was passiert, wenn ihr die Werte in der if Abfrage umdreht? Ist dann alles weiß?


    Funktioniert folgender Code?:

    Code
    1. result = 1.0 - [COLOR=maroon][B]step[/B][/COLOR](currentDepth - bias, closestDepth);


    Edit: Das mit CodeXL kann schon sein. Ich verlass mich bei Cubemaps nicht auf den Debugger. Das ist gefährliches Terrain :)

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • Aha?
    Was genau heißt denn das? Sind dann Objekte schwarz, gibt es vielleicht einen Compile-Fehler beim Shader, der nicht ausgegeben wird?
    Was passiert, wenn ihr die Werte in der if Abfrage umdreht? Ist dann alles weiß?


    Die Objekte werden nicht gerendert, sie sind weder schwarz noch weiß, auch wenn man die if Abfrage umdreht. Die Figur in der Mitte wird mit einem anderen Shader gerendert, deshalb kann ich es erkennen, dass die Objekte nicht mehr da sind. Wenn ich closestDepth auslasse, statt dem halt irgendeinen Wert (sagen wir 1.0) nehme, dann ist die Berechnung ok, die Werte werden weitergegeben und man kann weitere Berechnung in der Schattierung durchführen (und dann sind sie eben zum Beispiel schwarz).


    Aha?
    Funktioniert folgender Code?:

    Code
    1. result = 1.0 - [COLOR=maroon][B]step[/B][/COLOR](currentDepth - bias, closestDepth);


    Nein, leider. Dasselbe Problem besteht nach wie vor.


    Aha?
    Ich seh mal kein offensichtliches Problem mit dem if. Aber kann es sein, dass "currentDepth" einfach ein Topfen ist? Vielleicht ist das uniform für die light position nicht gesetzt oder sowas?


    Hm, ich wundere mich nur, weil wenn ich zuvor

    Code
    1. fragColor = vec4(vec3(closestDepth / near_far.y), 1.0);


    aufrufe, dann wird mir die depth ganz normal ausgegeben (so wie im screenshot im letzten Posting), deshalb bin ich davon ausgegangen, dass alle Parameter (uniforms) stimmen. Die light position habe ich auch versucht hardgecodet hineinzuschreiben, sie stimmt aber auch so, hab das im Debugger überprüfen können, ansonsten würde die depth-map nicht stimmen.


    Ich vermute es gibt wahrscheinlich wirklich irgendein Problem mit dem Shader, wie könnte ich irgendwelche nicht angezeigten Compilerfehler besser anzeigen lassen? Ich wundere mich schon sehr, weil der "kritische" Parameter closestDepth zuvor für das Zeichnen der depth ohne Probleme verwendet werden kann.


    Aha?
    Edit: Das mit CodeXL kann schon sein. Ich verlass mich bei Cubemaps nicht auf den Debugger. Das ist gefährliches Terrain :)


    Ok passt :) Danke für deine schnelle Rückmeldung!


  • Hm, ich wundere mich nur, weil wenn ich zuvor

    Code
    1. fragColor = vec4(vec3(closestDepth / near_far.y), 1.0);


    aufrufe, dann wird mir die depth ganz normal ausgegeben (so wie im screenshot im letzten Posting), deshalb bin ich davon ausgegangen, dass alle Parameter (uniforms) stimmen.


    Ich hab mich auf currentDepth bezogen.. Stimmt die garantiert?


    Edit: Könnt ihr auch mal prüfen, ob currentDepth und closestDepth NaN oder Inf sind? Und ggf. Farben ausgeben. Sowas wie if isnan(currentDepth) -> Farbe rot?

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

    Edited once, last by 2#4u ().

  • Ich hab mich auf currentDepth bezogen.. Stimmt die garantiert?

    Edit: Könnt ihr auch mal prüfen, ob currentDepth und closestDepth NaN oder Inf sind? Und ggf. Farben ausgeben. Sowas wie if isnan(currentDepth) -> Farbe rot?


    Ja, ich bin mir ziemlich sicher. Ok ich werde das probieren.

  • Ich hab mich auf currentDepth bezogen.. Stimmt die garantiert?

    Edit: Könnt ihr auch mal prüfen, ob currentDepth und closestDepth NaN oder Inf sind? Und ggf. Farben ausgeben. Sowas wie if isnan(currentDepth) -> Farbe rot?


    Ok, ich habe mal alles aus dem Shader hinausgegeben und ich beschränke mich nun auf die folgende Funktion:



    Sodass ein fragment rot gefärbt wird, wenn er im Schatten liegt, ansonsten wird dieser blau gefärbt. Ich habe in dieser vereinfachten Version auch noch die Möglichkeit wiederum die depth zu testen, die passt, sowie vorhin. Nur habe ich jetzt das Problem, dass alle fragments rot sind, also dass aus dem Vergleich hervorging, dass alles im Schatten ist. Im Vergleich zu vorhin werden die Objekte jetzt zwar doch gezeichnet, aber alle rot. Ich habe nochmal alle Parameter überprüft, die Position des fragments und als auch die Lichtposition stimmen, da ansonsten die depth map nicht stimmen würde. Kann es vielleicht sein, dass es an

    Code
    1. float currentDepth = length(fragToLight);

    liegt?


    (Vorhin habe ich auch auf isnan und isinf closestDepth und currentDepth untersucht, alle beide waren sauber, d.h. keine komischen Werte)

  • Ah, ich hab es gestern nicht gesehen, aber ein Problem ist closestDepth *=...
    Ist in den Folien übrigens richtig.


    Danke, ich habe die Probleme jetzt nach langem hin und her lösen können. :)


    Das Problem, warum ich am Anfang in der vollständigen Szene auf einmal nichts mehr gesehen habe ist, weil irgendwas mit der Berechnung der heightmap (für Normalmapping) nicht richtig funktioniert hat und somit hat sich das Ganze wahrscheinlich irgendwo ins Nirvana transferiert, nachdem ich das abgedreht habe, waren die Objekte wieder schwarz, also sichtbar.


    Und das eigentliche Problem, warum der Vergleich nicht funktioniert hat ist, weil die near und far Werte im 2ten Pass nicht richtig waren, ich hab dort vermutlich irgendein null übergeben oder so, was im Debugger dann als eine ganz kleine Zahl dargestellt wurde. Nachdem das dann richtig übergeben worden ist und ich das mapping nochmal überarbeitet habe, konnte ich dann die Schatten endlich sehen. :-)


    Danke nochmal für deinen Support!

  • Hallo, ich bin der Kollege von mathew11,


    Nachdem beim Kollegen mit Nvidia GPU zumindest mal die Cubemap und die Position der Schatten passen, liefert der gleiche code bei mir mit AMD GPU unbrauchbare Ergebnisse:


    Wenn ich wie im ersten Post die Depth Cubemap darstelle habe ich folgendes Ergebnis:
    informatik-forum.at/index.php?attachment/25664/
    Die Werte aus der Cubemap sind hier fast vollständig weiß bis auf ein paar (zu kleine) schwarze flecken an den falschen stellen.


    Wir haben bisher nichts finden können was hier das Problem sein könnte. Gibt es irgendwelche grundlegenden Punkte auf die man acht geben muss bei AMD/Nvidia?


    Wir können das Programm leider auch nicht auf der Nvidia GPU herzeigen, weil der zweite implementierte Effekt (Partikelsysteme mit Transform Feedback) wiederum nur auf der AMD GPU läuft.