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

Aktuelle Zeit: Fr Jul 18, 2025 07:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Shadow Mapping Artefakte
BeitragVerfasst: So Mär 29, 2009 16:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Hallo an alle - ich meld mich auch mal wieder :-)

Nach einer viel zu langen OpenGL-freien Zeit hab ich mich mal wieder hingesetzt und ein wenig mit OGL rumgespielt. Aktuell beschäftigen mich gerade Schattentechniken.

So, nachdem ich es nun endlich geschafft habe, meinen ersten Real-Time-Shadow zu erstellen, kommt auch gleich die Ernüchterung: es wimmelt nur so von Artefakten :-(. Jetzt ist die Frage, wie ich das am besten in den Griff bekomme.

Hier ist mal der grobe Pseudo-Render-Pfad, den ich benutzen:
Code:
  1.  
  2.   - Erstelle Mesh-Daten in mehren VBOs, sortiert nach Material
  3.   - Erstelle ein Licht
  4.  
  5. while Rendern do
  6. begin
  7.   für jedes Licht:
  8.       ErstelleTiefentextur
  9.  
  10.   Clear;
  11.   glLoadMatrix(Betrachter);
  12.   Tiefentexture binden;
  13.   ZeichneSzene();
  14. end;
  15.  
  16. method ErstelleTiefentextur()
  17. begin
  18.   glLoadMatrix(LichtMatrix);
  19.   glColorMask(FALSE, FALSE, FALSE, FALSE);
  20.  
  21.   ZeicheSzene();
  22.   Tiefenbuffer in Textur speichern;  
  23.   glColorMask(TRUE, TRUE, TRUE, TRUE);
  24. end;
  25.  
  26. method ZeichneSzene()
  27. begin
  28.   für jeden VBO
  29.   begin
  30.     if not Tiefenpass then
  31.        VBO.Material.Bind;
  32.     VBO.Bind;
  33.     VBO.Render;
  34.     VBO.Unbind;  
  35.     if not Tiefenpass then
  36.       VBO.Material.Unbind;
  37.   end;
  38. end;


Folgende Einstellungen benutze ich für die Tiefentextur (Pseudo-Code)
Code:
  1.  
  2.   DepthTexture.CreateTexture(DepthWidth, DepthHeight, GL_DEPTH_COMPONENT);
  3.   DepthTexture.TexGenMode([coordS, coordT, coordR, coordQ]) := GL_EYE_LINEAR;
  4.   DepthTexture.WrapMode([coordS, coordT]) := GL_CLAMP_TO_EDGE;
  5.  
  6.   glTexGenfv(GL_S, GL_EYE_PLANE, Vector(1, 0, 0, 0));
  7.   glTexGenfv(GL_T, GL_EYE_PLANE, Vector(0, 1, 0, 0));
  8.   glTexGenfv(GL_R, GL_EYE_PLANE, Vector(0, 0, 1, 0));
  9.   glTexGenfv(GL_Q, GL_EYE_PLANE, Vector(0, 0, 0, 1));
  10.  
  11.   glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
  12.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
  13.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LESS);
  14.  


Und das ist der eigendliche Tiefenpass
Code:
  1.  
  2.   glViewPort(0, 0, DepthWidth, DepthHeight);
  3.   glMatrixMode(GL_PROJECTION);
  4.     glPushMatrix;
  5.     glLoadIdentity;
  6.     // Beim FOV hab ich schon sehr viel ausprobiert - ohne erfolg
  7.     gluPerspective(45, 800/600, 0.1, 128);
  8.   glMatrixMode(GL_MODELVIEW);
  9.  
  10.   try
  11.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  12.     glLoadIdentity;
  13.  
  14.     glPolygonOffset(1, 4);
  15.     glEnable(GL_POLYGON_OFFSET_FILL);
  16.     glEnable(GL_CULL_FACE);
  17.     glMultMatrixf(@ViewMatrix);
  18.  
  19.     RenderScene();
  20.  
  21.     FDepthTexture.CopyTo();
  22.  
  23.     glEnable(GL_CULL_FACE);
  24.     glDisable(GL_POLYGON_OFFSET_FILL);
  25.  
  26.   finally
  27.     glMatrixMode(GL_PROJECTION);
  28.       glPopMatrix;
  29.     glMatrixMode(GL_MODELVIEW);
  30.     glViewPort(0,0, RenderInfo.ViewPortX, RenderInfo.ViewPortY);
  31.   end;
  32.  


