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

Aktuelle Zeit: So Jul 20, 2025 14:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: ShadowMapping
BeitragVerfasst: Fr Mai 18, 2012 13:29 
Offline
DGL Member
Benutzeravatar

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

ich bin's schon wieder^^ Ich hab mich gestern an ShadowMapping probiert und es funktioniert auch fast. Ich hab seltsame Fragmente auf meinen Objekten. Siehe Bild (oben links erkennt man den Farb- und Depthbuffer aus der Sicht des Lichts).
Ich hab mich dabei an diesem Tutorial orientiert. So sieht das Ganze aus:
Code:
  1. - Szene aus sicht der Lichtquelle Rendern (€: nur Backfaces werden gezeichnet)
  2. - DepthBuffer in Textur speichern
  3. - Bias * ProjektionsMatrix * ModelviewMatrix in TexturMatrix7 speichern
  4. - Szene mit folgendem Schader zeichnen
  5.  
  6. //VERTEX
  7. varying vec4 ShadowCoord;
  8. void main()
  9. {
  10.     ShadowCoord = gl_TextureMatrix[7] * gl_Vertex;
  11.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  12.     gl_FrontColor = gl_Color;
  13.     gl_TexCoord[0]  = gl_MultiTexCoord0 * gl_TextureMatrix[0];    
  14. }
  15.  
  16. //FRAGMENT
  17. uniform sampler2D ShadowMap;
  18. uniform sampler2D ColorMap;
  19. varying vec4 ShadowCoord;
  20. void main()
  21. {
  22.     vec4 shadowCoordinateWdivide = ShadowCoord / ShadowCoord.w ;
  23.     shadowCoordinateWdivide.z -= 0.001;
  24.     float distanceFromLight = texture2D(ShadowMap, shadowCoordinateWdivide.xy).r;
  25.     float shadow = 1.0;
  26.     if (ShadowCoord.w > 0.0)
  27.         shadow = distanceFromLight < shadowCoordinateWdivide.z ? 0.1 : 1.0 ;
  28.     vec4 color = texture2D(ColorMap, gl_TexCoord[0].xy);
  29.     if (length(color) == 0)
  30.         color = vec4(1.0, 1.0, 1.0, 1.0);      
  31.     gl_FragColor = shadow * color;
  32. }

Um dem zFighting und der Selbstschattierung entgegen zu wirken wird in Zeile 23 ein kleines Offset auf den z-Wert addiert. Trotzdem hab ich auf der unteren Hälfte meines Würfels einen Schatten. Kann sich das jmd erklären?

MfG & Thx Bergmann.

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


Zuletzt geändert von Bergmann89 am Fr Mai 18, 2012 17:27, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Fr Mai 18, 2012 16:41 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
In gewisser Weise liegt der Teil doch auch im Schatten. Wenn ich das richtig sehe, ist das die dem Licht abgewandte Seite. Wenn du die normale Beleuchtung noch mit machst dürfte man von dem Schatten da nichts mehr merken. Problematisch ist es erst wenn die dem Licht zugewandte Seite fälschlich schattiert wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Fr Mai 18, 2012 16:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ähm, warum versuchst du der Selbstschattierung entgegen zu wirken? Die ist doch physikalisch korrekt? Du darfst da nur ein ganz klein wenig drauf addieren um sicherzustellen das zum Licht gewandte Objekte auch wirklich hell sind. Wenn du damit versuchst Selbstschattierung zu verhindern braucht es nur ein Objekt das dicker ist als dein Wert und schon hast du wieder Schatten, also wie in deinem Fall.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Fr Mai 18, 2012 17:27 
Offline
DGL Member
Benutzeravatar

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

ich will der Selbstschattierung nich komplett entgegen wirken, ich will nur nicht, das ein Face sich selbst schattiert, denn das erledigt dann sowieso der PerPixelLight-Shader (und der kann das besser, finde ich). Ich hab oben vergessen zu erwähnen, das ich beim Rendern aus der Sicht der Kamera nur Backfaces zeichne. Und dann sollte das auch mit dem Offset und der Selbstschattierung bei komplexeren Objekte funktionieren (siehe Bild). Das Backface (1) soll nicht schattiert werden (dazu das Ofsset von -0.001). Das Frontface (2) wird schattiert, weil das Backface (1) vor ihm im DepthBuffer liegt. Sollte doch eigentlich funktionieren, oder hab ich n Denkfehler drin?

