的代码片段在另一台机器上工作,但它对我来说无法正常工作。GLUT在打开创建的窗口时工作正常,但窗口中未显示线段,这意味着opengl存在问题。它甚至没有改变窗口的背景颜色。
我什至使用测试应用程序在我的窗户上测试了 opengl,并且它工作正常。
#ifdef WIN32
#include <windows.h>
#endif
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
void init(void){
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 400.0, 0.0, 400.0);
}
void linesegment(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex2i(180, 15);
glVertex2i(10, 145);
glEnd();
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50, 50);
glutInitWindowSize(400, 400);
glutCreateWindow("Testing Open GL");
init();
glutDisplayFunc(linesegment);
glutMainLoop();
return 0;
}
很可能你遇到了由合成图形系统引入的相当新的问题(Windows中的Aero,MacOS X上的Quartz Extreme以及Linux/X11上的大量各种程序)。问题的要点是,合成本质上是双重缓冲的:总是有一个屏幕外(后)缓冲区用于绘制窗口。当程序指示它已完成绘制时,合成器会将其集成到屏幕上的图像中。
然而,这带来了一些警告。最重要的是,单个缓冲绘图以某种方式需要指示它已完成。虽然从实现者的角度来看,OpenGL的glFinish
调用应该足够了,但大多数合成系统对它并不敏感。您必须创建双缓冲窗口像素格式并进行缓冲区交换以使合成器呈现您的图像。
因此,对于您的程序:
- 在
glutInitDisplayMode
中将GLUT_SINGLE
替换为GLUT_DOUBLE
- 将
glFlush
替换为glutSwapBuffers