我需要在OpenGL中绘制一个可以在不同投影中查看的场景。到目前为止,我一直在使用gluPerspective和glOrtho来创建不同的投影,但现在我需要在不使用这些函数的情况下完成它。有没有办法做到这一点?
答案 0 :(得分:1)
您可以直接设置投影矩阵。由于您使用了gluPerspective()
,我假设您正在使用固定功能的旧OpenGL管道。那是对的吗?我问,因为如果是这样,你可以将矩阵模式设置为投影矩阵(通过glMatrixMode(GL_PROJECTION);
并直接加载或构建一个带有glLoadMatrix()
或glTranslate()
等调用的矩阵。
如果您正试图离开固定功能管道,这就是您无法使用gluPerspective()
或glOrtho()
的原因,那么您需要手动计算并将结果矩阵传递给您着色器。
因此,如果您仍在使用固定功能管道,section 9.085 of the OpenGL FAQ会告诉您如何设置gluPerspective()
计算但使用glFrustum()
的投影矩阵:
9.085如何调用与我调用gluPerspective()匹配的glFrustum()?
glFrustum()调用的视野(fov)是:
fov*0.5 = arctan ((top-bottom)*0.5 / near)
由于bottom == -top用于gluPerspective()产生的对称投影,因此:
top = tan(fov*0.5) * near
bottom = -top
注意:对于上述公式,fov必须是弧度才能与C数学库一起使用。如果你已经用度数计算了你的fov(如调用gluPerspective()),那么按如下方式计算top:
top = tan(fov*3.14159/360.0) * near
左右参数只是顶部,底部和方面的函数:
left = aspect * bottom
right = aspect * top
OpenGL参考手册(我从哪里得到这个?)显示了两个函数生成的矩阵。
man
page for glFrustum()
解释了它如何根据上述信息计算投影矩阵。 (我在这里放了一段摘录,但我不确定如何正确绘制矩阵。)同样,man
page for glOrtho
解释了如何手动构建正交投影矩阵。
如果您正在使用现代渲染管道,则可以将上述信息与glm,OpenGL数学库一起使用。 glm将帮助您构建所需的矩阵,并且可以将结果传递给着色器。
答案 1 :(得分:0)
正如user1118321在他的回答中所述,您可以自己创建任何投影矩阵并将其直接加载到OpenGL。但是对于新手来说,很难从那里开始,所以在C ++中就是这样做的:
double M[16]=
{
1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,
0.0,0.0,1.0,0.0,
0.0,0.0,0.0,1.0, // <- this line is for projections
};
glMatrixMode(GL_PROJECTION)
glLoadMatrixd(M);