MfG Bergmann.


Dateianhänge:
licht.png
licht.png [ 7.22 KiB | 11803-mal betrachtet ]

_________________
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: Fr Mai 18, 2012 23:06 
Offline
DGL Member
Benutzeravatar

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

ich hab den Fehler gefunden. Da ist beim glTranslate von der Bodenplatte was schief gelaufen. Leider hab ich immer noch viele Fragmente, wenn die Lichtstrahlen fast parallel zum Face sind. Ich hab mal bisl im Forum gesucht und diese Beitrag gefunden. LittleDave hatte genau das gleiche Problem wie ich gerade und er hat genau die Lösung die ich auch haben will. Nur leider sind die ganzen Links in dem Thread tot.
@Coolcat: Hast du die Ausarbeitung über die du da gesprochen hast vlt noch irgendwo rumliegen? Wenn ja, könntest du die mir mal irgendwie zukommen lassen? Wenn nicht werd ich LittleDave wohl mal ne Mail schreiben...

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: Sa Mai 19, 2012 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Das Frontface (2) wird schattiert, weil das Backface (1) vor ihm im DepthBuffer liegt. Sollte doch eigentlich funktionieren, oder hab ich n Denkfehler drin?

Ich denke dir ist nicht ganz klar was der Offset bewirkt. Zeichne dir doch mal den Offset in dein Bild ein. Alle Frontfaces werden um 0.001 vom Licht wegbewegt. Du wirst nie ein Offset finden das beliebige Backfaces vom Schatten ausschließt! Shadow-Mapping funktioniert pro Texel in der Shadow-Map, nicht pro Face.

Zitat:
@Coolcat: Hast du die Ausarbeitung über die du da gesprochen hast vlt noch irgendwo rumliegen?

Gerade hier aufm Laptop nicht, nein. Aber auf meinem Hauptrechner müsste es noch irgendwo liegen. Bitte schreib mir ne PM, falls ich heute Abend nicht dran denke.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Sa Mai 19, 2012 17:39 
Offline
DGL Member
Benutzeravatar

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

Coolcat hat geschrieben:
Ich denke dir ist nicht ganz klar was der Offset bewirkt. Zeichne dir doch mal den Offset in dein Bild ein. Alle Frontfaces werden um 0.001 vom Licht wegbewegt. Du wirst nie ein Offset finden das beliebige Backfaces vom Schatten ausschließt! Shadow-Mapping funktioniert pro Texel in der Shadow-Map, nicht pro Face.
Es geht nicht um die Frontfaces. Im DepthBuffer liegen die z-Werte der Backfaces. Bei den Frontfaces könnte ich das Offset auch weg lassen und es würde trotzdem so aussehen wie vorher. Das Offset brauch ich nur bei den Backfaces, das diese nicht schattiert werden. Kann sein das ich da einen komischen Ansatz verfolge, aber ich denke das Ergebnis wird gut sein. Der besste Beweis dafür ist Gael, denn LittleDave hat genau den gleichen Ansatz verfolgt.

Coolcat hat geschrieben:
Gerade hier aufm Laptop nicht, nein. Aber auf meinem Hauptrechner müsste es noch irgendwo liegen. Bitte schreib mir ne PM, falls ich heute Abend nicht dran denke.
Super, Danke schonma :)

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: Sa Mai 19, 2012 18:59 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Bergmann89 hat geschrieben:
Das Offset brauch ich nur bei den Backfaces, das diese nicht schattiert werden. Kann sein das ich da einen komischen Ansatz verfolge, aber ich denke das Ergebnis wird gut sein. Der besste Beweis dafür ist Gael, denn LittleDave hat genau den gleichen Ansatz verfolgt.

