2012-09-01 18 views
14

Recientemente pensé que sería una buena idea cambiar de la funcionalidad anterior (en desuso) que proporciona OpenGL, como las operaciones de matriz y la interconexión de funciones fija.¿Es glm :: ortho() realmente incorrecto?

Estoy utilizando GLM como mi biblioteca de matriz para simplificar un poco las cosas. El problema es que puede haber causado más problemas de los que simplificó ...

Las proyecciones de perspectiva funcionaban bien con mis sombreadores y la configuración, pero cuando traté de cambiar a ortogonal, todo se rompió. Mis puntos y quads simples no se mostrarían. Cuando utilicé las viejas matrices OpenGL, las cosas comenzaron a funcionar nuevamente.

Lo reduje todo a la matriz de proyección. Así es como yo lo llamaba:

glm::mat4 projMat = glm::ortho(0, 400, 0, 400, -1, 1); 

comparé que a la suministrada por OpenGL una vez que esto se llama"

glOrtho(0, 400, 0, 400, -1, 1); 

Las únicas diferencias son el [0] [0] elemento y [1 ] [1] elemento (que, hasta donde yo sé, es igual a "2/ancho" y "2/alto", respectivamente). De la matriz OpenGL, los valores fueron exactamente eso! Sin embargo, en la matriz glm los valores fueron 0.

Una vez que cambié manualmente los valores de la matriz glm después de llamar a glm :: orto, ¡todo estaba funcionando de nuevo!

Así que mi pregunta: ¿la función glm :: ortho() está realmente rota, o simplemente la estoy usando mal?

Respuesta

39

No parece que debe ser roto a partir del código fuente (v 0.9.3.4)

template <typename valType> 
GLM_FUNC_QUALIFIER 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; 
} 

Mi único pensamiento es que esta plantilla podría ser la creación de una matriz de números enteros (como se haya pasó todas las entradas a la función) y, por lo tanto, hace la división de enteros en lugar del punto flotante. ¿Puedes intentar anexar .f a todos tus parámetros?

glm::mat4 projMat = glm::ortho(0.f, 400.f, 0.f, 400.f, -1.f, 1.f);

+7

¡Wow, usted estaba en la punta! Después de cambiar mis parámetros a flotadores, todo salió bien. Gracias por aclararlo :) –