【发布时间】: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?我使用这个条目的代码:
【问题讨论】:
-
当您调用
XCompositeNameWindowPixmap时,desktop是否可见? -
在这种情况下桌面是XDefaultRootWindow,我想根窗口总是可见的,是这样吗?
-
您的应用程序是否处于全屏模式?恕我直言,这是否重要值得检查。
-
不,我正在尝试在 openGL GLUT 窗口 (500x500) 中显示屏幕截图,该窗口具有作为父窗口的覆盖窗口,该窗口是在根窗口中使用 XCompositeGetOverlayWindow 创建的。
-
好吧,那没关系。