В статье рассматривается вопрос методов рендеринга ландшафта. Выбор методов рендеринга ландшафта целиком ложится на плечи программиста и зависит от предназначения реализуемого приложения (ландшафт может иметь малые размеры или большие, а также способ отрисовки ландшафта может зависеть от вида реализации виртуальной камеры).
Ключевые слова: рендеринг ландшафта, Height map, LOD, QuadTree, Node Based LOD, Frustum сulling .
Визуализация ландшафта является важной задачей в области компьютерной графики. В играх и других приложениях часто присутствует необходимость отрисовки больших открытых территорий. Создание этих территорий является трудоемкой задачей для человека, поэтому часто её выполнением частично или полностью занимается компьютер. Таким образом, для использования ландшафта в компьютерной графике необходимо решить следующие задачи: его моделирование или генерацию и визуализацию.
Ландшафт может быть заранее смоделирован с помощью программ для 3D моделирования, таких как Blender. Однако при помощи таких моделей в реальном времени можно отрисовывать лишь небольшие участки ландшафта, т. к. отрисовка большего количества данных ландшафта требует других подходов.
Самым распространённым методом хранения вершинных данных ландшафта являются карты высот (Height map). Карты высот — это просто отображение точек высоты, хранящихся в файле. Наиболее распространенный способ хранения карты высот — использование растрового, необработанного, текстового или двоичного файла и сохранение высоты ландшафта с использованием значения от 0 до 255, где 0 — самая низкая высота местности, а 255 — максимальная высота. Растровые изображения в оттенках серого и файлы формата RAW хорошо подходят для этого, поскольку вы можете использовать интенсивность серого цвета для представления высоты. Это также делает их очень легко редактируемыми с помощью любых растровых графических редакторов (можно использовать шумовые фильтры, доступные во многих программах, таких как Photoshop).
Более того можно использовать готовые данные NASA, которые выполнили в свое время программу SRTM (Shuttle Radar Topography Mission) по радиолокационному картированию земной поверхности. Эти данные можно применить, для задания карты высот реального участка ландшафта земной поверхности. Данные, полученные в ходе миссии, находятся в открытом доступе в интернете. Пример приведен на рисунке 1.
Рис. 1. Растровое изображение карты высот
Для создания карт высот можно использовать существующий ряд программ генерации ландшафта, таких как World Machine и Terragen. И, наконец, можно написать свой собственный генератор карт высот, используя такие комбинации многомерных функций, как шум Перлина, симплекс шум и диаграмма Вороного, а также такие алгоритмы, как Diamond-Square, биологические алгоритмы для размещения растений, деревьев, эрозии рек, термальные эрозии и так далее, для создания довольно реалистичной местности. Правильно подобранная сумма результатов работы таких функций и алгоритмов неплохо справляется с задачей генерации, при этом вычисление такой суммы вполне возможно в реальном времени. Однако, время генерации зависит от количества и сложности применённых алгоритмов. Примеры шумов показаны на рисунке 2.
Рис. 2. Пример шума Перлина, Симплекс шума и диаграммы Вороного
Самый простой метод рендеринга карты высот, это отрисовка квадратной регулярной сетки точек с помощью лент треугольников (регулярной называется сетка, все точки которой равномерно расположены), однако такай метод наименее эффективный.
Сложность задачи визуализации состоит в том, что наблюдатель должен видеть все детали ландшафта на значительном расстоянии: как крошечные детали вблизи, так и крупные элементы вдалеке. В этом же состоит и основной путь оптимизации: вблизи ландшафт должен отображаться детализировано (высокий уровень детализации), а вдалеке можно обойтись гораздо меньшей детализацией (низкий уровень детализации), снижая тем самым количество данных для отрисовки.
Для рендеринга нескольких километров рельефа необходимо использовать один из методов уровня детализации (LOD). LOD — это группа методов, которые преследуют общую цель — уменьшить количество полигонов и сложное использование шейдеров (шейдер — программа, исполняемая графическим процессором (GPU) для реализации различных графических эффектов) на удаленной местности. Если попытаться визуализировать большое количество рельефа без уменьшения детализации, быстро обнаружится, что обычная видеокарта не сможет воспроизводить ее с разумной скоростью. Однако даже простая реализация LOD позволит рисовать огромное количество ландшафта и в то же время поддерживать впечатляющую частоту кадров.
Существует множество алгоритмов LOD, все они отличаются и имеют свои особенности: LOD на основе узлов (Node Based LOD), ROAM (Real-time Optimally Adapting Meshes), GPU-Based Geometry Clipmaps, MipMapping геометрии, Continuous Distance-Dependent LOD (CDLOD), рендеринг ландшафтов с помощью тесселяции и другие методы. Однако аппаратные архитектуры и доступные ресурсы резко меняются. Таким образом, методы рендеринга ландшафта, которые были предпочтительны еще несколько лет назад, могут сегодня устареть.
В основе многих алгоритмов визуализации с уровнями детализации находится дерево квадрантов (QuadTree). Описать базовый алгоритм его использования можно следующим образом:
- в основании дерева находится квадрат (регулярная сетка точек);
- при необходимости повышения детализации (приближение камеры) он делится на четыре квадрата, подобное деление применимо и к созданным дочерним квадратам;
- при необходимости понижения детализации (отдаление камеры) четыре дочерних квадрата удаляются, вместо них остается один родительский. Удаления возможны пока не останется один квадрат — корень дерева.
Данный алгоритм используется для отбрасывания ветвей дерева, которые находятся вне области видимости виртуальной камеры. Эта операция называется отсечением по пирамиде вида (frustum сulling). Пример приведен на рисунке 3.
Рис. 3. Отсечение по пирамиде вида
Для общего представления о том, что из себя представляют методы уровней детализации, рассмотрим метод «LOD на основе узлов», который использует предварительно построенный ландшафт.
LOD на основе узлов — это метод, при котором вся местность равномерно разбита на несколько узлов. Каждый узел имеет одинаковый размер и покрывает определенное расстояние, например, 128 метров на 128 метров. Что наиболее важно в этом методе, это то, что каждый узел имеет несколько уровней качества. Например, узел может иметь версию низкого, среднего и высокого качества, которая была предварительно построена. Затем, когда происходит отрисовка узла, нужно определить расстояние до камеры и выбрать, какую версию качества визуализировать. Если это близко к камере, то визуализируется версия высокого качества, если это немного дальше, визуализируется среднее качество, и если оно выходит за определенный диапазон, но в пределах максимального расстояния рендеринга, тогда рисуется версия низкого качества. Можно иметь сколько угодно уровней качества, но часто используется около четырёх.
Следующая часть LOD на основе узлов заключается в том, что для загрузки и выгрузки узлов используются фоновые потоки, когда камера перемещается по местности. Большинству видеокарт не хватает памяти для хранения нескольких километров разнообразных узлов местности, поэтому необходима загрузка / выгрузка (обмен между оперативной памятью и видеопамятью). И чтобы частота кадров не нарушалась, нужно использовать фоновые потоки для загрузки. Например, когда камера перемещается ближе к узлу среднего качества, она должна загружать в потоке версию более высокого качества. После загрузки он переключается на рендеринг высококачественной версии. И, наконец, он выгружает версию среднего качества, которую он использовал ранее.
Для каждого уровня качества требуется шейдер (или несколько шейдеров). Сложный шейдер, который используется для близкой местности, никогда не должен использоваться для удаленной местности. Также хорошо сортировать по шейдеру при рендеринге и стараться свести к минимуму обновления переменных шейдера, чтобы получить наилучшую частоту кадров.
Последняя часть LOD на основе узлов — это то, что узлы визуализируются в соответствии с расположением камеры. Узел, в котором в данный момент находится камера, и восемь узлов вокруг нее должны отображаться с высоким качеством. Это позволяет всегда сохранять область, которая окружает камеру, в высоком качестве, а также дает достаточно времени для загрузки более высококачественных узлов по мере движения камеры. Следует обратить внимание, что высокочастотные эффекты, такие как карты нормалей, не будут отображаться на расстоянии, поэтому нет необходимости создавать более девяти узлов высококачественной местности.
Следующие 16 узлов, которые окружают 9 узлов высокого качества, отображаются как средние. Можно сделать более 16 (например, следующие 24 узла, которые окружают эти 16 узлов) в среднем качестве, но это то, что является абсолютно гибким и подходящий результат помогут выбрать тесты.
Наконец, все остальные узлы, которые визуализируются за пределами этого, выполняются с низким качеством. Однако могут быть исключения: некоторые узлы всегда требуют минимального среднего качества даже на большом расстоянии, например, в горах. Таким образом некоторые узлы могут быть помечены, чтобы никогда не понижать их качество ниже определенного предела. Диаграмма, которая поможет понять суть алгоритма, оказана на рисунке 4.
Рис. 4. Диаграмма, визуализирующая порядок расположения уровней детализации
Следует обратить внимание, на то, что на диаграмме показаны только два уровня низкокачественных узлов, на самом деле может потребоваться сделать гораздо больше. Но сначала нужно определить бюджет данных ландшафта, чтобы точно определить, сколько нужно рисовать. В бюджет входят: различные текстуры и текстурные карты для текстурирования ландшафта, а также следует определить количество полигонов для каждой степени детализации и общий размер ландшафта. Бюджет поможет определить тестирование на целевом аппаратном обеспечении.
Использование LOD на основе узлов позволяет очень легко отбирать узлы, которые нельзя просмотреть. Каждый узел имеет определенный размер в определенном месте, поэтому можно провести быстрое отсечение по пирамиде вида, чтобы быстро отбросить узлы от рендеринга. Можно также создать дерево квадрантов, чтобы выполнять отбраковку с большей скоростью. В среднем в любом месте камеры никогда не будет просматриваться более 30 процентов местности. А также может быть выбран метод реализации камеры для просмотра сверху вниз и в момент времени на экране будет виден лишь небольшой участок местности. Например, на диаграмме н рисунке 5 показаны узлы, выделенные серым цветом, если камера находится в центре, глядя сверху.
Рис. 5. Диаграмма, визуализирующая отбраковывающиеся узлы
Отбраковка узлов, сильно связана с бюджетом местности. Все отбракованные окружающие узлы все еще должны быть загружены в память, но частота кадров отражает только то, что рисуется в этот момент. Так что нужно иметь это в виду при создании бюджета ландшафта.
В статью не вошли методы текстурирования ландшафта и описание методов генерации ландшафта, т. к. это отдельные объёмные темы.
Литература:
1 Болтов Ю. Ф., Дудаков Л. С., Тарлыков А. В. Решение задачи визуализации процедурно генерируемого ландшафта при помощи алгоритма на основе структуры «Дерево квадрантов» // Труды учебных заведений связи 2016. № 2. С. 28–33.
2 Загрузка реальных ландшафтов в Unity 3D, URL: https://habr.com/ru/post/329246/ (Дата обращения: 19.04.2020)
3 Tutorial 18: Large Terrain Rendering, URL: http://www.rastertek.com/terdx10tut18.html (Дата обращения: 19.04.2020)
4 Fast Terrain Rendering with Continuous Detail on a Modern GPU, URL: http://casual-effects.blogspot.com/2014/04/fast-terrain-rendering-with-continuous.html (Дата обращения: 19.04.2020)
5 GPU Gems 2 Chapter 2. Terrain Rendering Using GPU-Based Geometry Clipmaps, URL: https://developer.nvidia.com/gpugems/gpugems2/part-i-geometric-complexity/chapter-2-terrain-rendering-using-gpu-based-geometry (Дата обращения: 19.04.2020)
6 Быстрый рендеринг ландшафта с использованием MipMapping геометрий, URL: http://jmonkeyengine.ru/articles/переводы-с-других-сайтов/рендеринг-mipmapping (Дата обращения: 19.04.2020)
7 Создание ландшафтов с применением алгоритма ROAM, URL: http://madmedic.bos.ru/art03.htm (Дата обращения: 19.04.2020)
8 Filip Strugar Continuous Distance-Dependent Level of Detail for Rendering Heightmaps (CDLOD). 2010. 15 с.
9 Г.Снук 3D-ландшафты в реальном времени на С++ и DirectX9. КУДИЦ-Образ. 2006. 368 с.