c++ - ¿Glm:: orto() está realmente equivocado?
opengl orthogonal (1)
Recientemente, pensé que sería una buena idea cambiar la funcionalidad antigua (obsoleta) que proporciona OpenGL, como las operaciones de matriz y el canal de funciones fijas.
Estoy usando GLM como mi biblioteca matricial para simplificar un poco las cosas. El problema es que puede haber causado más problemas de los que simplificó ...
Las proyecciones de perspectiva funcionaron bien con mis sombreadores y mi configuración, pero cuando intenté cambiar a ortogonal, todo se rompió. Mis puntos y quads simples no se mostrarían. Cuando usé las antiguas matrices de OpenGL, las cosas empezaron a funcionar de nuevo.
Lo reduje todo a la matriz de proyección. Así es como lo llamé:
glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );
Comparé eso con el suministrado por opengl una vez que esto se llama "
glOrtho( 0, 400, 0, 400, -1, 1 );
Las únicas diferencias son el elemento [0] [0] y el elemento [1] [1] (que, que yo sepa, son iguales a "2 / ancho" y "2 / altura", respectivamente). Desde la matriz de OpenGL, ¡los valores eran exactamente eso! En la matriz glm, sin embargo, 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!
Entonces, mi pregunta: ¿la función glm :: ortho () está realmente dañada, o simplemente la estoy usando mal?
No parece que deba romperse con el 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 estar creando una matriz de enteros (ya que ha pasado todos los pasos a la función) y, por lo tanto, hacer una división de enteros en lugar de un punto flotante. ¿Puedes intentar añadir .f
a todos tus parámetros?
glm::mat4 projMat = glm::ortho( 0.f, 400.f, 0.f, 400.f, -1.f, 1.f );