完全相同的代码段正在另一台机器上工作,但它对我不起作用。 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;
}
答案 0 :(得分:2)
很可能你遇到了合成图形系统引入的一类新问题(Windows中的Aero,MacOS X上的Quartz Extreme以及Linux / X11上的各种程序)。问题的关键在于,合成本质上是双缓冲的:总是有一个用于绘制窗口的屏幕外(后)缓冲区。当程序显示已完成绘图时,合成器会将其整合到屏幕上的图像中。
然而,这会带来一些警告。最重要的是,单缓冲绘图需要表明它已完成。虽然从实现者的角度来看,OpenGL的glFinish
调用应该足够了,但大多数合成系统对它都不敏感。您必须创建一个双缓冲窗口像素格式并进行缓冲交换以使合成器呈现您的图像。
所以对你的程序来说:
GLUT_SINGLE
替换为GLUT_DOUBLE
glutInitDisplayMode
glFlush
替换为glutSwapBuffers