Я нахожусь в процессе осуществления атмосферного рассеяния планет из космоса. В качестве отправной точки я использовал шейдеры Шона О'Нила из 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 был обновлен, чтобы отразить изменения в этом обновлении.
источник
Ответы:
У меня сейчас нет рабочего кода, так как я перевожу свой движок, но это были мои настройки рабочих параметров:
Это был шейдер:
Дайте мне знать, если это все еще работает. Если вам понадобится какая-либо другая помощь, я постараюсь покопаться в своем коде. Я думаю, что использовал две сферы для рендеринга: одну для поверхности и одну для атмосферы.
источник
некоторые следы мыслей: проверьте точность ваших поплавков. в космических масштабах почти все время float32 недостаточно. Проверьте буфер dpeth, если у вас есть примитивный рендеринг, например, сфера под вашим рассеивающим шейдером.
Эти артефакты также можно найти в трассировке лучей, обычно это пересечение вторичных лучей с дрожанием первичной поверхности из-за проблем точности поплавка.
РЕДАКТИРОВАТЬ: при 1000 (все целые числа представимы полностью до 16 миллионов в представлении float32, благодаря 24-битной мантиссе), следующее число для float32 - 1000.00006103, так что ваша точность все еще довольно хороша в этом диапазоне.
однако, если вы будете использовать диапазоны метров, чтобы увидеть планету a, это расстояние будет означать значения 100 000 000, а следующее - 10000 0008: 8 метров точности на 100 000 км.
это может вызвать скачки камеры, если вы попытаетесь, например, передвигаться вокруг спутника, а рендеринг самого спутника будет нарушен, если ноль вашего мира будет центром планеты. если это центр звездной системы, то это еще хуже.
ищите flavien brebion (Ysaneya) и игровой бесконечный квест на землю. У него есть интересный девелоперский журнал gamedev и его форум, где он объясняет, как с помощью абсолютов невозможно управлять расстояниями звездной системы.
Он также упоминает проблему буфера глубины в таких диапазонах и является одним из первых, если не первым, кто ввел логарифмические z-шкалы. http://www.gamedev.net/blog/73/entry-2006307-tip-of-the-day-logarithmic-zbuffer-artifacts-fix/ гораздо более полный здесь: http://outerra.blogspot.jp/ 2012/11 / максимизация глубина-буфер-диапазон and.html
Тестовый стенд для программного обеспечения: хорошая идея, это отличный способ создания шейдеров, чтобы вы могли шаг за шагом отлаживать происходящее. просто проверяйте ваши значения построчно, и если что-то выглядит странно, вы можете исследовать это. Я не видел в коде, который вы разместили, где используется угол камеры в шейдере, поэтому я немного озадачен этой частью.
источник