0

完全相同的代码片段正在另一台机器上工作,但对我来说不能正常工作。GLUT 在打开创建的窗口时工作得非常好,但线段未显示在窗口上,这意味着opengl 存在问题。它甚至没有改变窗口的背景颜色

我什至用一个测试应用程序在我的 Windows 上测试了 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;

}
4

1 回答 1

2

您很可能会遇到由合成图形系统(Windows 中的 Aero、MacOS X 上的 Quartz Extreme 以及 Linux/X11 上的大量各种程序)引入的一类相当新的问题。问题的要点是,合成本质上是双缓冲的:总是有一个屏幕外(后)缓冲区供要绘制的窗口使用。当一个程序指示它完成绘制时,合成器会将它集成到屏幕上的图像中。

然而,这带来了一些警告。最重要的是,单个缓冲绘图需要以某种方式表明它已完成。虽然从实现者的角度来看,OpenGL 的glFinish调用应该足够了,但大多数合成系统对它并不敏感。您必须创建双缓冲窗口像素格式并进行缓冲区交换以使合成器呈现您的图像。

所以对于你的程序:

  • 替换GLUT_SINGLEGLUT_DOUBLE_glutInitDisplayMode
  • 替换glFlushglutSwapBuffers
于 2013-11-03T14:04:19.703 回答