Finalmente, después de mucho investigar, puedo concluir que, como alguien dijo antes, no existe un método universalmente "mejor". Pero mi investigación me llevó al conocimiento de las siguientes cosas:
Dependiendo de la malla que finalmente usará:
- Cubo Esferificado: cualquier método LOD con implementación de quadtree funcionará bien, solo debe tener cuidado con casos especiales como bordes entre caras, en cuyo caso, su quadtree debe tener un puntero al vecino en la cara adyacente en cada nivel.
- Cualquier otro: creo que ROAM (versión más nueva 2.0 o cualquier otra extensión como BDAM, CABTT o RUSTIC) funcionará bien, sin embargo, estos algoritmos son difíciles de trabajar, requieren más memoria y son un poco más lentos que otros enfoques con cubos.
Hay muchos métodos LOD que pueden encajar bien, pero mis 5 mejores personales son:
- LOD dependiente de la distancia continua (CDLOD)
- Geomety Clipmaps basado en GPU (GPUGCM)
- LOD fragmentado
- Representación de terrenos con teselación de GPU OpenGL (Libro: OpenGL Insight, Capítulo 10)
- Mapeo Geométrico
Cada uno ofrece una forma única de renderizar terrenos, por ejemplo, CDLOD tiene una implementación muy fácil usando sombreadores (GLSL o HLSL) pero también puede implementarse en la CPU (para hardware heredado), sin embargo, el objetivo en Planet Rendering es explotar el mejor en las GPU modernas, por lo que GPUGCM es la mejor cuando desea exprimir su GPU. Ambos funcionan muy bien con renderizado basado en datos, procesal o mixto (terreno basado en datos fijos o mapas de altura y detalles agregados con el trabajo procesal) de grandes terrenos.
También existe la extensión esférica al método básico de mapas geométricos de clip, pero tiene algunos problemas porque las muestras planas del mapa de altura deben parametrizarse mediante coordenadas esféricas.
El LOD fragmentado, por otro lado, es perfecto para hardware heredado, no necesita ningún cálculo secundario de GPU para funcionar, es perfecto para grandes conjuntos de datos pero no puede manejar datos de procedimiento en tiempo real (tal vez con algunas modificaciones, podría)
Usar sombreadores de teselación es otra técnica, muy nueva, ya que OpenGL 4.x salió, en mi opinión, podría ser el mejor, pero, estamos hablando de Planet Rendering, nos encontramos con un problema que otros métodos pueden manejar muy fácilmente y es sobre precisión
A menos que solo desee que su precisión sea de 1 km entre vértices, busque sombreadores de teselación. El problema con los terrenos realmente grandes con este método es que la fluctuación es un poco difícil de resolver (o al menos para mí, ya que soy nuevo en los sombreadores de teselación).
Geomipmapping es una gran técnica, aprovecha el quadtree y tiene un error de píxel proyectado bajo, pero, para el renderizado planetario, deberá establecer al menos más de 16 niveles de detalles, eso significa que necesitará (para unir propósitos) algunos parches adicionales para conectar diferentes niveles y cuidar el nivel de tu vecino, esto puede ser tedioso de resolver, especialmente usando 6 caras del terreno.
Hay otro método, muy particular en sí mismo: "Mapeo de cuadrícula proyectiva para terreno planetario" excelente para la visualización, pero tiene sus desventajas, si desea saber más, vaya al enlace.
Problemas:
Jitter : la mayoría de las GPU actuales solo admiten valores de punto flotante de 32 bits, lo que no proporciona suficiente precisión para manipular grandes posiciones en terrenos de escala planetaria. La fluctuación se produce cuando el espectador se acerca y gira o se mueve, luego los polígonos comienzan a rebotar hacia adelante y hacia atrás.
La mejor solución para esto es usar el método "Representación relativa al ojo usando la GPU". Este método se describe en el libro "Diseño de motores 3D para globos virtuales" (estoy seguro de que también puede encontrarlo en Internet) en el que básicamente debe establecer todas sus posiciones con dobles en la CPU (parches, mapas de clip, objetos, frustrum, cámara, etc.) y luego MV se centra alrededor del espectador configurando su traducción a (0, 0, 0) T y los dobles se codifican en una representación de punto fijo usando los bits de fracción (mantisa) de dos flotadores, bajo y alto por algún método (lea sobre el uso de la implementación de Ohlarik y la biblioteca DSFUN90 Fortran).
Aunque el sombreador de vértices requiere solo dos sustracciones adicionales y una adición, GPU RTE duplica la cantidad de memoria de búfer de vértices requerida para las posiciones. Esto no duplica necesariamente los requisitos de memoria a menos que solo se almacenen las posiciones.
Profundidad Buffer Precisión : Z-fighting. Como estamos renderizando terrenos muy grandes, en este caso: planetas, el búfer Z debe ser ENORME, pero no importa qué valores establezca para znear y zfar, siempre habrá problemas.
Como el Z-buffer depende de un intervalo de coma flotante, y también es lineal (aunque la proyección en perspectiva no es lineal) los valores cercanos al ojo sufren de Z-fighting debido a la falta de precisión de los flotadores de 32 bits.
La mejor manera de resolver este problema es utilizar un "Buffer de profundidad logarítmica"
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
Un búfer de profundidad logarítmico mejora la precisión del búfer de profundidad para objetos distantes mediante el uso de una distribución logarítmica para zscreen. Cambia la precisión por objetos cercanos por la precisión por objetos distantes. Dado que estamos renderizando con un método LOD, los objetos lejanos requieren menos precisión porque tienen menos triángulos.
Algo importante que mencionar es que todos los métodos enumerados (excepto la cuadrícula proyectiva) son muy buenos al hacer física (colisiones en su mayoría) debido a la base Quadtree, eso es algo obligatorio si planea hacer un juego.
En conclusión, simplemente verifique todas las opciones disponibles y elija la que le resulte más cómoda, en mi opinión, CDLOD hace un gran trabajo. No olvides resolver los problemas de jitter y Z-buffer, y lo más importante: ¡diviértete haciéndolo!
Para obtener más información sobre LOD, consulte este enlace .
Para obtener una demostración completa sobre la esferificación de un cubo, consulte este enlace .
Para obtener una mejor explicación sobre la resolución de la fluctuación de fase y las precisiones de Z-Buffer, consulte este libro .
Espero que encuentre útil esta pequeña reseña.