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

Aktuelle Zeit: Do Jul 03, 2025 09:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Variance Shadow Mapping
BeitragVerfasst: Mi Jul 13, 2011 17:40 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Mit Varaince Shadow Mapping lassen sich ja weiche Schatten darstellen. Nur mit zunehmender Distanz zwischen Objekt und Lichtquelle wird der Schatten immer undeutlicher und verschwindet schließlich ganz. Ich hab auch schon versucht, das mit einer 16- und 32-Bit floating point Textur zu lösen und viel mit den Werten im Shader rumgespielt, macht aber leider keinen Unterschied. Ich hab jetzt den 2 Variablen 'depth' und 'moment2' je 2x8Bit Kanäle zugewiesen, für höhere Präzision, bringt leider auch nichts...

NearPlane: 20.0 FarPlane: 500.0

Shader, der die Shadow - Map erstellt:
Code:
  1.     uniform sampler2D Texture0;
  2.     varying vec4 vVertex;
  3.     const vec2 bitShift2 = vec2(256.0, 1.0);
  4.     const vec2 bitMask2  = vec2(0.0, 1.0/256.0);
  5.  
  6.     void main() {
  7.         float depth = vVertex.z / vVertex.w;
  8.              depth = depth * 0.5 + 0.5;
  9.  
  10.             vec2 depthPack = fract(depth * bitShift2);
  11.             depthPack -= depthPack.xxy*bitMask2;
  12.  
  13.         float dx = dFdx(depth);
  14.         float dy = dFdy(depth);
  15.         float moment2 = depth*depth;
  16.         moment2 += 0.25*(dx*dx+dy*dy);
  17.  
  18.             vec2 momentPack = fract(moment2 * bitShift2);
  19.             momentPack -= momentPack.xxy*bitMask2;
  20.  
  21.         gl_FragColor = vec4(depthPack, momentPack);
  22.     }


Shader, der entscheidet, ob der Pixel im Schatten liegt oder nicht:
Code:
  1.     uniform sampler2D Texture0;
  2.     uniform sampler2D Texture1;
  3.     varying vec4 ShadowCoord;
  4.     uniform float fDarkening;
  5.     const vec2 bitUnshift2 = vec2(1.0/256.0, 1.0);
  6.  
  7.     void main() {
  8.         vec4 shadowCoordinateWdivide = ShadowCoord / ShadowCoord.w;
  9.         shadowCoordinateWdivide.z -= 0.005;
  10.  
  11.         vec4 shadowMap = texture2D(Texture1, shadowCoordinateWdivide.xy);
  12.         vec2 moments;
  13.         moments.x = dot(shadowMap.xy, bitUnshift2);
  14.         moments.y = dot(shadowMap.zw, bitUnshift2);
  15.  
  16.         float variance = moments.y - (moments.x*moments.x);
  17.         variance = max(variance, 0.00002);
  18.         float d = shadowCoordinateWdivide.z - moments.x;
  19.  
  20.         variance = variance / (variance + d*d);
  21.         float shadow = (shadowCoordinateWdivide.z <= moments.x) ? 1.0 : (variance + fDarkening);
  22.  
  23.         gl_FragColor.x = (ShadowCoord.w > 0.0 && shadowCoordinateWdivide.x >= 0.0 && shadowCoordinateWdivide.x <= 1.0 && shadowCoordinateWdivide.y >= 0.0 && shadowCoordinateWdivide.y <= 1.0) ? shadow : 1.0;
  24.     }


Hier ein Video, dass das ganze in der Praxis zeigt:
http://www.youtube.com/watch?v=Zs69MSCU0qE&feature=channel_video_title

Wie man sieht wird der Schatten auch immer glatter an den Rändern, also alles andere als weich.
Weiß jemand woran das liegt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variance Shadow Mapping
BeitragVerfasst: Do Jul 14, 2011 23:36 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Verwendest du für die Tiefe lineare Werte? Wenn nicht, kann das auf größere Distanz ziemlich ungenau werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variance Shadow Mapping
BeitragVerfasst: Fr Jul 15, 2011 12:56 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Danke für den Tipp, hab die Tiefe jetzt anders gespeichert (depth*depth) und das Ergebnis sieht etwas besser aus. Mit einer 32 Bit Textur sieht das ganze super aus, mit 16 Bit aber nicht... 16 Bit sollten doch eigentlich auch ausreichen, oder? Nicht jede Grafikkarte unterstützt ja 32 Bit Texturen und trotzdem gibt es Spiele die auf älterer Hardware bessere Schatten erzeugen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variance Shadow Mapping
BeitragVerfasst: Fr Jul 15, 2011 17:28 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich glaube nicht das 16Bit ausreichen. Das sind immerhin nur 65536 verschiedene Werte. Und bei "depth*depth" könnten dann nur 256 verschiedene Werte gespeichert werden. Das liegt an dem Quadrieren, das aber nötig ist, damit man dann auch sinnvoll linear Filtern kann.

Wenn du keine Floating-Point-Texturen verwenden willst geht es vllt indem du ein FBO und 2 Texturen verwendest. Da man da zwangsweise eine Textur für die Tiefe braucht kann man die auch gleich verwenden. Eine GL_DEPTH_COMPONENT32 Textur hat auch die 32 Bit und ist ansonsten nicht außergewöhnlich. Für die Farbtextur des FBOs kannst du dann ein Format nehmen was 16Bit hat oder irgendwas anderes (eine Tiefentextur geht hier glaub ich nicht).
Als "gl_FragColor" schreibst du dann im Shader die einfache Tiefe und in "gl_FragDepth" kommt dann die Quadrierte.
Der Nachteil ist natürlich, dass man 2 Texturlookups aus den 2 Texturen braucht, wenn man dann den Schatten zeichnet.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.007s | 16 Queries | GZIP : On ]