我想知道如何使用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?我使用此条目的代码:
答案 0 :(得分:0)
快速且不完整的清单:
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在窗口和覆盖窗口中打孔(就输入/事件系统而言)。