Das ist allerdings ein komischer Ansatz. Eigentlich liegen die dem Licht abgewandten Teile eines Objektes immer im Schatten, auch in der Realität, da sie von den Atomen auf der anderen Seite verdeckt werden. Und in der Computergrafik spielt es keine Rolle, da abgewandte Flächen und Flächen im (Kern-)Schatten beide kein Licht empfangen.
Die Variante mit den Backfaces im Tiefenbuffer, verhindert recht zuverlässig selbsschattierung auf den Vorderseiten, allerdings kann es auch wieder Probleme mit fehlenden Schatten direkt hinter dem Objekt geben.

Das Problem bei dem Beitrag von LittleDave, den du verlinkt hast, liegt an den Texeln der Shadowmap. Da ein Texel für mehrere Pixel verwendet wird gibt es Artefakte. Genau wie bei den Selbstschattierungen wo keine sein sollten. Ich hab das mal versucht in einem Bild zu skizzieren.
Die grauen und weißen Quadrate sind die Texel der Shadowmap und die rot-grüne Linie wären die Pixel der Oberfläche (ich hoffe du hast keine Rot-Grün-Sehschwäche). Die Blickrichtung ist aus Sicht der Lichtquelle.
In der Praxis ist dieses Problem aber trotzdem irrelevant, da parallele Seiten auch kaum/kein Licht abbekommen, wodurch die Streifen nicht sichtbar sind.


