matrices ejemplos apuntes animacion opengl glsl

apuntes - opengl ejemplos c++



¿Cómo se obtienen las matrices de proyección y proyección de modelos en OpenGL? (3)

Estoy intentando usar el Lenguaje de Sombreado de OpenGL (GLSL) versión 1.5 para crear sombreadores de vértices y geometrías.

Aprendí que en la versión 1.5 de GLSL, las variables gl_ModelViewProjectionMatrix como gl_ModelViewProjectionMatrix están en desuso, por lo que debe pasarlas manualmente. Si ya he configurado las matrices de proyección y proyección de modelos (utilizando gluLookAt y gluPerspective por ejemplo), ¿cómo puedo hacer que las matrices pasen al vértice y a los sombreadores de geometría? He hecho algunas búsquedas y algunos sitios parecen mencionar una función glGetMatrix() , pero no puedo encontrar esa función en ninguna documentación oficial, y no parece existir en la implementación que estoy usando (obtengo una compilación unknown identifier: glGetMatrix error unknown identifier: glGetMatrix cuando intento compilarlo con esa función).


Hey, vamos a reducir la velocidad un poco aquí :) Sí, es cierto que recibes la matriz por glGetFloatv(GL_MODELVIEW_MATRIX, ptr) ... ¡ Pero eso definitivamente no es lo que debes hacer aquí!

Dejame explicar:

En GLSL, las variables gl_ModelViewProjectionMatrix como gl_ModelViewProjectionMatrix o funciones como ftransform() están en desuso - eso es correcto, pero eso es solo porque toda la pila de la matriz está obsoleta en GL 3.x y se supone que debes usar tu propia matriz (o usar cualquier otra solución, una pila de matriz es útil, ¡pero no es obligatoria!).

Si aún está utilizando la pila de la matriz, confía en la funcionalidad de OpenGL 2.xo 1.x. Está bien, ya que todo esto aún se admite en las tarjetas gráficas modernas debido al perfil de compatibilidad GL. Es bueno cambiar a una nueva versión GL, pero puede quedarse con esto por ahora.

Pero si está usando una versión anterior de OpenGL (con matriz de matriz), también use una versión anterior de GLSL. Pruebe 1.2, porque las versiones superiores (incluida su 1.5) están diseñadas para ser compatibles con OpenGL3, donde cosas como las matrices de proyección o de vista modelo ya no existen en OpenGL y se espera que se pasen explícitamente como variables uniform definidas por el usuario si es necesario.

La correspondencia entre las versiones de OpenGL y GLSL solía ser un poco complicada (antes de que limpiaran la numeración de la versión para que coincidiera), pero debería ser más o menos similar a:

GL GLSL 4.1 - 4.1 4.0 - 4.0 3.3 - 3.3 3.2 - 1.5 3.1 - 1.4 3.0 - 1.3 2.x and lower - 1.2 and lower

Así que, para abreviar, los uniformes incorporados de Shader están en desuso porque la funcionalidad correspondiente en OpenGL también está en desuso; elija una versión superior de OpenGL o una versión inferior de GLSL.


Para obtener cualquiera de las matrices, usa las constantes GL_MODELVIEW_MATRIX o GL_PROJECTION_MATRIX con glGetxxxx:

GLfloat model[16]; glGetFloatv(GL_MODELVIEW_MATRIX, model);


float modelview[16]; glGetFloatv(GL_MODELVIEW_MATRIX, modelview);