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

Aktuelle Zeit: Mi Jul 16, 2025 21:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Atmosphären-Rendering à la O'Neil
BeitragVerfasst: Di Aug 14, 2012 12:03 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Hallo zusammen,
ich beschäftige mich gerade mit der Implementierung des Atmosphären-Shaders von O'Neil aus GPU Gems 2 http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html. Die Implementierung habe ich hinbekommen und ich sehe auch schon einen Himmel der den Bildern im Artikel sehr nahe kommt. Das Große Problem ist die Performance (30 Frames), da ich mit hoher Wahrscheinlichkeit die falschen Parameter verwende. Und hier suche ich nun Rat, da im Artikel keinerlei Werte vorgegeben wurden. Ich Liste einfach mal auf, welche Werte ich setze...

Code:
  1. float Kr = 0.0025f;
  2. float Km = 0.0010f;
  3. float ESun = 20.0f;
  4.  
  5. v3CameraPos = D3DXVECTOR3(0,10.00001f,0);
  6. v3LightDir = D3DXVECTOR3(0,cosf(PI / 180.0f * (15 * fTime)),sinf(PI / 180.0f * 15 * fTime));
  7. v3InvWavelength = D3DXVECTOR3(1 / powf(0.650f, 4.0f),1 / powf(0.570f, 4.0f),1 / powf(0.475f, 4.0f));
  8. fCameraHeight = D3DXVec3Length(&v3CameraPos);;
  9. fCameraHeight2 = D3DXVec3LengthSq(&v3CameraPos);
  10. fInnerRadius = 10.0f;
  11. fInnerRadius2 = fInnerRadius * fInnerRadius;
  12. fKm4PI = Km * 4.0f * PI;
  13. fKmESun = Km * ESun;
  14. fKr4PI = Kr * 4.0f * PI;
  15. fKrESun = Kr * ESun;
  16. fOuterRadius = 10.25f;
  17. fOuterRadius2 = fOuterRadius * fOuterRadius;
  18. fScale = 1.0f / (fOuterRadius - fInnerRadius);
  19. fScaleDepth = 0.25f;
  20. fScaleOverScaleDepth = fScale / fScaleDepth;
  21. g = -0.990f;
  22. g2 = g * g;
  23.  
  24. nSamples = 500; <- Hier liegt der Hund begraben
  25.  


Meine Kugel, in die ich die Atmosphäre rendere, hat einen Radius von 100.25f Einheiten.

Die Werte (außer den Kugelradius) habe ich der Demo-Implementation der GPU-Gems CD entnommen, aber mit denen kommt bei mir nix raus :/. Der Punkt der mir das FPS-Genick bricht sind die 500 Samples im Shader, das ist mir klar. Nur leider sieht es bei einer Anzahl von 4 Samples, wie es die Demo angeht, nach nix aus. Ich vermute ganz stark, dass es ein Zusammenspiel aus, den Inner/Outer/Kugel-Radien und der Kameraposition sein muss.
Ich habe jetzt die Hoffung, dass sich auch mal jemand mit dem Thema beschäftigt hat, und mir vielleicht einen Tipp geben kann, an welcher Stelle es hapern könnte. Ich habe mittlerweile alle Werte durchprobiert :/

PS: Ich benutzt zwar C++ & DX 11 aber das dürfte für mein Problem glaube ich nicht von Interesse sein.

Und hier nochmal was buntes:
Bild
(Mit oben beschriebenen Werten, sollte das Ziel sein, aber mit normaler FPS-Rate)
Bild
(Mit einer Sphere von 10.25f, Problem ist hier: Die Sonne steigt in diesem "Schweif" auf, wird dann winzig klein und geht wieder unter, wie sie aufging)

Update:

Problem ist mittlerweile gelöst (Falls mal jemand vor dem selben steht):
Für die Samples nehme ich jetzt 40 und als Radius der Sphere den Wert 15.25. Das Problem lag wohl an dem Zusammenspiel von Radius und Kameraposition. Für diese nehme ich jetzt (0,0,10.0f + 1.0e-6f). Sonst nutze ich alle Werte wie oben angegeben und das alles bei der 20 fachen Rate wie vorher. :)


Zuletzt geändert von TheQaa am Di Sep 18, 2012 10:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 14, 2012 13:28 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Versuch doch mal einfach die Sonne nur einmal zu berechnen, sie in eine Texture zu speichern und dann nur nochmal zu rendern, wenn sie verändert werden soll.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 14, 2012 19:34 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Wenn du die implementierung aus GPU Gems übernommen hast berechnest du jedes Sample in jedem Frame neu; im Text heißt es die Original-Implementierung nutze Lookup-Tabellen - das sollte (sofern man nicht sonstwie Textur-limitiert ist) den Aufwand der Shader stark verringern. Eine dazu passende Implementierung gibt's auf gamedev (letzter Link), allerdings komplett auf CPU; muss man dann halt in einen Shader quetschen. Und dass das nur mit SM3.0 geht (Texturlookup im Vertexshader) sollte mit deiner GraKa (und mit allem ab Geforce 8 ) nicht wirklich ein problem sein.

_________________
The force, strong it is in OpenGL.


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


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.008s | 16 Queries | GZIP : On ]