Dateianhänge:
shadow.png
shadow.png [ 2.22 KiB | 11758-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Sa Mai 19, 2012 19:42 
Offline
DGL Member
Benutzeravatar

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

Danke für das Bild (hab keine Rot-Grün-Schwäche). Aber die Frage war nicht warum da Fragmente entstehen, dass da beim Interpolieren der Textur hier und da fehlerhafte Werte auftreten ist klar, die Frage war wie ich dem entgegenwirke. Auch wenn die Seiten mit den Fragmenten kaum belichtet sind, sieht es trotzdem unschön aus. Und da ich weiß das es eine Lösung gibts, würd ich das auch gern so machen.

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: Mo Mai 28, 2012 15:49 
Offline
DGL Member
Benutzeravatar

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

ich hab's einigermaßen so hin bekommen, wie ich das haben will. Resultate könnt ihr in ein paar Tagen begutachten^^
Jetzt hab ich aber noch ein kleines Problem, bei dem ich auch nicht recht weiter weiß. Es hat zwar nix mit Shadern zu tun, aber ich halte es für unnötig dafür jetzt nochma n extra Topic aufzumachen. Und zwar speicher ich ja die ModelviewProjection-Matrix des Lichts in der Textur-Matrix 7 zwischen, um diese dann im Shader für die Berechnungen zu benutzen. Wenn ich jetzt eine normale Matrixtransformation ausfüren will (zB ein Translate) dann muss ich diese auf die normale Modelview-Matrix und auf die Textur-Matrix 7 anwenden. Seltsamerweiße muss ich aber immer genau die hälfte der gewünschten Werte in der Textur-Matrix benutzen. Ich denke das liegt an dem bias, ich hab aber noch keine andere Möglichkeit gefunden, das zu realisieren.
Code:
  1. //Matrix des Lichts speichern
  2. mBias[maAxisX] := gluVector4f(0.5, 0.0, 0.0, 0.0);
  3. mBias[maAxisY] := gluVector4f(0.0, 0.5, 0.0, 0.0);
  4. mBias[maAxisZ] := gluVector4f(0.0, 0.0, 0.5, 0.0);
  5. mBias[maPos]   := gluVector4f(0.5, 0.5, 0.5, 1.0);
  6.  
  7. glGetFloatv(GL_MODELVIEW_MATRIX, @mMod[0,0]);
  8. glGetFloatv(GL_PROJECTION_MATRIX, @mPro[0,0]);
  9.  
  10. glMatrixMode(GL_TEXTURE);
  11. glActiveTexture(aTextureUnit);
  12. glLoadIdentity;
  13. glLoadMatrixf(@mBias[0,0]);
  14. glMultMatrixf(@mPro[0,0]);
  15. glMultMatrixf(@mMod[0,0]);
  16. glActiveTexture(GL_TEXTURE0);
  17. glMatrixMode(GL_MODELVIEW);
  18.  
  19. //Transformation
  20. glMatrixMode(GL_MODELVIEW);
  21. glTranslatef(0, -1.1, 0);
  22.  
  23. glMatrixMode(GL_TEXTURE);
  24. glActiveTexture(GL_TEXTURE7);
  25. glTranslatef(0, -0.55, 0);
  26. glActiveTexture(GL_TEXTURE0);
  27. glMatrixMode(GL_MODELVIEW);


€: Ich hab gerade festgestellt, das der Fehler nur bei der Plane auftritt, auf dem die Objekte stehen, alle anderen Objekte kann ich normal transformieren...

MfG & Thx 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: Mo Mai 28, 2012 16:28 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Und was ist jetzt genau die Frage?

Also es liegt schon an der Bias-Matrix.
Im Shader willst du ja die Koordinaten von [0-1] haben, deshalb nimmst du eben die Bias-Matrix, da es sonst [-1-1] wäre.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ShadowMapping
BeitragVerfasst: Mo Mai 28, 2012 17:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Die Frage ist: Wo ist der Fehler?
Ich kann mit das nicht erklären. Ich hab jetzt 2 Funktionen gemacht:
Code:
  1.   procedure BeginTranslate(x, y, z: Single);
  2.   begin
  3.     glPushMatrix;
  4.     glTranslatef(x, y, z);
  5.  
  6.     glMatrixMode(GL_TEXTURE);
  7.     glActiveTexture(GL_TEXTURE7);
  8.     glPushMatrix;
  9.     glTranslatef(x, y, z);
  10.     glActiveTexture(GL_TEXTURE0);
  11.     glMatrixMode(GL_MODELVIEW);
  12.   end;
  13.  
  14.   procedure EndTranslate;
  15.   begin
  16.     glPopMatrix;
  17.     glMatrixMode(GL_TEXTURE);
  18.     glActiveTexture(GL_TEXTURE7);
  19.     glPopMatrix;
  20.     glActiveTexture(GL_TEXTURE0);
  21.     glMatrixMode(GL_MODELVIEW);
  22.   end;
Die funktionieren bei allen Test-Objekten ohne Probleme, nur wenn ich meine Plane auf der die Objekte "stehen" um 1 Einheiten nach unten verschieben will, dann wird der Schatten auf der Plane nicht richtig berechnet. Wenn ich die Plane in der Textur-Matrix nur um -0.5 auf der y-Achse verschiebe (die Modelview-Matrix verschiebe ich normal um -1 Einheiten), dann ist der Schatten korrekt?!

_________________
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 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Besteht das Problem noch?

Und wenn ja, könntest Du ein Bild posten? Ich experimentiere auch grade damit herum. Bei mir löst das Herumschieben auch einen Fehler aus.
Traude


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

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nun ja bei Shadowmapping mit Tiefenwerten hast du eigentlich immer Probleme bedingt durch die unterschiedliche Auflösung der Tiefenwerte. Dadurch entsteht halt entweder z-fighting oder ein Offset wie im Bild unten. Du kannst diese Probleme zwar reduzieren, z.B. durch einen möglichst kleinen Abstand von Near und Far Plane in der Projektion, wirst sie aber nie ganz los.

Umgehen könntest du das Problem wenn du z.B. Objekt-IDs statt Tiefenwerte nimmst (verlierst dadurch allerdings die Selbstschattierung!!!).

Bild

_________________
Meine Homepage


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

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
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.
@Traude: Ich hab's leider nicht wirklich lösen können. Ich hab dann einfach die Translation vor der Ebene entfernt, und die Ebene gleich beim übergeben der Vertecs um eine Einheit nach unten verschoben. Ich hoffe, das der Fehler nicht noch irgendwo anders auftritt.

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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast


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.013s | 19 Queries | GZIP : On ]