gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:18:17 26 4
gpt4 key购买 nike

我正在尝试制作一个极简主义的 OpenGL 程序,通过 Bumblebee (Optimus) 在我的英特尔芯片组 (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();
}

当我在 Intel 芯片组上直接启动程序 (./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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com