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.
quelle
Antworten:
Ich habe momentan keinen Arbeitscode, da ich meinen Motor umstelle, aber dies waren meine Arbeitsparametereinstellungen:
Das war der Shader:
Lassen Sie mich wissen, ob es noch funktioniert. Wenn Sie weitere Hilfe benötigen, versuche ich, meinen Code zu durchsuchen. Ich glaube, ich habe für das Rendern zwei Kugeln verwendet: eine für die Oberfläche und eine für die Atmosphäre.
quelle
einige gedankenspuren: überprüfe die präzision deiner schwimmer. Bei Weltraumskalen reicht float32 meist nicht aus. Überprüfen Sie dpeth buffer, wenn Sie primitives Rendering haben, wie eine Kugel unter Ihrem Scattering-Shader.
Diese Artefakte können auch im Raytracing gefunden werden. Dabei handelt es sich normalerweise um Sekundärstrahlen, die sich mit dem primären Oberflächenjitter aufgrund von Problemen mit der Genauigkeit des Floats schneiden.
BEARBEITEN: bei 1000 (alle ganzen Zahlen sind dank der 24-Bit-Mantisse bis 16 Millionen in float32-Darstellung vollständig darstellbar) lautet die nächste Zahl für float32 1000.00006103, sodass Ihre Genauigkeit in diesem Bereich immer noch ziemlich gut ist.
Wenn Sie jedoch Messbereiche verwenden würden, würde ein Planet in dieser Entfernung Werte von 100.000.000 und der nächste von 100.000.0008 bedeuten: 8 Meter Genauigkeit bei 100.000 km.
Dies würde zu Kamerasprüngen führen, wenn Sie beispielsweise versuchen, sich auf einem Satelliten zu bewegen, und das Rendering des Satelliten selbst würde völlig kaputt gehen, wenn die Null Ihrer Welt das Zentrum des Planeten ist. Wenn es das Zentrum des Sternensystems ist, ist es noch schlimmer.
Suche nach Flavien Brebion (Ysaneya) und dem Spiel Infinity Quest for Earth. Er hat ein interessantes Entwicklerjournal von Gamedev und sein Forum, in dem er erklärt, wie Sternensystementfernungen mit Absoluten unmöglich zu bewältigen sind.
Er erwähnt auch das Tiefenpufferproblem in solchen Bereichen und ist einer der ersten, wenn nicht der erste, der logarithmische Z-Skalen einführt. http://www.gamedev.net/blog/73/entry-2006307-tip-of-the-day-logarithmic-zbuffer-artifacts-fix/ viel vollständiger hier: http://outerra.blogspot.jp/ 2012/11 / Maximierung-Tiefe-Puffer-Bereich-and.html
Softwaretestumgebung: Gute Idee, es ist eine hervorragende Möglichkeit, Shader zu erstellen, damit Sie Schritt für Schritt debuggen können, was gerade vor sich geht. Überprüfen Sie einfach Ihre Werte Zeile für Zeile, und wenn etwas komisch aussieht, können Sie nachforschen. Ich habe in dem Code, den Sie gepostet haben, den Teil nicht gesehen, in dem der Kamerawinkel im Shader verwendet wird, daher bin ich über diesen Teil ein bisschen verwirrt.
quelle