【问题标题】:bind window pixmap to texture using GLX_EXT_texture_from_pixmap in opengl在opengl中使用GLX_EXT_texture_from_pixmap将窗口像素图绑定到纹理
【发布时间】:2013-02-21 19:53:45
【问题描述】:

我想知道如何使用 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

【问题讨论】:

  • 当您调用XCompositeNameWindowPixmap 时,desktop 是否可见?
  • 在这种情况下桌面是XDefaultRootWindow,我想根窗口总是可见的,是这样吗?
  • 您的应用程序是否处于全屏模式?恕我直言,这是否重要值得检查。
  • 不,我正在尝试在 openGL GLUT 窗口 (500x500) 中显示屏幕截图,该窗口具有作为父窗口的覆盖窗口,该窗口是在根窗口中使用 XCompositeGetOverlayWindow 创建的。
  • 好吧,那没关系。

标签: c++ opengl xlib glx


【解决方案1】:

快速且不完整的清单:

  • 您试图显示其像素图的窗口是否可见?
    • 换句话说,它被映射了吗?
  • 您尝试获取其像素图的窗口是否为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 在窗口和覆盖窗口中打一个洞(就输入/事件系统而言)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多