Я нахожусь в процессе осуществления атмосферного рассеяния планет из космоса. В качестве отправной точки я использовал шейдеры Шона О'Нила из http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html .
У меня почти такая же проблема, связанная с fCameraAngle, за исключением шейдера SkyFromSpace, а не шейдера GroundFromSpace, как здесь: http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/
Я получаю странные артефакты с небом из космического шейдера, когда не использую fCameraAngle = 1
во внутреннем цикле. В чем причина этих артефактов? Артефакты исчезают, когда fCameraAngle ограничен до 1. Мне также, кажется, не хватает оттенка, который присутствует в песочнице О'Нила ( http://sponeil.net/downloads.htm )
Положение камеры X = 0, Y = 0, Z = 500. GroundFromSpace слева, SkyFromSpace справа.
Положение камеры X = 500, Y = 500, Z = 500. GroundFromSpace слева, SkyFromSpace справа.
Я обнаружил, что угол камеры, кажется, обрабатывается очень по-разному в зависимости от источника:
В оригинальных шейдерах угол камеры в SkyFromSpaceShader рассчитывается как:
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
Тогда как в пространстве от космического шейдера угол камеры рассчитывается как:
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
Однако различные источники онлайн повозятся с отрицанием луча. Почему это?
Вот проект C # Windows.Forms, который демонстрирует проблему и который я использовал для генерации изображений: https://github.com/ollipekka/AtmosphericScatteringTest/
Обновление: я узнал из проекта ScatterCPU, найденного на сайте О'Нила, что луч камеры отклоняется, когда камера находится над затененной точкой, так что рассеяние рассчитывается от точки к камере.
Изменение направления луча действительно удаляет артефакты, но создает другие проблемы, как показано здесь:
Кроме того, в проекте ScatterCPU О'Нил защищает от ситуаций, когда оптическая глубина света меньше нуля:
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
Как отмечено в комментариях, наряду с этими новыми артефактами это все еще оставляет вопрос, что не так с изображениями, где камера расположена на 500, 500, 500? Такое ощущение, что гало сфокусировано на совершенно неправильной части планеты. Можно было бы ожидать, что свет будет ближе к месту, где Солнце должно попадать на планету, а не к тому месту, где оно меняется со дня на ночь.
Проект github был обновлен, чтобы отразить изменения в этом обновлении.