C++ 如何只使用一次透视图?

C++ 如何只使用一次透视图?,c++,opengl,perspective,glu,C++,Opengl,Perspective,Glu,上面的代码工作得很好,但是有没有办法删除对透视图的调用 我的意思是,我只想在初始化时调用它一次,而不是在每次渲染时重复调用。如果不调用(这会将当前矩阵重置为标识矩阵,即撤消glupspective()所做的操作)每一帧,而不是仔细的变换矩阵,你可以通过调用它只在初始化相当愉快。通常,只要在每次开始绘制时调用load identity,然后将其重置,就会容易得多。e、 g: glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //set viewp

上面的代码工作得很好,但是有没有办法删除对透视图的调用

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

如果不调用(这会将当前矩阵重置为标识矩阵,即撤消
glupspective()
所做的操作)每一帧,而不是仔细的变换矩阵,你可以通过调用它只在初始化相当愉快。通常,只要在每次开始绘制时调用load identity,然后将其重置,就会容易得多。e、 g:

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();
随后:

// Initalisation
glLoadIdentity();
gluPerspective(...);
如果不调用每个帧(这会将当前矩阵重置为单位矩阵,即撤消
glupspective()
所做的操作),而是小心地调用变换矩阵,则只需在初始化时调用即可。通常,只要在每次开始绘制时调用load identity,然后将其重置,就会容易得多。e、 g:

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();
随后:

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

你把它叫做那里,因为它属于那里。OpenGL不是一个场景图,您可以在其中初始化东西。这是一个状态驱动的绘图API。投影矩阵是一种状态,在单帧渲染过程中,每个严肃的图形应用程序都会多次更改此状态

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

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


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

您可以在那里调用gluPerspective,因为它属于那里。OpenGL不是一个场景图,您可以在其中初始化东西。这是一个状态驱动的绘图API。投影矩阵是一种状态,在单帧渲染过程中,每个严肃的图形应用程序都会多次更改此状态

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

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


OpenGL没有初始化(除了创建渲染上下文,但实际上这是操作系统图形堆栈的一部分,而不是OpenGL)。当然,您可以上传纹理并将对象数据缓冲到其中,但这随时都可能发生。

不要在投影矩阵上使用
gllookat
,因为它定义了相机/视图,因此属于模型视图矩阵,通常是最左边的变换(glLoadIdentity之后的第一个变换),它构成单词modelview的视图部分。虽然它也能按你的方式工作,但在概念上是错误的。这也可以解决您的问题,因为这样您就不必在每一帧都接触投影矩阵


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

不要在投影矩阵上使用
gluLookAt
,因为它定义了相机/视图,因此属于modelview矩阵,通常是最左边的变换(在
glLoadIdentity
之后的第一个),它构成了word modelview的视图部分。虽然它也按您的方式工作,但在概念上是错误的。这也可以解决您的问题,因为这样您就不必每帧都接触投影矩阵


但事实上,datenwolf的方法在OpenGL的状态机架构方面在概念上更清晰。

因为在代码中不调用gluPerspective,渲染会产生意外的结果。但为什么您如此热衷于避免这种情况?因为在代码中不调用gluPerspective,渲染会产生意外的结果。为什么但是,您是否非常希望避免这种情况?与将每个对象移动到根目录(在调用glLoadIdentity的情况下)相比,使用glPushMatrix和glPopMatrix是否会大大提高性能我不会为每帧发生一次的操作的性能而烦恼。这是不值得的。担心几何体、着色器和纹理之类的大事。与那些测量成本的
glLoadIdentity()
+
glupperspective()
vs
glPushMatrix()相比
+
glPopMatrix()
实际上是不可能的。使用glPushMatrix和glPopMatrix是否比将每个对象移动到根目录(在调用glLoadIdentity的情况下)更能提高性能我不会为每帧发生一次的操作的性能而烦恼。这是不值得的。担心几何体、着色器和纹理之类的大事。与那些测量成本的
glLoadIdentity()
+
glupperspective()
vs
glPushMatrix()相比
+
glPopMatrix()
实际上是不可能的。