So, nun zu den Artefakten:
Der Schatten wird bei den meisten Flächen korrekt draufprojeziert. Wenn die Fläche aber fast parallel zu den Lichtstrahlen ist, entstehen sehr viele Artefakte (siehe Anhang). Das kann man gut am oberen Balken und an fast allen Flächen erkennen.

Jetzt ist die Frage: wie bekomm ich das weg? Mit Shadern (nicht bevorzugt), oder durch andere Einstellungen?
Grüße


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 29, 2009 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich verweise einfach mal auf meine Ausarbeitung die ich vor ein paar Jahren über Schatten geschrieben habe. Dir fehlt so ein Epsilon wie in Abschnitt 2.1.2 ("Verbesserungen") beschrieben.

http://www-users.rwth-aachen.de/martin. ... 8_1350.pdf

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 29, 2009 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Danke erstmal für die Antwort. Das mit dem Epsilon hab ich verstanden, jedoch scheiterts an der Umsetzung: wie soll ich das Epsilon einbauen? Bekomm ich das mit der Fixed-Function-Pipeline hin?

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 29, 2009 22:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wahrscheinlich nicht.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 29, 2009 22:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Dann werd ich mal nen shader einbauen und nochmal mein Glück versuchen. Werd mich nochmal melden, sobald es was neues gibt.

Danke für die Antwort :-)

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 30, 2009 15:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
http://www.google.de/url?sa=t&source=web&ct=res&cd=1&url=http%3A%2F%2Fati.amd.com%2Fdeveloper%2Fgdc%2F2006%2FIsidoro-ShadowMapping.pdf&ei=NdHQScftJ4LH-Aa6zJm9Ag&usg=AFQjCNF5WXKkDnyKuH_cGj64MsXUjiMJeg&sig2=5TfobJ9BPYn3K4SXxo5BlA
Bei Seite 32 beginnt die Thematik und Lösungen wegen epsilon oder auch Bias genannt.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 01, 2009 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
So, ich habs nun geschafft - ich hab das Rendern jetzt anders gelöst. Ich setzte jetzt beim Tiefenpass glCullFace auf GL_FRONT. Das Problem ist dann nur, dass die Objekte, die nicht in Richtung Lichtquelle zeigen, sich nicht selbst schattieren. Das hab ich aber durch das Einbauen von Lighting wieder behoben.

Da ich jetzt noch Shader benutze, hab ich gleich noch Soft-Shadows und Blooming eingebaut. Anbei noch zwei Screenshots. Das Soft-Shadow-Rendering hab ich nur mal eben eingebaut, daher ist die Qualität noch nicht perfekt, aber ich werd noch drann arbeiten.

Aber danke nochmal für eure Antworten

Grüße


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 01, 2009 19:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
schick schick

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 06, 2009 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
So, ich hab noch ein kleines Status-Update - will ja meine Erfahrungen mit euch teilen:

Ich hab jetzt eine Shader Library in mein Framework eingebaut. Somit hab ich jetzt für jedes Material den passenden Shader und im Shader hab ich fast keine if-Abragen mehr. Ne ShaderLib ist zwar etwas komplexer zu handeln, im endefekt ist es jedoch sinnvoller.

Die Shader werden in einem Baum gespeichert. Durch den aktuellen RenderPass, den Anzahl von aktiven Lichtern und anhand des gebundenen Materials kommt man dann beim Rendern an den richtigen Shader. Somit kann ich z.B. ein Material mit einem Bump-Mapping-Shader ausstatten während ein anderes Material (was z.B. keine Texturen hat), nen einfacheren Shader bekommt.

Dass das ganze funktioniert, kann man gut sehen: das vordere Gitter hat einen anderen Depth-Pass-Shader als die restlichen Materials. Zudem haben die texturierten noch einen anderen Final-Shader als die untexturierten Materials. Mit mehreren Lichtern hab ich noch nicht rumgespielt, wird aber als nächstes kommen.

Im Moment ist das ganze noch nicht ganz optimal gelöst: die einzelnen Shader für jedes Material sind einzeln in jedem File. Somit sind viele Shader-Teile mehrfach vorhanden. Das werd ich später ändern - so dass die einzelnen Shader procedural aus einem Mega-Shader zusammengesetzt werden. Wie genau ich das mit dem "Mega-Shader" lösen werde, weiß ich noch nicht.

Grüße
Dave

PS: mal schauen, wann ich mal wieder nen Groß-Projekt starte - konkrete Ideen hab ich schon zu Papier gebracht ;-)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.009s | 15 Queries | GZIP : On ]