2011-02-23 20 views
8

Comencé a usar la biblioteca GLM para realizar operaciones matemáticas sobre OpenGL 3 y GLSL. necesito una proyección ortográfica para dibujar gráficos 2D, por lo que writed este código simple:¿Orden incorrecto de valores de matriz en glm?

glm::mat4 projection(1.0); 
projection = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 500.0f); 

impresión en pantalla los valores que GLM :: orto ha creado me sale:

0.00313 0.00000 0.00000 0.00000 
0.00000 -0.00417 0.00000 0.00000 
0.00000 0.00000 -0.00200 0.00000 
-1.00000 1.00000 -1.00000 1.00000 

Como sé este no es el orden correcto para los valores en OpenGL, ya que multiplicar esta matriz por un vector de posición ignorará todos los valores de traducción.

He probado esa matriz con mi sombreador y algunas primitivas y solo obtengo una pantalla en blanco. Pero si puedo modificar manualmente la matriz de la siguiente funciona bien:

0.00313 0.00000 0.00000 -1.00000 
0.00000 -0.00417 0.00000 1.00000 
0.00000 0.00000 -0.00200 -1.00000 
0.00000 0.00000 0.00000 1.00000 

Por otra parte, mirando a la función "orto" en el archivo "GLM/GTC/matrix_transform.inl":

template <typename valType> 
inline detail::tmat4x4<valType> ortho(
    valType const & left, 
    valType const & right, 
    valType const & bottom, 
    valType const & top, 
    valType const & zNear, 
    valType const & zFar) 
{ 
    detail::tmat4x4<valType> Result(1); 
    Result[0][0] = valType(2)/(right - left); 
    Result[1][1] = valType(2)/(top - bottom); 
    Result[2][2] = - valType(2)/(zFar - zNear); 
    Result[3][0] = - (right + left)/(right - left); 
    Result[3][1] = - (top + bottom)/(top - bottom); 
    Result[3][2] = - (zFar + zNear)/(zFar - zNear); 
    return Result; 
} 

he sustituido las últimas 3 líneas de inicialización por el siguiente código y también trabajó bien:

Result[0][3] = - (right + left)/(right - left); 
    Result[1][3] = - (top + bottom)/(top - bottom); 
    Result[2][3] = - (zFar + zNear)/(zFar - zNear); 

se trata de un vertex shader mínima que estoy usando para la prueba (nótese que en este momento el uni_MVP es sólo el projecti en la matriz explicada anteriormente):

Creo que esto no es un error, porque todas las funciones funcionan de la misma manera. Tal vez es un problema de mi compilador de C++ que invierte el orden de las matrices multidimensionales? ¿Cómo puedo resolver esto sin modificar todo el código fuente de GLM?

Estoy utilizando la última versión de la biblioteca GLM (0.9.1) con Code :: Blocks y MinGW ejecutándose en Windows Vista.

Respuesta

22

Primero, se llama transposición, no inversión. La inversión significa algo completamente diferente. En segundo lugar, así es exactamente como debería ser. OpenGL accesos matrices en columna de orden mayor, es decir, los elementos de la matriz tienen que siguientes índices:

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 

Sin embargo su usual C/matrices multidimensionales C++ que número normalmente como este:

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15 

es decir, índices de fila y de columna están transpuestos Las versiones anteriores de OpenGL tenían alguna extensión que permite suministrar matrices en forma transpuesta, para evitar que las personas reescriban su código. Se llama GL_ARB_transpose_matrixhttp://www.opengl.org/registry/specs/ARB/transpose_matrix.txt

Con shaders es aún más fácil que tener que utilizar las nuevas funciones. glUniformMatrix tiene un parámetro GLboolean transpose, tienes 3 conjeturas de lo que hace.

+0

Gracias, datenwolf! Se corrigió cambiando el parámetro de transposición en glUniformMatrix :) – Dani

Cuestiones relacionadas