OpenGL三角形旋转
Posted
技术标签:
【中文标题】OpenGL三角形旋转【英文标题】:OpenGL Triangle rotation 【发布时间】:2014-04-18 23:48:27 【问题描述】:我画了一个三角形,我想在 X 轴上连续旋转它。下面的代码旋转了几次。
//Paints the GL scene
void GLobj::paintGL(void)
static int angle;
for (angle = 1; angle<=360; angle += 1)
glClear (GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glRotatef(angle, 1, 0 , 0);
glBegin(GL_TRIANGLES);
glColor3f (1.0, 0.0,1.0);
glVertex2f(-0.45,0.0);
glVertex2f(-0.65,0.5);
glVertex2f(-0.25,0.5);
glEnd();
usleep(1000);
glFlush ();
如果我将上面的代码更改如下,输出只是忙于执行而不显示任何内容。
//Paints the GL scene
void GLobj::paintGL(void)
static int angle;
for (angle = 1; angle<=360; angle += 1)
glClear (GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glRotatef(angle, 1, 0 , 0);
glBegin(GL_TRIANGLES);
glColor3f (1.0, 0.0,1.0);
glVertex2f(-0.45,0.0);
glVertex2f(-0.65,0.5);
glVertex2f(-0.25,0.5);
glEnd();
usleep(1000);
if (angle == 360)
angle = 1;
glFlush ();
还有其他更好的方式来实现连续旋转吗?
【问题讨论】:
它没有显示任何内容,因为您在任何时候都没有刷新命令队列。这些天你真的不应该使用单缓冲渲染,它通常不适用于大多数使用合成窗口管理器或混合集成/离散 GPU 切换的系统。 en.wikibooks.org/wiki/OpenGL_Programming/… 【参考方案1】:大多数图形 API(如 OpenGL 和 DirectX)将所有更改写入称为后台缓冲区的内容:这些操作仅在您渲染完整场景后才会显示。如果每个旋转步骤或glEnd()
立即渲染,您将始终看到您的场景每次都在构建。结果会闪烁,不好看。
您可以在绘制完场景后告诉 OpenGL,以便立即显示所有内容。您可以使用glFlush
执行此操作。
在您的第二个示例中,您进行了一次旋转,然后进行了一次旋转,然后又进行了一次旋转……最后,您显示了最终场景一次。不会呈现三角形通过旋转阶段的良好过渡。
【讨论】:
以上是关于OpenGL三角形旋转的主要内容,如果未能解决你的问题,请参考以下文章
opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色