【发布时间】:2011-08-11 19:40:14
【问题描述】:
我在网上找到了一些代码,它可以在屏幕上移动一个框,然后在框到达屏幕末尾后重置它。
代码如下:
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() 在堆栈上放置(或推送)一个新矩阵供您执行操作,以便在您将其弹出后您有一个再次“干净”的石板。这就是为什么如果我在glEnd() 之后忽略glPopMatrix(),我的方块似乎会加速而不是匀速移动。
但是,我在glPushMatrix() 和glPopMatrix() 中所做的更改是如何保留的?当我使用glPushMatrix() 并更改顶部矩阵时,它会显示更改,但是当我使用glPopMatrix() 时,所有这些更改不是都消失了吗?当我再次恢复到“干净”的状态时,我的盒子是如何在屏幕上移动的?
如果我在进行更改后再次弹出矩阵,该翻译的状态如何记录?
【问题讨论】:
-
顺便说一句。你知道,你是通过阅读贬值的代码来学习 OpenGL 的吗?因为 PushMatrix 和 PopMatrix 在 OpenGL 3.0 中已被弃用。 opengl.org/registry/doc/glspec30.20080923.pdf(406 页)您的绘画方式(开始;顶点;结束)也已被弃用。这实际上是最糟糕的方法。所以,我只是指出问题,但我没有很好的解决方案。尝试用谷歌搜索 openGL 3.1 教程。您甚至可以尝试找到好的 OpenGL ES 教程。如果您刚开始学习 OpenGL,请尝试学习干净的 OpenGL 方法。
-
@petraszd:问题是仍然有很多资源使用旧样式教授 OpenGL。在 NeHe 等资源升级之前,我们仍然需要为这些问题提供解决方案。
-
@Mihai:NeHe 几乎已经死了(没有更新),所以他们不会升级。
-
那么有人必须创建一个等价物:)
-
@petraszd:如果有人难以理解固定功能管道,您希望他们如何在着色器中重新实现他们需要的行为?无论哪种情况,他们都需要了解转换矩阵。