Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Bergmann89 hat geschrieben:
Hey,
@yunharla: das erklärt aber nicht, warum die Ebene, die genau unter den Objekten ist so schattiert wird, als wäre zwischen Objekt und Ebene noch Platz.
Durch dein Offset verschiebst du ja sozusagen deine Ebene um Offset*normalize(LichtRichtung). Wenn deine Tiefe dann von 1.0 bis 1024.0 geht und ein Offset von 0.0005 genommen wird, dann hast du so pi*Daumen ne Verschiebung von 2 Einheiten... [edit] oder doch 0.5???? argh , bin verwirrt, olla apfel dreck zermatscht vollkommen die Rübe [/edit]
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Wir reden über folgendes Problem oder (siehe Anhang)?
Ich hatte es im Shader schon ohne Offset probiert, was aber nicht wirklich geholfen hat. Deaktiviert man glCullFace komplett, dann hat man das Problem nicht mehr, dass das dann aber wieder andere Probleme verursacht sollte leider auch klar sein Eine wirkliche Lösung hab ich dafür leider noch nicht gefunden.
die Tiefe macht eigentlich nur großartig Sinn wenn man sie an anderer Stelle nochmal braucht, ansonsten will man ja nur wissen ob der "Strahl" geschnitten wird.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Aber wie du schon gesagt hast, gibts dan keine Selbstschattierung mehr. Die wollte ich zwar teilweise nicht haben, aber ganz abschalten wollte ich sie auch nicht^^ Ich hatte nur das Problem, das ein Face sich selbst Schattiert, das hab ich aber auch einigermaßen in den Griff bekommen. Ich könnte die konvexen Mesh's so zerlegen, das ich mehrere konkave Mesh's aheb, und ihnen dann unterschiedliche IDs geben, das sie sich gegenseitig so schattieren wie ich das haben will, aber da wäre der Aufwand viel zu groß. Und ich glaub du verwechselst da was. Das Offset wirkt in Richtung des Lichtes. Unser Problem ist, das der Schatten der Flächen an der globalen y-Achse nicht richtig verschoben wird. Das hat mit dem Offset im Shader nix zu tun...
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Naja, nachdem was Ihr geschrieben habt, ist es vermutlich nicht der gleiche Fehler.
Ich habe eine ganz einfache Testanwendung: irgendein Objekt (ich verwende derzeit Würfel, Kugel und Torus), das sich vor einer Wand dreht. In der Testanwendung wird ein direktionales Licht grade von vorne (Lichtrichtung = [0/0/-1]) auf die "Szene" geworfen; die Kamera steht leicht links davon, siehe unten links.
Als Bergmann geschrieben hatte, dass ein Grafik-Fehler bei den Schatten beim Verschieben entstanden ist, habe ich ganz hektisch nachgesehen, ob das bei mir auch auftritt. Aber das ist nicht der Fall: wenn ich die Wand nach hinten verschiebe, wird nur der Schatten größer.
Wenn ich aber den Torus um 0.75 nach oben verschiebe, kommen plötzlich seltsame Balken, die sich vom Schatten bis zu einer Wandkante ziehen (siehe unten mitte); am schlimmsten war das beim Würfel. Das entsteht, wenn der Schatten auf der Shadowmap nur zum Teil zu sehen ist, die felhlenden Pixel werden vom System je nach Texturparametern ersetzt.
Eigentlich dachte ich, dass das durch die Shaderzeile
"if (ShadowCoord.w > 0.0)"
verhindet werden soll, das funktioniert bei mir aber nicht.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Bergmann89 hat geschrieben:
Aber wie du schon gesagt hast, gibts dan keine Selbstschattierung mehr. Die wollte ich zwar teilweise nicht haben, aber ganz abschalten wollte ich sie auch nicht^^ Ich hatte nur das Problem, das ein Face sich selbst Schattiert, das hab ich aber auch einigermaßen in den Griff bekommen. Ich könnte die konvexen Mesh's so zerlegen, das ich mehrere konkave Mesh's aheb, und ihnen dann unterschiedliche IDs geben, das sie sich gegenseitig so schattieren wie ich das haben will, aber da wäre der Aufwand viel zu groß. Und ich glaub du verwechselst da was. Das Offset wirkt in Richtung des Lichtes. Unser Problem ist, das der Schatten der Flächen an der globalen y-Achse nicht richtig verschoben wird. Das hat mit dem Offset im Shader nix zu tun...
oh verstehe. Hast du eventuell mal versucht deine Matrizen mittels LoadMatrix zu setzen bzw zu debuggen?? btw die Normale brauchst du so oder so um die unterschiedlichen Auflösungen richtig zu filtern, von daher sollte die Selbstschattierung kein Problem sein
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
@yunharla: was für eine Normale? @Traude: die abgeschnittenen Schatten hatte ich bei mir auch, das hab ich dann einfach mit nem Farbverlauf gemacht, dann sieht es nicht ganz so krass aus. Die ganzen aktuellen Spiele machen das ja auch so. Das Problem was AMD und ich haben ist jedoch ein anderes. Leg die Plane in deiner Testanwendung mal in die XZ-Ebene un mach das Licht schräg von oben. Und dann verschieb die Plane nach unten. Wenn du die Plane um -1 LE verschiebst, dann wird der Schatten auf die Ebene projeziert, der bei einer Verschiebung von -2 LE richtig wäre. Wenn's jmd intressiert: so hab ich das mit dem Verlauf gemacht:
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Bergmann89 hat geschrieben:
Leg die Plane in deiner Testanwendung mal in die XZ-Ebene un mach das Licht schräg von oben. Und dann verschieb die Plane nach unten. Wenn du die Plane um -1 LE verschiebst, dann wird der Schatten auf die Ebene projeziert, der bei einer Verschiebung von -2 LE richtig wäre.
Ich habe nochmal eine kleine Testreihe gemacht.
- Plane in die XZ-Ebene gedreht, Mittelpunkt = Koordinatenursprung - Kugel mit Radius 1 obendrauf, demgemäß Kugelmittelpunkt = (0/1/0) - Licht: Direktionales Licht, Position = (+0,+6,+0), Richtung = (0.75,-1,-1) - Kamera: Position = (0,+0.5,+6), Vorwärts-Richtung = (0,-0.26,-0.97),
Zum Licht: der Shader rechnet es zwar als direktionales Licht, aber für LookAt brauch ich auch eine Position, und wenn man die verändert, hat das auch Auswirkungen auf die ShadowMap. Wenn man die Lichtposition näher heranschiebt, beginnen sich bei mir auf der Kugel Artefakte zu bilden.
Das Bild unten zeigt das Ergebnis. Ganz links steht die Kugel direkt auf der Ebene, in der Mitte ist die Ebene um 1 nach unten verschoben, rechts um 2 nach unten verschoben, ansonsten keine Änderungen bei den anderen Einstellungen.
Ich habe das Originalbild bei mir ganz trivial am Bildschirm abgemessen: der Schatten wird größer, zwar nur wenig, aber doch messbar. Kommt mir eigentlich ganz normal vor, bloß der Schatten ist zu pixelig, weil ich noch keine Softshadows habe.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Bergmann89 hat geschrieben:
@yunharla: was für eine Normale?
Sorry für die Verspätung,musste erst mal an meinen Rechner kommen. Ich glaube dir ist noch nicht ganz klar wie sich das Problem welches Schläfer in seinen Diagramm aufzeigt tatsächlich auswirkt. Wie man sieht reicht es nicht aus die Interpolation vom Shadowmaptexel zu berücksichtigen da diese keinesfalls homogen ist . Besonders deutlich wirds bei flachen Winkeln. Um dem ganzen nun entgegen zu wirken benötigst du die "Schrittgröße" die dein Fragment in die Tiefe auf der Shadowmap macht. Daher ist der einzig logische Weg, unter Berücksichtigung der Gründe für Shadowmapping, das man mit Hilfe der Normale (Worldspace) diese "Schrittgröße" durch Hilfe der Ebenengleichung des Fragments bestimmt.
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.