25

我最近认为从 OpenGL 提供的旧(已弃用)功能(例如矩阵运算和固定函数管道)切换是一个好主意。

我使用 GLM 作为我的矩阵库来简化一些事情。问题是它可能导致的问题比它简化的要多……

透视投影在我的着色器和设置中运行良好,但是当我尝试切换到正交时,一切都崩溃了。我的点和简单的四边形不会显示。当我使用旧的 OpenGL 矩阵时,事情又开始起作用了。

我把它缩小到投影矩阵。我是这样称呼它的:

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

我将其与 opengl 提供的那个进行了比较,一旦被调用“

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

唯一的区别是 [0][0] 元素和 [1][1] 元素(据我所知,它们分别等于“2/width”和“2/height”)。从 OpenGL 矩阵中,值就是这样!但是,在 glm 矩阵上,值是 0。

一旦我在调用 glm::ortho 后手动切换了 glm 矩阵中的值,一切都恢复正常了!

所以我的问题是: glm::ortho() 函数真的坏了,还是我用错了?

4

1 回答 1

68

似乎不应该从源代码中破坏它(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;
}

我唯一的想法是这个模板可能正在创建一个整数矩阵(因为你已经将所有整数传递给函数),因此进行整数除法而不是浮点数。您可以尝试附加.f到所有参数吗?

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

于 2012-09-01T18:40:55.143 回答