Это последнее сообщение в блоге в этом году, очевидно)) Месяц назад я начал новый эксперимент – разбил детальные текстуры ландшафта на два набора:

  • Текстуры материалов (почвы) – используются на сантиметровых масштабах. Это текстуры песка, гальки, травы и т.д.
  • Текстуры-образцы, которые используются на километровых масштабах. Это текстуры, сделанные из реальных спутниковых изображений Земли, Марса и других планет.
  • Первый набор текстур почти такой же, как описано в этом блог-посте. Эти текстуры накладываются по время рендера планеты, то есть с помощью шейдера, рисующего планету. Чтобы увеличить FPS, я ограничил текстурирование на этом этапе двумя текстурами, а не тремя, как раньше. Итак, теперь есть только 2 слоя: «базовая» текстура, например крупные блоки скальной породы, и «модулирующая» текстура, например, мелкомасштабная текстура скалы с небольшими ямками и пятнами. Вариативность на более крупных масштабах (десятки метров) достигается путём чередования четырёх таких материалов, контролируемое с помощью splat-карты.

    Второй набор текстур заменяет старый текстурный атлас из 0.980. Но теперь это не текстуры камней/гальки/травы, а образцы спутниковых и аэрофотоснимков реальных планет. Выглядит уже довольно многообещающе, хотя гребни и овраги это пока только текстура, не реальный рельеф (наложение сэмплов карт высот – следующая задача):

    Вид с орбиты

    Обратите внимание на паттерн, похожий на эрозию – это текстура-образец сделана по снимкам Земли

    Текстуры-образцы накладываются во время генерации, т.е. шейдеров генератора текстур рельефа. Таким образом, смешивание различных сэмплов, устранение тайлинга и другие алгоритмы могут быть намного сложнее, чем в шейдере рендеринга планеты, поскольку они не влияют на FPS, а просто увеличивает время генерации рельефа. Сейчас эта система тоже использует 2 слоя текстур, которые смешиваются вместе на разных масштабах.

    Ещё ближе – обратите внимание на паттерн, похожий на верхушки деревьев. Это текстура также сделана на основе снимков Земли, но меньшего масштаба.

    Новая стадия генератора рельефа представляет собой шейдер, формирующий splat-карты (карты, задающие распределение материалов). Теперь он пытается назначить материал грунта, анализируя цвет глобальной текстуры. Это контролируется специальным скриптом материалов, где описаны текстуры грунта, настройки их масштаба/смешивания, и целевой цвет. Например, материал травы состоит из текстуры травы, модулированной некой крупномасштабной текстурой, задающей вариацию оттенка, и имеет зелёный целевой цвет. А материал песка состоит из текстуры дюн, модулированной мелкой текстурой песчинок, и имеет жёлтый целевой цвет. Шейдер splat-карт берёт текстуру патча поверхности планеты, смотрит на цвет каждого пикселя в ней и пытается определить, какой материал для него лучше всего подходит. Например, зелёные пиксели, вероятно, будут травой, жёлтые – песком, белые – снегом и т.д. Список разрешённых материалов контролируется файлом биома планеты, поэтому, например, безжизненные пустынные миры не будут использовать материал травы, даже если на них есть области зелёного цвета. Назначение материала также контролируется наклоном поверхности, идентификатором биома и другими параметрами. Шейдер затем берет 4 наиболее подходящих материала и генерирует 2 splat-текстуры – карту id материала и карту веса материала. Эти splat-текстуры затем используются шейдером рендеринга планеты для выбора и смешивания 4 материалов на основе их весов.

    Крупный план – уже видны текстуры материалов (песчаные дюны)

    На поверхности – обратите внимание, как смешиваются несколько разных материалов травы

    Самое интересное в этой системе – то, что она работает «из коробки» на реальных планетах – на Земле, Луне, Марсе. Надо просто создать для них файл конфигурации биомов (есть возможность назначить уникальный файл для каждой реальной планеты) и создать несколько уникальных файлы конфигурации материалов. Поэтому на уровне поверхности реальные планеты теперь выглядят великолепно. У них пока что не достаёт детализации на средних масштабах – это цель для следующих экспериментов (процедурная обработка реальных карт высот).

    Земля, Гранд каньон (мод Clud’а)

    Марс, долины Маринера

    Мне все ещё предстоит много работы, некоторые вещи ещё на стадии экспериментов. Например, использовать splat-карты в шейдере рендеринга планеты не так просто, как может показаться на первый взгляд. Потому что если id материала переключается в соседних текселях splat-карты, это приводит к появлению резких границ на финальном изображении. Поэтому я реализовал код для «ручной» интерполяции, но он требует дополнительной вычислительной мощности и всё равно не исправляет все швы. Недавно я попытался убрать стадию с генерацией splat-карт, и перенести код, анализирующий цвет, в шейдер рендеринга планеты. Удивительно, но он работает почти так же быстро, как и код с ручной интерполяцией splat-карты, правда если у планеты не слишком много уникальных материалов (16 или менее). Так что есть возможностей для улучшения. Я ожидаю, что работа над ландшафтом продлится еще несколько месяцев. Особенно, если реализовать процедурную генерацию среднемасштабных деталей ландшафта для планет Солнечной системы. «Багрепорты» о плоских и размытых текстурах на Земле уже надоели.

    Большое время занимает создание файлов биомов/палитр и файлов настроек материалов для всех типов планет. Я полагаюсь на помощь бета-тестеров – как только система будет завершена, я выпущу бета-версию для них и напишу руководство по созданию соответствующих файлов.

    Всех с наступающим!

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