在单个缓冲区上没有OpenGL 2和Primusrun的显示(透明窗口)

时间:2013-09-15 19:57:58

标签: c linux opengl freeglut optimus

我正试图通过Bumblebee(Optimus)在我的英特尔芯片组(Mesa)和NVIDIA卡上运行一个简约的OpenGL程序。

我的源代码(使用FreeGLUT):

#include <GL/freeglut.h>

void display(void);
void resized(int w, int h);

int main(int argc, char** argv)
{
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
        glutInitContextVersion(2, 1);
        glutInitContextProfile(GLUT_CORE_PROFILE);
        glutInitWindowSize(640, 480);
        glutCreateWindow("Hello, triangle!");

        glutReshapeFunc(resized);
        glutDisplayFunc(display);

        glClearColor(0.3, 0.3, 0.3, 1.0);

        glutMainLoop();
        return 0;
}

void display(void)
{
        glClear(GL_COLOR_BUFFER_BIT);

        glColor3f(1.0, 1.0, 1.0);
        glBegin(GL_TRIANGLES);
                glVertex3f(0, 0.75, 0.0);
                glVertex3f(-0.75, -0.75, 0.0);
                glVertex3f(0.75, -0.75, 0.0);
        glEnd();

        glFlush();
}

void resized(int w, int h)
{
        glViewport(0, 0, w, h);
        glutPostRedisplay();
}

当我直接在英特尔芯片组上启动程序(./a.out)时,一切正常。我没有primusrun ./a.out显示透明窗口的机会:

它实际上不是透明,即使我移动窗口,背后的图像也会停留。

有趣的是,当我更改双色缓冲区时(使用GLUT_DOUBLE代替GLUT_SINGLE,而glutSwapBuffers()代替glFush()),这对英特尔和primusrun

这是我的glxinfohttp://pastebin.com/9DADif6X
和我的primusrun glxinfohttp://pastebin.com/YCHJuWAA

我做错了还是与Bumblebee有关的错误?

1 个答案:

答案 0 :(得分:2)

窗口可能不是很透明,它可能只显示它出现时它下面的任何东西;尝试移动它并观察它是否“沿着图片”拖动。

使用合成器时,单个缓冲窗口有点棘手,因为当程序完成渲染时,合成器无法知道。使用双缓冲窗口执行缓冲交换确实为合成器提供了附加信息。

除此之外,要完成单个缓冲绘图,请致电glFinish而不是glFlush; glFinish也可以作为绘画已经完成的提示。

请注意,目前单缓冲绘图几乎没有用处。反对双缓冲的唯一论据是缺乏可用的图形内存。在GPU拥有数百兆字节RAM的时代,这不再是一个严重的争论。