Ich bin dabei, die atmosphärische Streuung eines Planeten aus dem Weltraum zu implementieren. Ich habe Sean O'Neils Shader von http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html als Ausgangspunkt verwendet.
Ich habe so ziemlich das gleiche Problem mit fCameraAngle, außer mit SkyFromSpace-Shader im Gegensatz zu GroundFromSpace-Shader wie hier: http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/
Ich bekomme seltsame Artefakte mit Sky vom Space Shader, wenn ich sie nicht fCameraAngle = 1
in der inneren Schleife benutze . Was ist die Ursache für diese Artefakte? Die Artefakte verschwinden, wenn fCameraAngle auf 1 begrenzt ist. Mir scheint auch der Farbton zu fehlen, der in O'Neils Sandbox vorhanden ist ( http://sponeil.net/downloads.htm ).
Kameraposition X = 0, Y = 0, Z = 500. GroundFromSpace links, SkyFromSpace rechts.
Kameraposition X = 500, Y = 500, Z = 500. GroundFromSpace links, SkyFromSpace rechts.
Ich habe festgestellt, dass der Kamerawinkel je nach Quelle sehr unterschiedlich zu sein scheint:
In den ursprünglichen Shadern wird der Kamerawinkel in SkyFromSpaceShader wie folgt berechnet:
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
Während im Boden vom Space Shader der Kamerawinkel wie folgt berechnet wird:
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
Allerdings basteln verschiedene Quellen online am Negieren des Strahls. Warum ist das?
Hier ist ein C # Windows.Forms-Projekt, das das Problem veranschaulicht und mit dem ich die Bilder erstellt habe: https://github.com/ollipekka/AtmosphericScatteringTest/
Update: Ich habe aus dem ScatterCPU-Projekt auf O'Neils Site herausgefunden, dass der Kamerastrahl negiert wird, wenn sich die Kamera über dem zu schattierenden Punkt befindet, sodass die Streuung von Punkt zu Kamera berechnet wird.
Durch Ändern der Strahlrichtung werden zwar Artefakte entfernt, es treten jedoch andere Probleme auf, wie hier dargestellt:
Darüber hinaus schützt O'Neil im ScatterCPU-Projekt vor Situationen, in denen die optische Tiefe des Lichts unter Null liegt:
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
Wie in den Kommentaren erwähnt, bleibt neben diesen neuen Artefakten die Frage, was mit den Bildern, bei denen die Kamera auf 500, 500, 500 positioniert ist, nicht stimmt. Es fühlt sich an, als ob der Heiligenschein auf einen völlig falschen Teil des Planeten fokussiert ist. Man würde erwarten, dass das Licht näher an der Stelle ist, an der die Sonne auf den Planeten treffen sollte, als dort, wo es sich von Tag zu Nacht ändert.
Das Github-Projekt wurde aktualisiert, um Änderungen in diesem Update widerzuspiegeln.