Matriz de matriz de OpenGL vs multiplicación manual

8

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?

deft_code
fuente
Depende de la versión GL a la que se dirija. Están en desuso en 3.xy en adelante.
El pato comunista el

Respuestas:

7

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.

Bob Somers
fuente
¿Alguien puede confirmar esto? Aprendí programación de gráficos con OpenGL 1.5 y pensé que estaba avanzado porque estaba experimentando con algunas de las características 2.0. Se podría decir que estoy un poco fuera de lugar. Dejar caer el soporte para las matrículas de traducción parece ser una gran desventaja.
deft_code el
1
Solo revisé dos veces. Sí, las pilas de matriz están en desuso en 3.0 - 3.2, y se eliminan en 3.3 y 4.x. La idea es que, dado que toda la tubería se ha vuelto programable, simplemente pasará su matriz final a su sombreador y partirá desde allí. Sin embargo, no hay nada que te impida seguir con OpenGL 2.0. Toda la funcionalidad de pila de matriz a la que está acostumbrado seguirá estando allí.
Bob Somers
Tenga en cuenta que eso no significa que se haya eliminado el "soporte para matrices de traducción", @deft_code. Una matriz de traducción es solo un conjunto particular de valores de coma flotante, después de todo, puede construir uno trivialmente usted mismo. En realidad, se trata más del área de "álgebra lineal" que del acceso a la tubería de gráficos: tenga en cuenta que D3D tampoco tiene funciones análogas (están en una biblioteca de utilidades separada, D3DX).
1
Ligera adición: GLES 1.x es el análogo de funcionalidad fija de OpenGL 1.5 (ish) e incluye la textura, la vista del modelo y las pilas de proyección. GLES 2.x es el OpenGL embebido totalmente programable y no incluye las operaciones matriciales, ni ninguna de las demás funciones fijas. Entonces, en GLSL tampoco hay gl_Vertex / Normal / Color / etc. La forma en que transfiere información a un programa de sombreado depende totalmente de usted.
Tommy
3

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
3

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í.

Jari Komppa
fuente
2

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.

kaunartist
fuente
1

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.

bcsanches
fuente