我在线上找到了一些代码,它将在屏幕上移动一个框,然后在框到达屏幕末端后将其重置。
这是代码:
void display(void) {
int sign = 1;
if (lastFrameTime == 0) {
/*
* sets lastFrameTime to be the number of milliseconds since
* Init() was called;
*/
lastFrameTime = glutGet(GLUT_ELAPSED_TIME);
}
int now = glutGet(GLUT_ELAPSED_TIME);
int elapsedMilliseconds = now - lastFrameTime;
float elapsedTime = float(elapsedMilliseconds) / 1000.0f;
lastFrameTime = now;
int windowWidth = glutGet(GLUT_WINDOW_WIDTH);
if (boxX > windowWidth) {
boxX -= windowWidth;
}
boxX += (sign)*256.0f * elapsedTime;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//creates a new matrix at the top that we can do things to?
glTranslatef(boxX, 0.0f, 0.0f);
/*
* draw a "quad" (rectangle)
*/
glBegin(GL_QUADS);
glVertex2f(0.0f, 0.0f);
glVertex2f(128.0f, 0.0f);
glVertex2f(128.0f, 128.0f);
glVertex2f(0.0f, 128.0f);
glEnd();
glPopMatrix();
//pops that matrix off the stack so we can have a "clean" version to do something next time.?
glutSwapBuffers();
}
现在,我了解
glPushMatrix()
和 glPopMatrix()
的方式是glPushMatrix()
在堆栈中放置(或插入)一个新矩阵供您执行操作,因此,将其弹出后,您将再次拥有“干净”的状态。这就是为什么如果我忽略glPopMatrix()
之后的glEnd()
,那么我的方块似乎会加速而不是以恒定速度运动。但是,如何保留我在
glPushMatrix()
和glPopMatrix()
中所做的更改?当我使用glPushMatrix()
并对顶部矩阵进行更改时,它会可视化这些更改,但是当我使用glPopMatrix()
时,所有这些更改是否都消失了?当我再次恢复到“干净”状态时,我的盒子如何在屏幕上移动?如果在进行更改后再次弹出矩阵,该转换的状态如何记录?
最佳答案
只是用于转换坐标的矩阵,由glPopMatrix
恢复。不是整个帧缓冲区。帧缓冲区包含四边形的渲染,此后更改矩阵不会影响任何已渲染的东西。