Наконец, после долгих исследований я могу сделать вывод, что, как кто-то сказал ранее, не существует универсально «лучшего» метода. Но мои исследования привели меня к знанию следующих вещей:
В зависимости от сетки вы, наконец, будете использовать:
- Spherified Cube: любой метод LOD с реализацией квадродерева будет работать очень хорошо, вам просто нужно позаботиться о специальных случаях, таких как границы между гранями, в этом случае у вашего квадродерева должен быть указатель на соседа на смежной грани на каждом уровне.
- Любое другое: я думаю, что ROAM (более новая версия 2.0 или любое другое расширение, такое как BDAM, CABTT или RUSTIC) преуспеет, однако с этими алгоритмами сложно работать, они требуют больше памяти и немного медленнее, чем другие подходы с кубами.
Есть много методов LOD, которые хорошо подходят, но моя личная пятерка:
- Непрерывный зависимый от расстояния LOD (CDLOD)
- Geomety Clipmaps на основе графического процессора (GPUGCM)
- Ломаный LOD
- Рендеринг ландшафтов с помощью тесселяции OpenGL GPU (Книга: OpenGL Insight, глава 10)
- Геометрический MipMapping
Каждый из них предлагает уникальный способ рендеринга ландшафта, например, CDLOD имеет очень простую реализацию с использованием шейдеров (GLSL или HLSL), но также может быть реализован на ЦП (для устаревшего оборудования), однако цель рендеринга планет - взорвать лучше всего подходит для современных графических процессоров, поэтому лучше всего использовать GPUGCM, если вы хотите сжать графический процессор. Они оба очень хорошо работают с основанным на данных, процедурным или смешанным (рельеф на основе фиксированных данных или карт высот и детали, добавленные с процедурной работой) рендеринга больших ландшафтов.
Также существует сферическое расширение базового метода Geometrical Clipmaps, но есть некоторые проблемы, потому что плоские выборки карты высот должны быть параметризованы с использованием сферических координат.
Chunked LOD, с другой стороны, идеально подходит для устаревшего оборудования, не требует каких-либо вычислений на стороне GPU, идеально подходит для больших наборов данных, но не может обрабатывать процедурные данные в режиме реального времени (возможно, с некоторыми модификациями, это может)
Использование шейдеров Tessellation - это еще один метод, очень новый, поскольку вышел OpenGL 4.x, на мой взгляд, он может быть лучшим, но, говоря о рендеринге планет, мы сталкиваемся с проблемой, с которой другие методы могут справиться очень легко, и это о точности.
Если вы не хотите, чтобы ваша точность составляла 1 км между вершинами, используйте шейдеры тесселяции. Проблема с очень большими участками этого метода в том, что джиттер довольно трудно решить (или, по крайней мере, для меня, так как я новичок в тесселяционных шейдерах).
Geomipmapping - это отличный метод, использующий преимущества квадродерева и имеющий низкую ошибку проецируемого пикселя, но для планетарного рендеринга вам нужно будет установить не менее 16+ уровней детализации, что означает, что вам понадобятся (для сшивания точек) некоторые дополнительные патчи чтобы соединить разные уровни и позаботиться об уровне вашего соседа, это может быть утомительно, особенно при использовании 6 граней ландшафта.
Есть еще один метод, очень специфический в своем роде: «Projective Grid Mapping для Planetary Terrain» отлично подходит для визуализации, но имеет свои недостатки, если вы хотите узнать больше, перейдите по ссылке.
Проблемы:
Джиттер : большинство современных графических процессоров поддерживают только 32-битные значения с плавающей запятой, что не обеспечивает достаточной точности для манипулирования большими позициями на планетарных масштабах. Джиттер возникает, когда зритель увеличивает и вращает или перемещает, тогда полигоны начинают подпрыгивать взад-вперед.
Лучшее решение для этого - использовать метод «Рендеринг по отношению к глазу с использованием графического процессора». Этот метод описан в книге «3D Engine Design for Virtual Globes» (я уверен, что вы также можете найти ее в Интернете), где в основном вам нужно установить все свои позиции с двойными значениями на CPU (патчи, клипы, объекты, frustrum, camera и т. д.), а затем MV центрируется вокруг зрителя, устанавливая его перевод в (0, 0, 0) T, и двойники кодируются в представлении с фиксированной точкой, используя биты дроби (мантиссы) двух чисел с плавающей запятой, низкий и высокий по некоторым методам (читайте об использовании реализации Ohlarik и библиотеке Fortran DSFUN90).
Хотя вершинный шейдер требует только двух дополнительных вычитаний и одного сложения, графический процессор RTE удваивает объем памяти вершинного буфера, необходимый для позиций. Это не обязательно удваивает требования к памяти, если только не сохраняются только позиции.
Точность буфера глубины : Z-бой. Так как мы рендерим очень большие ландшафты, в данном случае: планеты, Z-буфер должен быть ОГРОМНЫМ, но не имеет значения, какие значения вы установили для znear и zfar, всегда будут проблемы.
Поскольку Z-буфер зависит от интервала с плавающей запятой, а также он является линейным (хотя перспективная проекция нелинейна), значения вблизи глаза страдают от Z-борьбы из-за отсутствия точности 32-битных операций с плавающей запятой.
Лучший способ решить эту проблему - использовать «логарифмический буфер глубины»
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
Логарифмический буфер глубины улучшает точность буфера глубины для удаленных объектов, используя логарифмическое распределение для zscreen. Он меняет точность для близких объектов на точность для удаленных объектов. Поскольку мы выполняем рендеринг методом LOD, для удаленных объектов требуется меньшая точность, поскольку у них меньше треугольников.
Важно отметить, что все перечисленные методы (за исключением проективной сетки) очень хороши при выполнении физики (в основном, столкновений) благодаря базе Quadtree, что является обязательным условием, если вы планируете создать игру.
В заключение, просто проверьте все доступные варианты и выберите тот, который вам удобнее, на мой взгляд, CDLOD отлично работает. Не забудьте решить проблемы с джиттером и Z-буфером, и самое главное: получайте удовольствие, делая это!
Для получения дополнительной информации о LOD проверьте эту ссылку .
Для полной демонстрации о сферизации куба проверьте эту ссылку .
Для более подробного объяснения решения проблем дрожания и точности Z-буфера, обратитесь к этой книге .
Я надеюсь, что вы найдете этот небольшой обзор полезным.