2011-10-19 12 views
6

Recientemente he estado jugando bastante con OpenGL, y he encontrado la diferencia entre permitir que OpenGL administre las matrices de visualización/modelo/proyección o administrarlas usted mismo, ya sea con su propia implementación matricial o una biblioteca como GLM. He visto que muchos proyectos grandes tienen su propia gestión de cámara (es decir, gestionan sus propias traducciones, rotaciones, etc.). Puedo ver por qué sería útil asegurarse de tener el control total del sistema, pero además de esto, parece que hay mucho trabajo para obtener una ganancia marginal.¿Por qué es mejor administrar explícitamente matrices en OpenGL?

¿Por qué es mejor hacer su propia gestión que utilizar las funciones integradas de OpenGL? Obviamente, esto es en el contexto de una interconexión de sombreado, no la función fija predeterminada.

(Esto se aplicaría a cualquier biblioteca 3D).

+5

Voy a abstenerme de votar negativamente, pero en general no me gustan las preguntas sobre el formulario "¿Por qué es mejor hacer X que Y?" que presuponen que una forma es mejor que la otra. Si no sabe el * por qué *, probablemente tampoco esté calificado para saber * cuál * es mejor. Una mejor redacción sería "¿Por qué [algunas personas] abogan por usar X en lugar de Y?" –

+0

La razón por la que lo expresé de esta manera es porque todo lo que he visto sugiere que es mejor hacerlo explícitamente, y no ha habido contrapuntos. Sé que es un argumento inductivo terrible, pero supuse que llamaría más la atención. sin embargo, estoy de acuerdo con tu punto, +1 – jli

Respuesta

7

(Dicho sea de paso, OpenGL ES 2 no ha de transformar instalación de gestión, por lo que en algunos casos no tiene otra opción.)

Más sobre el punto, he encontrado el manejo de matrices a través de OpenGL incorporado en la matriz de pilas de ser un verdadero dolor a veces, forzándome a empujar y explotar copiosamente en las partes más intrincadas de mi código de representación, incluso reordenando el renderizado a veces solo para simplificar la administración de la pila. También escribí una clase C++ empujador-popper que usa RAII para administrar todo esto automáticamente, pero requiere un alcance cuidadoso de las variables locales.

Cuando cambié a ES 2, me consternó saber que toda esa funcionalidad había desaparecido. Sin embargo, descubrí que cambiar a mis propias matrices en realidad simplificaba mi código, porque podía trabajar con múltiples transformaciones usando una combinación de variables locales y miembros (con nombres significativos) sin perderse en el espacio, y la pila de transformación era reemplazada principalmente por el uso la pila de llamadas, es decir, la transformación actual es una variable de matriz local que pasa como parámetro de transformación principal a la siguiente función inactiva, pero con la flexibilidad de hacerlo de manera diferente en otros momentos.

+0

+1, buenos puntos, esperaré por más respuestas potenciales antes de aceptar. – jli

1

La pila de matriz administrada por GL está en desuso en las últimas revoluciones. de la especificación OpenGL. De modo que seguir adelante administrándolos usted mismo es la opción solamente.

3

Es mejor para una gran lista de razones. La reciente presentación de Apple sobre las mejoras de OpenGL en OSX Lion lo dice mejor: las especificaciones más nuevas de OpenGL (principalmente 3.2 en adelante) se enfocan mejor en representar lo que realmente está haciendo la GPU. En OpenGL 2.1, todas las operaciones de la matriz tienen lugar en la CPU. Por lo tanto, no solo no hay un beneficio acelerado mágico para usar las matrices de GL, sino que está encerrado en un modelo completamente arbitrario de gestión de matrices: proyecciones & matrices de vista modelo solamente (para vértices), límites de tamaño de pila matriz, un conjunto limitado de operaciones matriciales , etc.

Cuando comienza a administrar sus propias matrices, comienza a ver por qué es mucho mejor. A medida que sus escenas se vuelven más complejas, comienza a ver la necesidad de más cachés de matriz (más allá de solo "proyección" y "vista de modelo"). Descubres oportunidades para construir funciones matriciales más útiles. Por ejemplo, ¿qué suena más agradable de usar? glRotatef(90.0f, 1.0f, 0.0f, 0.0f); o matrix.rotateX(90.0f);? ¡Siempre me molestaba tener que especificar el eje de rotación cada vez!

Al comenzar a reconocer la división entre las operaciones de la CPU y las operaciones de la GPU, apreciará administrar sus propias matrices.

+0

+1 Por mencionar que las operaciones antiguas de la matriz GL no se ejecutan mágicamente en la GPU. –

Cuestiones relacionadas