Pregunta

Estoy trabajando en un juego 2D. Imagina un avión XY y eres un personaje. A medida que su personaje camina, el resto de la escena aparece a la vista.

Imagine que el plano XY es bastante grande y que hay otros caracteres fuera de su vista actual.

Aquí está mi pregunta, con opengl, si esos objetos no se representan fuera de la vista actual, ¿consumen tiempo de procesamiento?

Además, ¿cuáles son algunos enfoques para evitar que se muestren partes de la escena que no están a la vista? Si tengo un cubo que está a 1000 unidades de mi posición actual, no quiero que se represente ese objeto. ¿Cómo podría haber opengl no renderizar eso.

Creo que el enfoque más fácil es calcular la posición y luego no dibujar ese cubo / objeto si está demasiado lejos.

¿Fue útil?

Solución

Si ha configurado su gráfico de escena correctamente, los objetos fuera de su campo de visión deben seleccionarse desde el principio en la tubería de visualización. Se requerirá una casilla de verificación en su código para verificar que el objeto sea invisible, por lo que habrá algo de procesamiento (pero no mucho).

Si organiza sus objetos en una jerarquía sensata, entonces podría eliminar grandes secciones de la escena con solo una casilla de verificación.

Otros consejos

Preguntas frecuentes de OpenGL en " Recorte, selección y pruebas de visibilidad " ; dice esto:

  

OpenGL no proporciona soporte directo para determinar si una primitiva dada será visible en una escena para un punto de vista dado. En el peor de los casos, una aplicación deberá realizar estas pruebas manualmente. La pregunta anterior contiene información sobre cómo hacer esto.

Sigue adelante y lee el resto de ese enlace, todo es relevante.

Normalmente, su aplicación debe realizar estas optimizaciones: OpenGL es, literalmente, solo la parte de representación y no realiza la gestión de objetos ni nada por el estilo. Si pasa datos para algo invisible, todavía tiene que transformar las coordenadas relevantes en el espacio de visualización antes de que pueda determinar que está completamente fuera de la pantalla o más allá de uno de sus planos de recorte.

Hay varias formas de eliminar objetos invisibles de la tubería. Verificar si un objeto está detrás de la cámara es probablemente la verificación más fácil y económica de realizar, ya que puede rechazar la mitad de su conjunto de datos en promedio con un cálculo simple por objeto. No es mucho más difícil realizar el mismo tipo de prueba contra la vista real frustrum para rechazar todo lo que no es visible en absoluto.

Obviamente en un juego complejo no querrás tener que hacer esto para cada pequeño objeto, por lo que es típico agruparlos, ya sea jerárquicamente (por ejemplo, no dispararías un arma si ya has determinado que no está representando el personaje que lo contiene), espacialmente (por ejemplo, dividiendo el mundo en una cuadrícula / quadtree / octree y rechazar cualquier objeto que sepa que está dentro de una zona que ya ha determinado que actualmente es invisible), o más comúnmente una combinación de ambos.

" el único movimiento ganador es no jugar "

Cada glVertex, etc. será un éxito en el rendimiento, independientemente de si finalmente se representa en la pantalla. La única forma de evitarlo es no dibujar (es decir, eliminar) objetos que nunca se representarán de todos modos.

El

método más común es tener un viendo el frustum atado a su cámara. Combine eso con un octtree o quadtree dependiendo de si su juego es 3d / 2d, por lo que no necesita verificar cada objeto del juego contra el tronco.

El controlador subyacente puede hacer algunos sacrificios detrás de escena, pero no puede depender de eso, ya que no es parte del estándar OpenGL. Tal vez el controlador de su computadora lo hace, pero tal vez el de otra persona (que podría ejecutar su juego) no lo hace. Lo mejor para ti es hacer tu propio sacrificio.

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