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: float Kr = 0.0025f; float Km = 0.0010f; float ESun = 20.0f; v3CameraPos = D3DXVECTOR3(0,10.00001f,0); v3LightDir = D3DXVECTOR3(0,cosf(PI / 180.0f * (15 * fTime)),sinf(PI / 180.0f * 15 * fTime)); v3InvWavelength = D3DXVECTOR3(1 / powf(0.650f, 4.0f),1 / powf(0.570f, 4.0f),1 / powf(0.475f, 4.0f)); fCameraHeight = D3DXVec3Length(&v3CameraPos);; fCameraHeight2 = D3DXVec3LengthSq(&v3CameraPos); fInnerRadius = 10.0f; fInnerRadius2 = fInnerRadius * fInnerRadius; fKm4PI = Km * 4.0f * PI; fKmESun = Km * ESun; fKr4PI = Kr * 4.0f * PI; fKrESun = Kr * ESun; fOuterRadius = 10.25f; fOuterRadius2 = fOuterRadius * fOuterRadius; fScale = 1.0f / (fOuterRadius - fInnerRadius); fScaleDepth = 0.25f; fScaleOverScaleDepth = fScale / fScaleDepth; g = -0.990f; g2 = g * g; nSamples = 500; <- Hier liegt der Hund begraben
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:
 (Mit oben beschriebenen Werten, sollte das Ziel sein, aber mit normaler FPS-Rate)
 (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.
|