Pregunta

Hola chicos, estoy renderizando una geometría antigua de un juego antiguo.Su cliente tenía algún algoritmo que les permitía ver qué áreas estaban cercanas, pero yo no tengo esa capacidad, así que estoy estudiando la posibilidad de eliminar los polígonos innecesarios.Actualmente, estoy renderizando cada polígono en toda la zona independientemente de si puedo verlo o no, independientemente de si está dentro del alcance visual.Obviamente esto es completamente ineficiente.Mi pregunta:

¿Qué tipo de selección debería considerar utilizar?Sé que puedo seleccionar polígonos que no están en el tronco y eso ayudará a aliviar parte de la carga, pero ¿podría decir elegir no renderizar polígonos que estén a cierta distancia de la cámara?¿Como se llama esto?También estoy usando niebla en algunas de las áreas.La misma pregunta va.¿Puedo encontrar una manera de seleccionar todo lo que está detrás de la niebla, el área que no puedo ver?

Gracias:una captura de pantalla de este trabajo en progreso.Algunas personas pueden reconocerlo :) Además, ignore los colores feos para las hojas.No he tenido en cuenta el enmascaramiento alfa.

Imagen: http://i.stack.imgur.com/duc2I.png

¿Fue útil?

Solución

Hay dos cosas diferentes a considerar:¿Solo quieres verlo correctamente, es decir?¿eliminación de superficies ocultas?Entonces unas simples pruebas de profundidad bastarán;el inconveniente es que procesas geometría que no aparece en la pantalla en absoluto.Sin embargo, si tomaste los datos de un juego (muy) antiguo, es muy probable que un mapa completo con todos sus activos tenga menos polígonos que los que se ven en los juegos modernos en una pantalla completa.En ese caso, no tendrá ningún problema de rendimiento.

Si realmente tiene problemas de rendimiento, necesitará encontrar un equilibrio entre cuánto tiempo desea dedicar, determinar qué es (no) visible y renderizarlo.Hace 10 años, todavía era crucial tener casi píxeles perfectos para ahorrar el mayor tiempo posible de rasterización.Las GPU modernas tienen tanta energía extra que basta con hacer una selección aproximada de qué incluir en el renderizado.

Sin embargo, estos cálculos están completamente fuera del alcance de OpenGL o de cualquier otra API de rasterización 3D (p. ej.Direct3D): su tarea es simplemente dibujar triángulos en la pantalla utilizando sofisticados métodos de rasterización;no hay gestión de objetos ni funciones de nivel superior.Así que depende de usted implementar esto.

El enfoque típico es utilizar una estructura de subdivisión espacial.Los más populares son árboles kd, octrees y árboles BSP.Los árboles BSP son espacialmente muy eficientes, pero más pesados ​​en cálculo.Personalmente prefiero un híbrido/combinación de árbol Kd y octree, ya que son fáciles de modificar para seguir los cambios dinámicos en la escena.Los árboles BSP son mucho más difíciles de actualizar (normalmente requiere un nuevo cálculo completo).

Dada esta estructura espacial, es muy fácil determinar si un punto se encuentra en una región de interés específica.También es muy sencillo seleccionar nodos en el árbol mediante restricciones geométricas, como planos.Esto hace que la implementación de una selección frustum gruesa sea muy fácil:Se utilizan los planos de recorte frustum para seleccionar todos los nodos del árbol dentro de los planos.Para facilitar la vida de las GPU, es posible que desee ordenar los nodos de cerca a lejos;Nuevamente, la estructura de árbol le ayuda en ese sentido, ya que puede ordenar el árbol de forma recursiva, lo que da como resultado una complejidad O(n log(n)) casi óptima.

Si aún necesita mejorar el rendimiento de renderizado, puede usar las divisiones espaciales definidas por el árbol para renderizar (de forma invisible) la geometría de prueba en un consulta de oclusión, antes de recurrir al subárbol limitado por los límites probados.

Otros consejos

Sé que puedo sacrificar polígonos no en el frustum y eso ayudará a aliviar parte de la carga, pero ¿podría decir que no renderizará polígonos que estén a cierta distancia de la cámara? ¿Como se llama esto?

Esto ya está hecho por el frustum que yo mismo. El plano lejano estableció un límite de distancia de la cámara al objeto para que se represente.

Mira esto glfrustum.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top