c - OpenGL 2 和 Primusrun 在单个缓冲区上无显示(透明窗口)

标签 c linux opengl freeglut optimus

我正在尝试制作一个极简的 OpenGL 程序,以便通过 Bumblebee (Optimus) 在我的 Intel 芯片组 (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

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

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

最佳答案

窗口可能并不是真正透明的,它可能只是在出现时显示其下方的内容;尝试移动它并观察它是否沿着图片“拖动”。

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

除此之外,要完成单个缓冲绘图,您可以调用 glFinish 而不是 glFlushglFinish 还可以作为绘图已经完成的提示。

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

关于c - OpenGL 2 和 Primusrun 在单个缓冲区上无显示(透明窗口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816882/

相关文章:

linux - 使用 "chmod a+x"和 "chmod 755"的区别

c++ - 使用 OpenGL 时 Qt CPU 使用率

c++ - 在同一文件中混合使用 C++ 和 Objective-C 时的性能注意事项

在c中找不到内存泄漏

c - 如何发送大小大于 64 KB 的 UDP 数据包

c - 我们如何将 C 程序从 4 个线程扩展到 8 个线程

c - execinfo.h 头文件不存在

linux - 打破用户空间是什么意思?

c++ - OpenGL:使用 2500*2500 像素的纹理是否可以接受?

c - 使用 C 递归删除目录