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

Posted

技术标签:

【中文标题】OpenGL 2 和 Primusrun 在单个缓冲区上无显示(透明窗口)【英文标题】:No display (transparent window) with OpenGL 2 and Primusrun on single buffer 【发布时间】:2013-09-19 22:41:46 【问题描述】:

我正在尝试制作一个极简的 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())时,这适用于英特尔和primusrun

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

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

【问题讨论】:

-1,pastebins 死了,所以永远存在。将这些粘贴箱编辑到问题中。 我的问题有什么问题?我描述了这个问题(primusrun 在单个缓冲区上没有显示)和重现它的代码。为什么这是题外话? 老实说,打败了我。这是完全有效的,我认为 datenwolf 和我进行的讨论几乎可以确定您遇到问题的原因。简而言之,在混合集成/离散 GPU 实现和/或合成窗口管理器中,您必须交换前/后缓冲区才能显示任何内容。坦率地说,现在使用单缓冲渲染几乎没有意义:) 【参考方案1】:

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

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

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

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

【讨论】:

是的,它不是真正透明的,它像你说的那样把图片拖到后面。不幸的是,glFinish 命令并不能解决问题。我完全同意你的最后一点,这只是一个示例程序,我很想知道它为什么不起作用。 我最初也有同样的想法,认为这是合成窗口管理器的问题。但是后来我读到当你直接运行它时应用程序“正常”工作 - 我相信这是一个类似的问题,但窗口管理器可能不是罪魁祸首。可能必须通过 Intel 芯片复制帧缓冲区以进行最终显示,并且如果不交换缓冲区,则永远不会复制离散 GPU 的内容。 @AndonM.Coleman:这实际上是一个非常好的理论。然而它归结为同一件事:似乎需要缓冲区交换来触发帧缓冲区传输。鉴于在混合图形配置中您正在有效地处理双缓冲区,这是有道理的。哎呀,如果我要为这种情况开发驱动程序,我可能一开始就不会提供单一缓冲的视觉效果/像素格式。

以上是关于OpenGL 2 和 Primusrun 在单个缓冲区上无显示(透明窗口)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 渲染立体图形

如何在opengl的3d空间中旋转单个形状?

输入输出

Push/Pop 矩阵和单个对象在 OpenGL 中围绕其自己的轴旋转

03: OpenGL ES 基础教程02 使用OpenGL ES 基本步骤

OpenGL ES画板