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的调用?
我的意思是,我想在初始化时只调用一次,而不是在每次渲染时反复调用。
答案 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();