我在线上找到了一些代码,它将在屏幕上移动一个框,然后在框到达屏幕末端后将其重置。
这是代码:

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恢复。不是整个帧缓冲区。帧缓冲区包含四边形的渲染,此后更改矩阵不会影响任何已渲染的东西。

08-18 10:17