Наконец, после многих исследований я могу заключить, что, как сказал кто-то раньше, нет универсального «лучшего» метода. Но мои исследования привели меня к познанию следующих вещей:
В зависимости от сетки вы, наконец, использовать:
- Spherified Кубик: любой метод LOD с реализацией дерева квадрантов будет работать нормально, вы просто должны заботиться о специальных случаях, таких как границы между лицами, в каждом случае ваш квадрант должен иметь указатель на соседа на прилегающем лице на каждом уровне.
- Любые другие: Я думаю, что ROAM (более новая версия 2.0 или любое другое расширение как BDAM, CABTT или RUSTIC), однако эти алгоритмы с трудом работают, требуют больше памяти и немного медленнее, чем другие апробации с кубами.
Есть много методов LOD, которые могут поместиться хорошо, но мой личный топ 5 являются:
- Continous Distance-Dependent LOD (CDLOD)
- GPU Based Geomety Clipmaps (GPUGCM)
- Chunked LOD
- Rendering Terrains с OpenGL GPU тесселяции (Book: OpenGL Insight, глава 10)
- Geometrical MipMapping
Каждый из них предлагает уникальный способ рендеринга ландшафтов, например, CDLOD имеет очень легкую реализацию с использованием шейдеров (GLSL или HLSL), но также может быть реализован на процессоре (для устаревшего оборудования), однако цель на планете Рендеринг - это взорвать лучшее на современных графических процессорах, поэтому GPUGCM является лучшим, когда вы хотите сжать свой GPU. Они оба отлично работают с основанными на данных, процедурными или смешанными (рельеф на основе фиксированных данных или карт высот и деталей, дополненных процедурной работой) рендеринга больших территорий.
Также существует сферическое расширение основного метода геометрических Clipmaps, но имеет некоторые проблемы, поскольку плоские образцы карты высот должны быть параметризованы с использованием сферических координат.
Chunked LOD, с другой стороны, идеально подходит для устаревшего оборудования, не требует каких-либо вычислений на стороне графического процессора, он идеально подходит для больших наборов данных, но не может обрабатывать процедурные данные в реальном времени (возможно, с некоторыми изменениями, это могло бы быть)
Использование Tessellation shaders - еще одна техника, очень новая, поскольку OpenGL 4.x вышел, на мой взгляд, он может быть лучшим, но мы говорим о Planet Rendering, мы сталкиваемся с проблемой, что другие методы может справиться очень легко, и это касается точности.
Если вы не хотите, чтобы ваша точность была равна 1 км между вершинами, перейдите к шейдерам Tessellation. Проблема с действительно большими площадями с этим методом заключается в том, что дрожание трудно решить (или, по крайней мере, для меня, поскольку я новичок в тесселяционных шейдерах).
Geomipmapping - отличная техника, использует квадранты и имеет невысокую проецируемую пиксельную ошибку, но для планетарного рендеринга вам потребуется установить не менее 16 уровней детализации, это означает, что вам понадобится (для сшивания выливается) некоторые дополнительные патчи для соединения разных уровней и ухода за уровнем вашего соседа, это может быть утомительным для решения, особенно с использованием 6 поверхностей.
Существует еще один способ, очень свойственный: "Projective Grid Mapping for Planetary Terrain" отлично подходит для визуализации, но имеет свои недостатки, если вы хотите узнать больше, перейдите по ссылке.
Проблема:
джиттер: Большинство современных графических процессоров поддерживает только значение с плавающей точкой 32-битовой, которые не обеспечивают достаточную точности для манипулирования больших позиций в планетарном масштабе местности. Джиттер происходит, когда зритель приближается и вращается или перемещается, затем многоугольники начинают возвращаться назад и вперед.
Лучшим решением для этого является использование «Оказание относительно глаз с использованием метода GPU». Этот метод описан в книге «3D Engine Дизайн для виртуальных глобусов» (я уверен, вы можете найти его в Интернете aswell), где в основном вы должны установить все свои позиции с помощью удвоений на CPU (исправления, клики , объекты, фруст, камера и т. д.) , а затем MV центрируется вокруг зрителя, установив его перевод в (0, 0, 0) T и удваивает кодирование в виде фиксированной точки с использованием доли (мантиссы) бит двух поплавков, низкий и высокий по некоторому методу (читайте об использовании реализации Ohlarik и библиотеки DSFUN90 Fortran).
Хотя вершинный шейдер требует только дополнительных двух вычитаний , и одно дополнение, GPU RTE удваивает количество вершин буферной памяти, необходимой для позиций. Это не обязательно удваивает требования к памяти, если не сохранены только позиции.
Глубина буфера Точность: Z-борьба. Поскольку мы создаем очень большие ландшафты, в данном случае: планеты, Z-буфер должен быть ОГРОМНЫМ, но неважно, какие значения вы задали для znear и zfar, всегда будут проблемы.
В качестве Z-буфера зависит от интервала точки поплавка, а также это линейного (хотя проекция в перспективе не является линейным) значениями вблизи Глаз страдают от Z-боевых действий, поскольку отсутствие точности 32-битного поплавков иметь.
Лучший способ решения этой проблемы заключается в использовании «логарифмическая глубина буфера» http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
логарифмическая буфер глубины повышает глубину буфер точность для удаленных объектов с использованием логарифмического распределения для ZScreen. Он торгует точностью для близких объектов для точности для удаленных объектов. Поскольку мы выполняем рендеринг с помощью метода LOD, для дальних объектов требуется меньше точности , потому что у них меньше треугольников.
Что-то важно отметить, что все методы перечислены (для проективной сетки, за исключением) очень хороши при выполнении физических (столкновений в основном) из-за базы квадрадерева, то есть что-то обязательным, если вы планируете сделать игра.
В заключение, просто проверьте все доступные варианты и пойдите для того, чтобы вы чувствовали себя более комфортно, на мой взгляд, CDLOD отлично справляется. Не забудьте решить проблемы с дрожанием и Z-буфером, и самое главное: получайте удовольствие от этого!
Для получения дополнительной информации о проверке LOD this link.
Для полной демонстрации о сферической проверке куба this link.
Для получения более подробного объяснения относительно решения проблем дрожания и Z-буфера, проверьте this book.
Надеюсь, вы найдете этот небольшой обзор полезным.
Поплавки довольно точные. Какая точность вам нужна? –
ну, я получил объяснение здесь http://www.opentk.com/node/491, поэтому я думаю, что часть решена: D – nosmirck