使用opengl中的GLX_EXT_texture_from_pixmap将窗口像素图绑定到纹理

时间:2013-02-21 19:53:45

标签: c++ opengl xlib glx

我想知道如何使用GLX_EXT_texture_from_pixmap扩展将窗口像素图绑定到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

1 个答案:

答案 0 :(得分:0)

快速且不完整的清单:

  • 您的pixmap是否会尝试显示的窗口?
    • 换句话说,是映射吗?
  • 您的pixmap是否尝试获取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在窗口和覆盖窗口中打孔(就输入/事件系统而言)。

相关问题