2

我正在尝试制作一个极简的 OpenGL 程序,以便通过 Bumblebee(擎天柱)在我的英特尔芯片组(Mesa)和 NVIDIA 卡上运行。

我的源代码(使用 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())时,这在 Intel 和primusrun.

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

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

4

1 回答 1

2

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

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

除此之外,要完成您调用glFinishnot的单个缓冲绘图glFlushglFinish也可以作为一个暗示,绘画已经完成了。

请注意,这些天单缓冲绘图几乎没有用处。反对双缓冲的唯一理由是缺乏可用的图形内存。在 GPU 有数百兆 RAM 可用的时代,这不再是一个严肃的论点。

于 2013-09-15T21:47:02.063 回答