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.
Gracias, datenwolf! Se corrigió cambiando el parámetro de transposición en glUniformMatrix :) – Dani