Jestem w trakcie wdrażania rozpraszania atmosferycznego planet z kosmosu. Korzystam z shaderów Seana O'Neila z http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html jako punktu wyjścia.
Mam prawie ten sam problem związany z fCameraAngle, z wyjątkiem modułu cieniującego SkyFromSpace w przeciwieństwie do modułu cieniującego GroundFromSpace, jak tutaj: http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/
Dziwne artefakty z nieba pojawiają się z modułu cieniującego, gdy nie są używane fCameraAngle = 1
w wewnętrznej pętli. Co jest przyczyną tych artefaktów? Artefakty znikają, gdy fCameraAngle zostanie ograniczone do 1. Wydaje mi się, że brakuje mi też odcienia obecnego w piaskownicy O'Neila ( http://sponeil.net/downloads.htm )
Pozycja kamery X = 0, Y = 0, Z = 500. GroundFromSpace po lewej, SkyFromSpace po prawej.
Pozycja kamery X = 500, Y = 500, Z = 500. GroundFromSpace po lewej, SkyFromSpace po prawej.
Przekonałem się, że kąt kamery wydaje się różnie traktowany w zależności od źródła:
W oryginalnych modułach cieniujących kąt kamery w SkyFromSpaceShader jest obliczany jako:
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
Natomiast w ziemi z modułu cieniującego kąt kamery oblicza się jako:
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
Jednak różne źródła online majstrują przy negacji promienia. Dlaczego to?
Oto projekt C # Windows.Forms, który demonstruje problem i użyłem go do generowania obrazów: https://github.com/ollipekka/AtmosphericScatteringTest/
Aktualizacja: dowiedziałem się z projektu ScatterCPU znalezionego na stronie O'Neila, że promień kamery jest negowany, gdy kamera znajduje się powyżej punktu cieniowanego, dzięki czemu rozproszenie jest obliczane od punktu do kamery.
Zmiana kierunku promienia rzeczywiście usuwa artefakty, ale wprowadza inne problemy, jak pokazano tutaj:
Ponadto w projekcie ScatterCPU O'Neil chroni przed sytuacjami, w których głębokość optyczna światła jest mniejsza niż zero:
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
Jak wskazano w komentarzach, wraz z tymi nowymi artefaktami wciąż pozostaje pytanie, co jest nie tak z obrazami, na których aparat jest ustawiony na 500, 500, 500? Wydaje się, że halo koncentruje się na całkowicie niewłaściwej części planety. Można się spodziewać, że światło będzie bliżej miejsca, w którym słońce powinno uderzyć w planetę, a nie w miejsce, w którym zmienia się z dnia na noc.
Projekt github został zaktualizowany, aby odzwierciedlić zmiany w tej aktualizacji.