2010-12-30 61 views
10

Simplemente no entiendo para qué sirve OpenGL glMatrixMode.¿Por qué hay un glMatrixMode en OpenGL?

Por lo que yo puedo ver, cuando glMatrixMode(GL_MODELVIEW) se llama, que es seguido por glVertex, glTranslate, glRotate y similares, es decir, los comandos de OpenGL que lugar algunos objetos en algún lugar en el espacio . Por otro lado, si se llama a glOrtho o glFrustum o gluProjection (es decir, cómo los objetos ubicados son representados), tiene una llamada anterior de glMatrixMode(GL_PROJECTION).

Creo que lo que he escrito hasta ahora es una hipótesis en la que alguien va a probar me malinterpreten, pero no es el puntode utilizar diferentes modos de Matrix s exactamente porque hay diferentes tipos de GL-funciones : aquellos preocupados con colocando objetos y aquellos con la forma en que se renderizan los objetos?

+6

Tenga en cuenta que esto ya ha quedado obsoleto y que debe utilizar sombreadores y uniformes explícitos solamente, a partir de OpenGL 3.1. Por ejemplo, OpenGL ES 2.0 no es compatible con glMatrixMode() y similar. (Bueno, por supuesto, a menos que tenga un montón de código que hace esto y/o necesita soportar hardware/controladores antiguos). – Macke

+4

Y 'glVertex' debería haberse considerado obsoleto desde OpenGL 1.0. :) – Kos

+4

Cuando mencionas algo como obsoleto, menciona también cuál es el reemplazo moderno, porque sin eso no es muy informativo. – SasQ

Respuesta

18

Esto es simple y se puede responder muy brevemente:

  • vértices de reproducción (como en glVertex) depende del estado actual de matrices denominadas "modelo-vista matriz" y "matriz de proyección",

  • Los comandos glTranslatef, glPushMatrix, glLoadIdentity, glLoadMatrix, glOrtho, gluPerspective y toda la familia afecta la matriz actual (que es cualquiera de los anteriores),

  • El comando glMatrixModeselecciona la matriz (modelo-vista o proyección) que es afectado por los comandos antes mencionados.

(Además, también existe la matriz de textura utilizado para las coordenadas de texturas, pero se usa rara vez.)

Así que el caso de uso común es:

  • tienen la matriz modelo-vista activa la mayoría de las veces,
  • siempre que tenga que inicializar la matriz de proyección (generalmente al principio o cuando la ventana cambie de tamaño, quizás), cambie el activo a proyección, configure una perspectiva y vuelva a la vista modelo.
+0

Siempre debe volver a establecer (es decir, restablecer una nueva) la matriz de proyección cada vez que atraviesa un pase de visualización completo. Deberás usar varias proyecciones diferentes para cualquier aplicación del mundo real de todos modos. Por ejemplo, para renderizar un HUD en un juego, usarías alguna otra proyección, que para la escena propiamente dicha. OpenGL no conoce la "inicialización" más que obtener el contexto, así que por favor, olvídate de hacer cosas de una sola vez en alguna parte, o de hacer ese estúpido patrón configurando la proyección en el controlador de cambio de forma. – datenwolf

+0

@datenwolf - Es cierto, pero push/popMatrix en la matriz de proyección para superposiciones 2D funciona igual de bien, por lo que no es realmente una gran diferencia. – Kos

+0

Lo extraño es que no puedo imaginarme cómo 'glOrtho' o' gluPerspective' podrían usarse para nada más que la matriz de proyección, y 'glTranslate',' glRotate' y otras transformaciones para usar en la matriz de proyección, entonces ¿por qué no las funciones para configurar la proyección, ¿seleccionan la matriz de proyección internamente? Ahorraría a los usuarios un poco de dolor de cabeza y sería más idiota a prueba, supongo. Las funciones que pueden invocarse en cualquiera de las matrices, aún podrían usar la selección de modo como antes. – SasQ

2

Todas las coordenadas geométricas experimentan varias transformaciones lineales en secuencia. Si bien cualquier transformación lineal puede expresarse mediante una única matriz, a menudo se desea pensar en una secuencia de transformaciones y editar la secuencia, y si solo se tiene una matriz única, solo se pueden cambiar los extremos de esa secuencia. Al proporcionar varios pasos de transformación, OpenGL te ofrece varios lugares en el medio donde también puedes cambiar la transformación.

Llamar a glMatrixMode antes de emitir geometría no tiene ningún efecto. Llama al glMatrixMode antes de editar la matriz de transformación, para determinar en qué parte de la secuencia general aparecen esas ediciones.

(NB: En cuanto a la secuencia tiene mucho más sentido si se recuerda que la traducción y la rotación no son conmutativas, porque la traducción cambia el centro de rotación Del mismo modo la traducción y la escala no son conmutativas..)

4

Puede utilice glRotate y glTranslate para matrices de proyección también.

También: OpenGL admite transformaciones de texturas y colores. Si activa esta función, puede, por ejemplo, modificar las coordenadas de textura de un objeto sin reescribir las coordenadas de textura de cada cuadro (lento).

Esta es una característica muy útil si desea desplazar una textura por un objeto. Todo lo que tiene que hacer para esto es dibujar el objeto texturizado, establecer el modo matriz en GL_TEXTURE y llamar a glTranslate para establecer el desplazamiento en la textura.

+2

Además, las matrices de textura proyectivas vienen en uso con sombras y texturas proyectadas (focos de escenario, focos, disco, proyectores de películas, etc.) ... – Macke

3

Como señaló Nils, tienes más en las matrices que solo lo que has mencionado.

Voy a añadir un par de pensamientos:

  • núcleo de OpenGL (de 3.1 en adelante) elimina todo el material de la matriz por completo, lo mismo ocurre con GL ES 2.0. Esto se debe simplemente al hecho de que los programas de sombreado eliminaron gran parte del requisito de tenerlos expuestos en el nivel de GL (aún así es una conveniencia). Entonces solo tiene uniformes y debe calcular su valor por completo en el lado del cliente.

  • Existen más puntos de entrada de manipulación de matrices que los que usted menciona.Algunos de ellos se aplican igualmente bien a proyección/vista de modelo (glLoadIdentity/glLoadMatrix/glMultMatrix, Push/Pop). Son muy útiles si quiere realizar el cálculo de la matriz usted mismo (digamos porque los necesita en otro lugar en su aplicación).

+2

"Olvida todas estas cosas de la matriz" no es realmente preciso. La multiplicación de matrices sigue siendo la forma de aplicar transformaciones a las coordenadas de los vértices. La diferencia es que ya no es una función fija en la tubería, sino que está completamente controlada por sombreadores programables. –

Cuestiones relacionadas