DGL
https://delphigl.com/forum/

Atmosphären-Rendering à la O'Neil
https://delphigl.com/forum/viewtopic.php?f=20&t=10554
Seite 1 von 1

Autor:  TheQaa [ Di Aug 14, 2012 12:03 ]
Betreff des Beitrags:  Atmosphären-Rendering à la O'Neil

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. :)

Autor:  end [ Di Aug 14, 2012 13:28 ]
Betreff des Beitrags:  Re: Atmosphären-Rendering à la O'Neil

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.

Autor:  breakdancingYoda [ Di Aug 14, 2012 19:34 ]
Betreff des Beitrags:  Re: Atmosphären-Rendering à la O'Neil

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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/