Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 20, 2025 09:46

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 13:35 
Offline
DGL Member
Benutzeravatar

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]

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 14:04 
Offline
DGL Member

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.


Dateianhänge:
Problem.jpg [229.11 KiB]
Noch nie heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
wie gesagt du kannst auch einfach mit ObjectIDs arbeiten. Dann wäre es im Shader
Code:
  1.  
  2. shadowTerm = (tex2D(objectID,texcoord) == tex2D(lightObjectID,shadowcoord) && Normal.LightDir > 0.0 ) ? 1.0 : Ambient;
  3.  


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.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 16:03 
Offline
DGL Member
Benutzeravatar

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...

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 18:54 
Offline
DGL Member
Benutzeravatar

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.

Ich habe dann Folgendes gemacht:

Das Tutorial auf fabiensanglard.net benutzt:

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP);

und ich benutze

glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, @SWHITE_FLOAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);

(SWHITE_FLOAT ist nur eine Float 32-bit Color Weiß)

Das schneidet den Schatten ab (siehe unten rechts) aber ist natürlich auch nicht das Gelbe vom Ei.


Dateianhänge:
ShadowTestTorus.png
ShadowTestTorus.png [ 21.1 KiB | 6699-mal betrachtet ]


Zuletzt geändert von Traude am Do Mai 31, 2012 21:36, insgesamt 1-mal geändert.
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 20:56 
Offline
DGL Member
Benutzeravatar

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

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mi Mai 30, 2012 23:12 
Offline
DGL Member
Benutzeravatar

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:
Code:
  1. vec4 shadow = vec4(0.0, 0.0, 0.0, 0.0);
  2. //Schatten hier berechnen
  3. float depth = texture2D(uShadowMap, NormalShadowPos.xy).r;
  4. vec4 border = vec4(0.0, 0.0, 0.0, 0.0);
  5. border.xy = smoothstep(0.0, 0.1, NormalShadowPos.xy);
  6. border.zw = smoothstep(0.0, 0.1, -NormalShadowPos.xy + vec2(1.0, 1.0));
  7. float f = border.x * border.y * border.z * border.w * smoothstep(0.0, 0.1, -depth + 1.0) * smoothstep(0.0, 0.1, depth);
  8. shadow = shadow * f + (1.0 - f);

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Do Mai 31, 2012 11:16 
Offline
DGL Member
Benutzeravatar

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.


Dateianhänge:
ShadowTestKugel.png
ShadowTestKugel.png [ 8.28 KiB | 6736-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Do Mai 31, 2012 11:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich wollt den Fehler bei grad nochma reproduzieren, aber ich bekomm es nicht mehr hin :?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Do Mai 31, 2012 21:23 
Offline
DGL Member
Benutzeravatar

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.
Bild
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.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Shader


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 17 Queries | GZIP : On ]