如何只使用gluPerspective一次?

时间:2011-08-28 17:21:56

标签: c++ opengl perspective glu

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

//set viewpoint
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(VIEW_ANGLE,Screen_Ratio,NEAR_CLIP,FAR_CLIP);
gluLookAt(0,5,5, 0,0,0, 0,1,0);

//transform model 1
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(Theta, 0,1,0);

//draw model 1
glBegin(GL_QUADS);
...
glEnd();

上面的代码运行正常,但有没有办法删除对gluPerspective的调用?

我的意思是,我想在初始化时只调用一次,而不是在每次渲染时反复调用。

3 个答案:

答案 0 :(得分:5)

你在那里打电话给gluPerspective,因为它属于那里。 OpenGL不是初始化事物的场景图。这是一个状态驱动的绘图API。投影矩阵是一种状态,每个严肃的图形应用程序在整个单帧渲染过程中多次更改此状态。

OpenGL不知道几何对象,位置和相机。它只是通过处理管道推动点,线和三角形,并将结果绘制到屏幕上。在绘制了一些东西后,无论如何,OpenGL都没有回忆它。

  

我的意思是在初始化时只调用一次。

OpenGL未初始化(创建渲染上下文除外,但实际上这是操作系统图形堆栈的一部分,而不是OpenGL)。当然,你上传纹理和缓冲对象数据,但这可能随时发生。

答案 1 :(得分:4)

在投影矩阵上使用gluLookAt,因为它定义了相机/视图,因此属于模型视图矩阵,通常是最左边的转换(第一个转换后{ {1}}),它构成了单词modelview的视图部分。虽然它也适用于你的方式,但它在概念上是错误的。这也可以解决您的问题,因为您不必每帧都触摸投影矩阵。

但实际上,对于OpenGL的状态机架构,datenwolf的方法在概念上更加清晰。

答案 2 :(得分:1)

如果你没有调用glLoadIdentity()(它将当前矩阵重置为单位矩阵,即撤消gluPerspective()所做的事情)每帧,而是小心地push/pop变换矩阵你可以在初始化时非常愉快地调用它。通常,每次开始绘制时调用负载标识然后重置它就容易得多。 e.g:

// Initalisation
glLoadIdentity();
gluPerspective(...);

然后是:

// Drawing each frame
glClear(...);

glPushMatrix();
gluLookAt(...);

//draw stuff

glPopMatrix();