Lo cual es más eficiente usando la pila de transformación de OpenGL o aplicando las transformaciones a mano.
A menudo escuché que debe minimizar el número de transiciones de estado en su canalización de gráficos. Empujar y reventar matrices de traducción parece un gran cambio. Sin embargo, me pregunto si la tarjeta gráfica podría más que compensar el hipo de la tubería mediante el uso de su hardware de ejecución en paralelo para multiplicar los vértices en masa.
Mi caso especifico. Tengo la fuente representada en una hoja de sprite. Las coordenadas de cada carácter o una cadena se calculan y se agregan a un búfer de vértices. Ahora necesito mover esa cuerda. ¿Sería mejor iterar a través del búfer de vértices y ajustar cada uno de los vértices a mano o empujar temporalmente una nueva matriz de traducción?
fuente
Respuestas:
Tengo entendido que en las versiones más recientes de la especificación (3.3 y 4.x) las pilas de matrices se han ido y usted necesita hacer un seguimiento de sus matrices de transformación a mano. Creo que esto también podría ser cierto para la especificación móvil (ES).
Si está buscando una forma coherente de manejar sus matrices a mano, podría estar interesado en GLM . Es una biblioteca matemática bastante ordenada (que incluye transformaciones matriciales) modelada a partir de la especificación GLSL, por lo que solo necesita mantener un conjunto de rutinas matemáticas en su cabeza cuando se trata de código OpenGL.
fuente
La pila es la opción menos óptima aquí, no porque empujarla y reventarla sea costosa, ya que nunca debería inducir un cambio de estado complejo a nivel del controlador (la matriz no debe enviarse a la tarjeta hasta que se emita un comando de renderizado) , por lo general, todo es manipulación del lado de la CPU en la API).
El problema con la pila es que tiene un límite de cuán lejos puede empujarlo; creo que es uno de los parámetros a los que puede llegar a través de glGet *. No hay una gran ventaja en usar la pila a menos que no tenga o sea incapaz / no desee escribir matemática matricial. Yo recomendaría hacerlo tú mismo.
No sé cuál es el estado de las funciones de pila en el GL moderno. Creo que también han sido desaprobados / eliminados, pero no he tenido la necesidad de usar GL por un tiempo, así que no me he mantenido tan actualizado.
fuente
Como otros han señalado, la pila de matriz está saliendo, lo cual es una buena razón para investigar alternativas.
En uno de mis proyectos, utilicé las operaciones de matriz de OpenGL para calcular mis matrices, pero terminé teniendo que usar las funciones glGet para recuperar la matriz y poder hacer algunas operaciones en la matriz que las propias funciones de OpenGL no admitían. El rendimiento fue abismal, y rastreé la pérdida hasta la única función glGet. Es posible que las operaciones matriciales se realicen en la GPU de alguna manera, y el uso de glGet provocó el enjuague de la tubería, o algo así.
Cualquiera sea la razón, reemplacé las operaciones matriciales con CML , la biblioteca matemática configurable y el rendimiento mejoró drásticamente. No solo ya no estaba sujeto a las métricas de rendimiento de las operaciones de matriz de OpenGL, CML también incluía toneladas de operaciones que OpenGL no admite.
E implementar una pila de matrices es bastante fácil usando el vector STL o algo así.
fuente
No estoy seguro de su nivel de experiencia, pero recomendaría hacerlo a mano. Puede tomar más esfuerzo aprender cómo hacer esto, pero es inmensamente beneficioso saber qué están haciendo sus matrices y poder manipularlas usted mismo. También lo hará más consciente de los problemas que pueden surgir al aplicar matrices en diferentes órdenes (por ejemplo, escalar y rotar). Sé que pasé muchas horas tratando de descubrir "errores" de renderización extraños antes de decidir que sería mejor dedicar mi tiempo a estudiar a fondo qué estaba haciendo cada operación. Vale la pena la inversión.
Abordar su problema específico, aplicar una transformación a los vértices parece la forma más fácil, solo tenga en cuenta el orden de las operaciones de las matrices.
fuente
El principal problema que veo es que necesitas acceder a los resultados para otras tareas del juego y acceder a esos resultados puede ser complicado y lento.
Es por eso que prefiero hacer esas operaciones matriciales yo mismo.
fuente