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

Aktuelle Zeit: Fr Jul 18, 2025 08:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Nov 02, 2011 12:46 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Serv,

ich habe Screen Space Fluid Rendering implementiert basierend auf dem PDF Dokument von dieser Seite: http://www.cgrecord.net/2010/08/screen-space-fluid-rendering-for-games.html
Und ich habe es auch hinbekommen, allerdings ist es bei mir zu dunkel, bzw. wird erst richtig sichtbar wenn ich näher heranzoome.

So mache ich das ganze:

1. Ich erzeuge beim Initialisieren folgende Texturen und binde bis auf eine diese an ein FBO:

GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_FLOAT -> GL_DEPTH_ATTACHMENT (Depth)
GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE -> GL_COLOR_ATTACHMENT0 (Thickness)
GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE -> GL_COLOR_ATTACHMENT1 (Color)
GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE -> GL_COLOR_ATTACHMENT2 (Depth smooth color)
GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE -> GL_COLOR_ATTACHMENT3 (Normal and color)

2. Wenn das fenster vergrössert wird, dann lösch ich die Texturen und erzeuge diese neu mit der neuen Fenster größe und binde diese wie Punkt 1 wieder ans FBO.

3. Ich rendere meine Point Sprites in das erste GL_DEPTH_ATTACHMENT (Depth) ohne Tiefentest, Tiefenmaske und einer Löschfarbe von 0,0,0,0

4. Ich rendere meine Point Sprites in GL_COLOR_ATTACHMENT1 (Color) mit Tiefentest, Tiefenmaske und einer Löschfarbe von 0,0,0,1

5. Ich rendere ein Fullscreen Quad mit der (Depth) Texture an Unit 0 und der (Color) Texture and Unit 1
Darauf läuft dann ein Fragment Shader der genau das macht wie Seite 18 aus dem PDF. Nämlich die Normalvektoren auf basis der Tiefentexture zu berechnen und diese dann für die Beleuchtung zu nutzen. (Simples Diffuses Directional Licht aktuell)

Wenn ich das genau so mache, dann habe ich das Gefühl das es funktioniert, aber irgendwie zu Dunkel ist.

Meine Vermutung ist, das die Tiefentexture die erzeugt wird, zu hell wird, nämlich wenn ich das Bild von Seite 16 vom PDF mit meinem vergleiche, dann ist das von mir fast vollständig weiß und wird erst dunkler wenn ich näher heranzoome.

Habe schon einiges rumprobiert, z.b. wenn ich z.b. zeile 14 im shader PointSprites.fragment von
vec4 spherePosEye = vec4(posEye+N*pointRadius, 1.0);
durch
vec4 spherePosEye = vec4(posEye+N*pointRadius, 50.0);

ändere, dann fange ich an langsam was zu sehen, allerdings stimmt dann schneidet er früher ab,
weil der clipping space falsch berechnet wird.

Oder wenn ich nen Ambient faktor zum Diffusen Faktor dazu packe, dann wirds zwar heller, sieht aber eigentlich unverändert aus.
Das Diffuse Shading ist schlichtweg zu "Leicht" wenn man weit herausgezoomt hat ?

Habe die demo als Binary mit allen Shadern mal hochgeladen, denn ich vermute Stark das es an den Shadern liegt.
Vermutlich habe ich was falsch gemacht oder schlechter als in dem Paper!?

http://xenorate.com/tl_files/somekram/SSFRendering_binary.zip

Zur erklärung:

PointSprites.fragment + vertex sind zum Rendern der Point Sprites über glDrawArrays()
NormalAndShading.fragment + vertex sind zum berechnen der Normalen aus der Tiefentexture, sowie zur Diffusen Belichtung
FinalOutput.fragment + vertex sind zum kombinieren von der finalen texture und der tiefe aus dem Tiefentexture (Damit das ganze in eine Szene integriert werden kann)
BilateralGaussian.fragment + vertex sind für das Smoothing der Tiefentexture verantwortlich und ist standardmässig aus und kann aber mit N ein und ausgeschaltet werden.

Mit der Taste F könnt ihr die einzelnen Frame Buffer stufen durchschauen beginnend bei der Finalen Texture (Normals and Shading).


Vielleicht hat der ein oder andere eine Idee?


Hier sind noch Bilder:

Normals & Shading Far Camera:
Bild

Normals & Shading Near Camera:
Bild

Tiefe Far Camera:
Bild

Tiefe Near Camera:
Bild

Normals Far Camera:
Bild

