gpt4 book ai didi

c++ - 在 opengl 中使用 GLX_EXT_texture_from_pixmap 将窗口像素图绑定(bind)到纹理

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:49 25 4
gpt4 key购买 nike

我想知道如何使用 GLX_EXT_texture_from_pixmap 扩展将窗口像素图绑定(bind)到 OpenGL 纹理,我没有让它工作,这是我的代码:

     const int pixmap_config[] = {
GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
GLX_DOUBLEBUFFER, False,
GLX_Y_INVERTED_EXT, GLX_DONT_CARE,
None
};

const int pixmap_attribs[] = {
GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT,
None
};

GLXFBConfig * configs = 0;
GLXPixmap glxpixmap = 0;
Pixmap pixmap;
GLuint texture_id;

int c=0;
configs = glXChooseFBConfig(display, 0, pixmap_config, &c);

pixmap = XCompositeNameWindowPixmap (display, desktop);

cout<<"Pixmap id"<<pixmap<<endl;

glxpixmap = glXCreatePixmap(display, configs[0], pixmap, pixmap_attribs);

cout <<"glxpixmap id"<<glxpixmap<<endl;
if(glxpixmap){
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glXBindTexImageEXT(display, glxpixmap, GLX_FRONT_EXT, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}

这给我一个 X 错误:

X Error of failed request:  BadMatch (invalid parameter attributes)
Major opcode of failed request: 152 (Composite)
Minor opcode of failed request: 6 ()
Serial number of failed request: 27
Current serial number in output stream: 30

这发生在 glXBindTexImageEXT(display, glxpixmap, GLX_FRONT_EXT, NULL); 行中。我使用一个空的像素图对其进行了测试并且可以正常工作,但是当我使用 XCompositeNameWindowPixmap 时,这属于该错误,“我的代码中可能有什么问题?

编辑:

我发现使用另一个使用 XCompositeNameWindowPixmap 的代码总是返回黑色图像,这可能是因为我在 vmware 播放器上使用 ubuntu?我使用这个条目的代码:

Qt with XComposite problem

最佳答案

快速且不完整的 list :

  • 您要使其像素图可见的窗口是否可见?
    • 换句话说,它是映射的吗?
  • 您要获取其像素图的窗口是否属于 InputOutput 类型?
  • 您是否使用 xcb_composite_redirect_subwindows(..., XCB_COMPOSITE_REDIRECT_MANUAL);(或 Xlib 等价物?)重定向了根窗口
    • 仅仅创建一个叠加层是不够的。
    • 请注意,我没有尝试重定向单个窗口,也没有尝试使用 _AUTOMATIC
    • xcb_composite_redirect_... 的需要隐藏在 GLX_EXT_texture_from_pixmap 规范中。

请记住:您想要运行另一个合成器,可能甚至不想运行另一个窗口管理器。 KWin,即使禁用了合成,也会破坏我的玩具合成器的当前迭代。


与您的特定错误消息无关,但可能是一个绊脚石:根据您的 GPU 的能力,您可能必须使用 GL_NEAREST 纹理过滤器作为 min 和 mag 过滤器。

关于您的设置的额外注意事项:叠加窗口不会让您与桌面交互,因为它是一个实际的叠加层。解决此问题的常用方法是使用 XFixes 在窗口和覆盖窗口中打洞(就输入/事件系统而言)。

关于c++ - 在 opengl 中使用 GLX_EXT_texture_from_pixmap 将窗口像素图绑定(bind)到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15011020/

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