C++ glm::ortho()实际上是错的吗?

C++ glm::ortho()实际上是错的吗?,c++,opengl,orthogonal,glm-math,C++,Opengl,Orthogonal,Glm Math,我最近认为,从OpenGL提供的旧(不推荐使用的)功能(如矩阵操作和固定函数管道)切换是一个好主意 我使用GLM作为我的矩阵库来简化一些事情。问题是,它可能造成的问题比它简化的问题更多 透视投影与我的着色器和设置配合得很好,但当我尝试切换到正交时,一切都崩溃了。我的点和简单的四边形不会显示。当我使用旧的OpenGL矩阵时,一切又开始工作了 我把范围缩小到投影矩阵。我是这样称呼它的: glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );

我最近认为,从OpenGL提供的旧(不推荐使用的)功能(如矩阵操作和固定函数管道)切换是一个好主意

我使用GLM作为我的矩阵库来简化一些事情。问题是,它可能造成的问题比它简化的问题更多

透视投影与我的着色器和设置配合得很好,但当我尝试切换到正交时,一切都崩溃了。我的点和简单的四边形不会显示。当我使用旧的OpenGL矩阵时,一切又开始工作了

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

glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );
我将其与opengl提供的一次调用进行了比较”

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

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


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

它似乎不应该从源代码(V0.9.3.4)中坏掉

模板
GLM_FUNC_限定符详细信息::tmat4x4正交
(
valType const和left,
valType const和right,
valType const和bottom,
valType const和top,
valType const&zNear,
valType const&zFar
)
{
详细信息:tmat4x4结果(1);
结果[0][0]=valType(2)/(右-左);
结果[1][1]=valType(2)/(上下);
结果[2][2]=-valType(2)/(zFar-zNear);
结果[3][0]=-(右+左)/(右-左);
结果[3][1]=-(顶部+底部)/(顶部-底部);
结果[3][2]=-(zFar+zNear)/(zFar-zNear);
返回结果;
}
我唯一的想法是,这个模板可能正在创建一个整数矩阵(因为您已将所有整数传递给函数),并因此执行整数除法而不是浮点运算。您能否尝试将
.f
附加到所有参数


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

哇,你真是太棒了!在将我的参数更改为float之后,一切都解决了。谢谢你清理了这个问题:)除了添加
.f
,你还可以显式指定你要找的模板:
glm::ortho(…)
。我认为只有一个参数是显式浮点。FWIW对于未来的读者,请确保您的
zNear<0.0f
zFar>0.0f
。从正交切换到透视时,glm调用
glm::弧度(fov)
用于其参数,您可以切换
zNear>0.0f
zFar>zNear
。您的纵横比参数也可能会关闭,因为最终结果不是浮点。此外,OpenGL使用默认的
glm::orthoLH
glm::perspectiveLH
原型。
glOrtho( 0, 400, 0, 400, -1, 1 );
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;
}