В течение последних двух месяцев я работал 50/50 над Overview и SpaceEngine. Работа над Overview продолжается, мы все еще не выпустили его на Oculus Store, и готовим обновление для Steam и Vive Port.

Что касается SE, я продолжаю работу над новыми текстурами ландшафта. Это реально слишком долгая работа, я начал её ещё в сентябре (!). Поэтому я планирую скоро её остановить и переключиться на другие задачи (реймарчинговые туманности и подготовка к релизу). Меня не удовлетворили результаты последних экспериментов с наложением детальных текстур в ​​реальном времени, поэтому я переключился на предварительно сгенерированные текстуры, которые работают так же, как обычные текстуры в ландшафтном движке SE. Вместо текстур Id материалов и весов материалов, генерирующихся для нескольких последних уровней квадродерева ландшафта (как правило, это уровень 13 на землеразмерной планете), SE теперь генерирует дополнительные 10 уровней квадродерева. Для достижения разрешения 1 мм требуется такая большая глубина дерева. Раньше максимальное разрешение текстуры составляло 1 метр на пиксель, но если мы хотим 1 миллиметр, нам нужно разрешение в 1000 раз больше, то есть log2 (1000) ~= 10 дополнительных уровней. Самые детальные ноды имеют «физический» размер всего в полметра!

Новые текстуры узлов девева имеют такое же разрешение 256×256, как и обычные текстуры, и содержат только результат (карты цвета и нормалей) смешивания детальных текстур с помощью нового «splatting» шейдера. Код шейдера перенесён из шейдера рендера планеты практически без изменений. Визуально результат такой же, как и раньше, но с несколькими большими преимуществами:

– Частота кадров снова высока, 100+ FPS (на GTX 1060 при разрешении 1080p), как и перед реализацией детальных текстур. Дополнительные ноды почти не повлияли на производительность.
– Частота кадров не зависит от количества материалов, используемых на планете. Пока предел – 64 шт, но его можно легко увеличить до нескольких сотен. Сложность влияет только на время генерации / загрузки.
– Больше нет артефактов вроде резких переходов материалов, швов и алиасинга, вызванных ограниченным количеством материалов, хранящихся в splat-текстурах, и разрывами в функции интерполяции. Splatting шейдер просто проходит по всем материалам в цикле и смешивает их все вместе, основываясь на весах, которые тут же и вычисляются.
– Теперь можно реализовать тяжёлые текстурные эффекты, такие как parallax occlusion mapping (см. ниже).

Но этот метод так же имеет и некоторые недостатки (как обычно это бывает в программировании):

– Увеличилось время генерации. Теперь придётся подождать, пока сгенерируются все дополнительные уровни. Правда движок делает это довольно быстро: splatting шейдер намного быстрее, чем шейдеры процедурной генерации текстур, используемые на более грубых уровнях планеты.
– Увеличилось использование видеопамяти: движку необходимо хранить текстуры дополнительных 10 уровней квадродерева. Используя оптимальные настройки соотношения качества и скорости, ландшафт теперь требует 700-800 Мбайт видеопамяти, в дополнение к 900 Мб для атласа детальных текстур. Но это без сжатия, я планирую реализовать его для уменьшения использования памяти в 3-4 раза.
– Теперь нельзя увидеть изменения текстур в редакторе материалов в реальном времени, нужно жать кнопку «Обновить планету». Однако, я реализовал быструю перезагрузку планеты: SE просто перегенерирует те текстуры, которые находятся в поле зрения, а не на всю планету целиком.

Экспериментальный POM (parallax occlusion mapping): он делает камни выглядящими объёмными, но ценой снижения производительности в в 1,5 раза (но частота кадров всё ещё около 60 FPS на GTX 1060 при 1080p). POM – тяжёлый эффект во всех играх. Но выглядит круто, особенно в VR! (Посмотрите на камни в правой части скриншота). Вы можете заметить швы – они появляются, потому что каждый узел квадродерева имеет доступ только к своим собственным текстурам для рендеринга. Когда луч выходит за границы текстуры, шейдер не знает, откуда взять пиксели. Эту проблему можно решить, передав все восемь соседних текстур в шейдер, или же более элегантным способом – виртуальными текстурами или “клипмапами”. В этих методах текстуры узлов квадродерева хранятся в одной большой текстуре непрерывным образом, поэтому POM-шейдер может легко перейти к следующему узлу, просто проигнорировав его границу. Или же я реализую более радикальный метод – тесселяцию. Конечно, все это для будущих версий, я хочу как можно скорее закончить работу над ландшафтами, чтобы не откладывать более релиз 0.990.

Новый метод текстурирования работает и на реальных планетах. Им по-прежнему не хватает детализации на промежуточных масштабах (сотни метров), но я не буду работать над этим для 0.990.

Обсудить этот пост на форуме.