Это точно не щели, с ними я уже разобрался. Это в моём случае эффект применения шейдера, при отсутствии текстуры такого эффекта нет, а вот даже при однотонной текстуре он есть. В общем вопрос в том как стандартный шейдер для вывода поверхности переделать чтобы он края не подкрашивал?
Хотя может и не шейдер....
- тут видны небольшие косяки.
- так оно в близи выглядит
- а при белом цвете норм!
AIIIBAP
При текстурировании что происходит с краями текстур? Если стоит режим CLAMP, пиксели за краями считаются равными пикселям на краях. Если REPEAT, то пикселям на противоположном краю. Тебе же надо, чтобы брались пиксели с соседней текстуры. Аппаратно это нереализуемо насколько я знаю, программно есть множество способов. Я например генерирую текстуры 256*256, но с масштабом 254.0/256.0, так что по периметру автоматически получаются пиксели из соседних текстур. Рендерить надо тоже с таким масштабом (передавать в шейдер множитель для текстурных координат). С картами нормальней сложнее - для правильной генерации нормалей нужно генерировать высоты с запасом 2 пикселя. Правда из-за этого у меня появилась проблема - сетку 254*254 не покрыть равномерно мешами 33*33. Крайний меш должен быть 31*33 или 33*31 или 31*31, но я пока это игнорирую, поэтому у меня на планетах можно видеть горизонтальные террасы шириной 2 треугольника.
Всем спасибо! Я решил проблему! Я явно прописал нормали для мешей. До этого они генерировались специальным методом и косячно, теперь же норм!
Касательно атмосферы E.Bruneton'а. На GeForce 8600M GT (256мб) она вообще запустится? Хотелось бы как-то узнать заранее до начала портирования этого метода для своего проекта.
Morphia
> а где же зеленые , красные , желтые
Зелёных звёзд в природе не бывает. :)
Зеленым может быть свечение газа той же небулы, но не цвет звезды.
Просто для наглядности: зависимость цвета тела от его температуры
http://www.vendian.org/mncharity/dir3/blackbody/
http://www.vendian.org/mncharity/dir3/blackbody/UnstableURLs/bbr_color.html
Зелёные звёзды = белые звёзды
Neptune
Смотрел недавнее видео. Красиво, блин!
Как ты так чётко склоны определяешь?
Т.е. в функции цвет зависит от наклона поверхности, а вот как этот наклон надёжно получать?
Artlav
Наклон определяю из карты нормалей:
vec4 bumpData = texture2D(NormalMap, texCoord); vec3 norm = 2.0 * bumpData.xyz - 1.0; float slope = clamp( 1.0 - pow( norm.z, 6.0), 0.0, 1.0);
Величина наклона получается не в градусах или радианах, а в каких-то условных единицах, от 0.0 до 1.0
Neptune
> Наклон определяю из карты нормалей:
Многопроходная генерация?
А карта нормалей как генерируется?
Artlav
1) Шейдером генерируется карта высот, время 1-10 мс
2) Другим шейдером по карте высот строится карта нормалей, время 1-2 мс
3) Третьим шейдером по картам высот и нормалей генерируется карта цвета, время 1-10 мс
4) Карта высот считывается в память CPU для построения меша и физики, время ~50-80 мс (упс, боттлнек)
5) Строится меш и заливается в GPU
Карта нормалей строится обычным образом - считаются градиенты из текущего в 4 соседних пикселя и усредняются. Можно брать и 8 пикселей, с весами и т.д., но я не стал заморачиваться.
В шейдерах, генерирующих высоту и цвет, суммарно больше сотни вызовов перлин нойса. Главная проблема у меня - считывание карты высот в CPU, это жутко медленная операция. Причём карта высот и цвета 256*256, а меш всего 32*32 - явная избыточность. Методы оптимизации:
1) Считывать только каждый восьмой пиксель
2) Пропускать 3 промежуточных уровня
3) Строть меш на GPU (render to VBO)
4) Использовать один и тот же плоский меш и сэмплить карту высот в вершинном шейдере, выводящем планету
5) Сделать рендер планеты трассировкой луча - самое качественное, нет мучений со стыками патчей
Сделал второе, скорость загрузки возросла раз в 10 (но ещё не отладил). Думаю теперь попробовать первое. В методах 3-5 всё равно придётся что-то считывать в CPU для физики.
Neptune
> 1) Шейдером генерируется карта высот, время 1-10 мс
> 2) Другим шейдером по карте высот строится карта нормалей, время 1-2 мс
> 3) Третьим шейдером по картам высот и нормалей генерируется карта цвета, время
> 1-10 мс
> 4) Карта высот считывается в память CPU для построения меша и физики, время
> ~50-80 мс (упс, боттлнек)
> 5) Строится меш и заливается в GPU
Однако...
Блин, шустро же такое у тебя работает.
самая жесть у тебя - это взятие соседних пикселей с соседних патчей. Без них реально правильно нормаль не сделать - но это ппц =(
Я просто решил схитрить. У меня планета в памяти ничего почти не занимает и генерится на лету - я пользуюсь своей собственной функцией для случайных чисел, и мне вообще не надо хранить ничего кроме того что уже на экране или вскоре на нём появится. Но вот эти самые соседние пиксели подкинули мне проблем! Ещё есть вариант нормали по краям считать без учёта соседей, представить что они вверх направлены - но это очень нехорошо!
AIIIBAP
Ты не так понял - для расчета нормали не нужно брать пиксели с соседних текстур.
Кусочек карты высот генерируется сразу шире на несколько пикселей по краям.
Я кстати тоже буквально вчера попробовал сделать все на гпу - процессор просто выводит меши сферы с нужной детализацией, а шейдер поднимает поверхность и генерирует диффуз(простой градиент) по функции шума. Работает бодро, но если считать нормали+нормальную текстуру поверхности+тени+постэффекты, я думаю будет не экономично, буду делать сохранение в текстуры. Если считать нормали без учета соседей, все равно будут полосы. Можно попробовать считать нормали без карты высот сразу по шуму, тогда не надо возится с краями.
Neptune
а как карту высот считываешь в память CPU? Текстуру можно вернуть как массив?