Normals Near Camera:
Bild


Zuletzt geändert von Finalspace am Mi Nov 02, 2011 20:28, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 12:55 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Zum Thema Depth-Textures hatte ich zuletzt auch ein Thema.
Schau mal hier: viewtopic.php?f=2&t=10113 (vorallem auf Seite 2)

Es ist normal, dass du die Tiefenwerte/Texture erst siehst wenn du nahe ranzoomst! In dem FBO ist das aber genauer gespeichert als wie du es siehst! Was nutzt du denn für Werte bei gluPerspective? Vorallem bei near/far - Frustum?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 12:57 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
AMD hat geschrieben:
Zum Thema Depth-Textures hatte ich zuletzt auch ein Thema.
Schau mal hier: viewtopic.php?f=2&t=10113 (vorallem auf Seite 2)

Es ist normal, dass du die Tiefenwerte/Texture erst siehst wenn du nahe ranzoomst! In dem FBO ist das aber genauer gespeichert als wie du es siehst! Was nutzt du denn für Werte bei gluPerspective? Vorallem bei near/far - Frustum?


Near: 0.1f
Far: 1000.0f


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 13:18 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Wenns um die Depth-Texture geht benutze ich als near Wert 1.0 - kann schon was ausmachen.
Aber auch wenn auf deinem Quad alles weiß ist, ist in der Depth-Texture der Wert trotzdem korrekt Vorhanden!

Ich benutze fürs Shadow Mapping auch ein FBO mit Depth-Textures! Wenn ich die Lichtquelle 100 Meter vom Objekt entferne, dann sehe ich im FBO auch nur eine weiße Texture aber das Shadow Mapping funktioniert trotzdem, heißt also die Daten im FBO sind korrekt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 13:24 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
AMD hat geschrieben:
Wenns um die Depth-Texture geht benutze ich als near Wert 1.0 - kann schon was ausmachen.
Aber auch wenn auf deinem Quad alles weiß ist, ist in der Depth-Texture der Wert trotzdem korrekt Vorhanden!

Ich benutze fürs Shadow Mapping auch ein FBO mit Depth-Textures! Wenn ich die Lichtquelle 100 Meter vom Objekt entferne, dann sehe ich im FBO auch nur eine weiße Texture aber das Shadow Mapping funktioniert trotzdem, heißt also die Daten im FBO sind korrekt.


Erst wenn ich das Near Clipping auf 5.0f stelle, dann klappts, aber dann beginnt mein clipping auch bei 5.0f und schneidet mir mehr als hälfte ab.
Scheint also keine Lösung für mein Problem zu sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 14:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
interessantes paper.... bringt mich doch glatt aufne ziehmlich fatale idee :D

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 17:04 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Wenn man in "NormalAndShading.fragment" die Funktion "uvToEye" durch folgendes ersetzt, sieht das ganze schon besser aus.
Code:
  1. const float FarClip = 1000.0;
  2. const float NearClip = 0.01;
  3.  
  4. vec3 uvToEye(vec2 texCoord,float z)
  5. {
  6.     // convert texture coordinate to homogeneous space
  7.     vec2 xyPos = (texCoord*2.0 -1.0);
  8.  
  9.     float a = FarClip/(FarClip-NearClip);
  10.     float b = FarClip*NearClip/(NearClip-FarClip);
  11.     float rd=b/(z-a);
  12.     return vec3(xyPos,-1.0)*rd;
  13. }
  14.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Screen Space Fluid Rendering
BeitragVerfasst: Mi Nov 02, 2011 20:28 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Schläfer hat geschrieben:
Wenn man in "NormalAndShading.fragment" die Funktion "uvToEye" durch folgendes ersetzt, sieht das ganze schon besser aus.
Code:
  1. const float FarClip = 1000.0;
  2. const float NearClip = 0.01;
  3.  
  4. vec3 uvToEye(vec2 texCoord,float z)
  5. {
  6.     // convert texture coordinate to homogeneous space
  7.     vec2 xyPos = (texCoord*2.0 -1.0);
  8.  
  9.     float a = FarClip/(FarClip-NearClip);
  10.     float b = FarClip*NearClip/(NearClip-FarClip);
  11.     float rd=b/(z-a);
  12.     return vec3(xyPos,-1.0)*rd;
  13. }
  14.  


Vielen Herzlichen Dank, das ist des Rätsels lösung =)
Jetzt stimmen auch die Normals.


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 17 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.008s | 16 Queries | GZIP : On ]