Neptune
> Так версия с загрузкой текстур из файла работает?
Так точно.
Neptune
> Такового и не было. Весь расчёт на GPU.
жаль, ну сам сделаю значит:)
Neptune
> Так это только на нвидиа проблема?
нет, у меня на АТИ тоже глючит. Оно компилится, но вешает машину, как я уже писал. А сейчас запустил твою демку и вижу. что оно ещё и считается неверно, когда срабатывает - результат другой сильно. А именно, у меня при включении нелинейной выборки из 4D карты атмосфера получается слишком непрозрачной. С твоей текстурой всё отлично работает.
ещё вопрос: Как оцениваешь шансы завести эту тему с несферической Землёй, то есть честный сфероид из WGS84 (с переменной толщиной атмосферы морочиться не буду, а вот форму планеты хочется сохранить правильной)? С одной стороны в 4D карте записывается функция от высоты над нижней кромкой атмосферы (с твоих слов...), а с другой стороны в коде расчёта радиус планеты присутствует много.
serpinf
> ещё вопрос: Как оцениваешь шансы завести эту тему с несферической Землёй, то
> есть честный сфероид из WGS84 (с переменной толщиной атмосферы морочиться не
> буду, а вот форму планеты хочется сохранить правильной)? С одной стороны в 4D
> карте записывается функция от высоты над нижней кромкой атмосферы (с твоих
> слов...), а с другой стороны в коде расчёта радиус планеты присутствует много.
Спм пока безуспешно пытался заставить эту атмосферу работать со сплюснутыми планетами, просто масштабируя всё по оси Y. Не получается, при приближении к полюсу всё съезжает. Поэтому в моём движке все газовые гиганты и звёзды пока идеально круглые.
Для Земли можно попробовать забить на несферичность. Сделать атмосферу сферичной, а форму Земли учесть просто самим ландшафтом. Т.е. высоты будут меняться не от 0 до 8848 м, а от 0 до 20+8848, если разница полярного и экваториального радиуса 20 км.
serpinf
> Оно компилится, но вешает машину
аналогично
Neptune
сделал адаптацию для сфероидальной планеты, идея следующая:
- для положения фрагмента и камеры вместо vec3(x,y,z), передаётся vec4(up, h), где up - направление вверх для данной точки, а h - высота над эллипсоидом планеты.
- далее рассчитываем
Normal = normalize(ray.xyz); FragR = max( 1.000001*Radiuses.x, Radiuses.x+ray.w); FragPos = Normal * FragR; eyeNormal = normalize( EyePos_ray.xyz); EyeR = max( 1.000001*Radiuses.x, Radiuses.x+EyePos_ray.w); EyePos = eyeNormal * EyeR;
Не понял идею. Атмосфера и меш планеты остаются сферическими, но в шейдере делается хитрое масштабирование? Или как? Что такое vec4(up, h) и чему он соответствует в приведённом тобой коде?
Neptune
меш планеты и атмосферы рисуются эллипсоидом.
в коде:
variable vec4 ray; // (up, h) up - нормаль к поверхности эллипсоида, высота над эллипсоидом - для ФРАГМЕНТА
uniform vec4 EyePos_ray; // (up, h) up - нормаль к поверхности эллипсоида, высота над эллипсоидом - для КАМЕРЫ
дальше всё примерно так же как в твоём коде из #124
serpinf, спасибо, буду разбираться.
Реализация атмосферы Брунетона в сочетании с deferred rendering. В pdf файле описание с исходниками шейдеров. Есть демка, шейдеры можно выдрать из неё. В отличие от Брунетоновской демки, здесь есть рельеф на шуме Перлина, с двухуровненым текстурированием (как я понял, все вычисляется и текстурируется на ходу, при рендере). Работает даже медленнее чем у меня, при моём forvard рендере и связанным с ним заметным овердровом, может из-за построения рельефа на ходу.
http://www.sperlhofer.com/university-work/master-thesis/atmospheric-scattering
Пробую реализовать шейдер с статьи http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html
Оказалось код не так просто на HLSL переписать. Но вконце на екран что-то вывелось. Только вот артефакти тоже вылезли. Вот один такой:
и еще:
На втором скрине дуга заходит внутрь планеты(
Первые артефакты появляются только на определенном расстоянии.
И еще одно, незнаю баг ли ето, полное кольцо вокруг планеты можно видеть только если камера находится строго междусолнцем и планетой. Если немножко сдвинутся то ореол пропадает на больших расстояниях.
ЗЫ:
Артафакти вроде появляются, если камера на расстоянии 25 единиц от цонтра планеты. Радиус атмосферы - 10,25 , планеты - 10.
Всё же очень тормозной код у мистера Брунетона. Провёл тест. Вид с поверхности планеты, всё лишнее отключено, только рельеф, 4 глобальных источника света (ну, 2 солнца и 2 луны :) ), Full HD, GeForce 9800 GTX+.
Атмосфера отключена - 114 фпс
Атмосфера включена - 28 фпс
Мда... самый жуткий код - в функции texture4D. Думал обращение к texture3D всё съедает, закомментил их и подставил вместо них vec4(0.0) - 52 фпс. Получается texture3D тормозит?
Но потом дошло, что добрый компилятор просо взял и заоптимизировал нафиг все расчёты, которые оказались не нужные, т.к. функция в итоге выдаёт ноль. Ладно, заменил на return vec4(uvw, tex4Dlerpf), чтобы компилятор не смог просто убрать весь этот код, а только обращение к texture3D (uvw и tex4Dlerpf это текстурные координаты для texture3D и коэффициент для mix, они-то тем жутким кодом и вычисляются). Получилось 33 фпс! Совсем не далеко от полного кода атмосферы, так что texture3D оказывается много и не съедали. Значит всё-таки надо как-то избавляться от промежуточных вычислений, загнать их сразу в ту самую 3D текстуру. Так можно будет как минимум вдвое поднять производительность.
Neptune
> Значит всё-таки надо как-то избавляться от промежуточных вычислений, загнать их
> сразу в ту самую 3D текстуру. Так можно будет как минимум вдвое поднять
> производительность.
Не всё так однозначно :) nvidia обычно быстрее в выборках, amd в математике - выбирай но осторожно
А что если реклама про увеличение члена - правда. А мы считаем что это развод? Цвет мошонки зависит от высоты.
А Chapman Grazing-Incidence из Gpu pro3 никто не пробовал реализовывать?
Vine
Во-первых не реалистично, а во-вторых не учитывает высоту.
Тема в архиве.