2013-02-21 3 views
0

я хочу знать, как связать окна растрового изображение в OpenGL текстуру с расширением GLX_EXT_texture_from_pixmap, я не заставить его работать, это мой код:связать окно пиксельного с текстурой, используя 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);. Я тестировал его с использованием пустой pixmap и работал, но когда я использую XCompositeNameWindowPixmap, это попадает в эту ошибку, что может быть неправильным в моем коде?

Edit:

Я нашел, используя другой код, используя XCompositeNameWindowPixmap всегда возвращает черное изображение, может быть, это может быть случиться, потому что я использую Ubuntu на VMWare Player? я использовать код этой записи:

Qt with XComposite problem

+0

Действительно ли «рабочий стол» отображается при вызове 'XCompositeNameWindowPixmap'? – didierc

+0

в этом случае рабочий стол - это XDefaultRootWindow, я полагаю, что окно корня всегда видно, так ли? –

+0

Является ли ваше приложение в полноэкранном режиме? Было бы целесообразно проверить, имеет ли это значение imho. – didierc

ответ

0

Быстрый и неполный перечень:

  • Is окна которого пиксельная вы пытаетесь получить видимый?
    • Другими словами, он нанесен на карту?
  • Является ли окно, с помощью которого вы пытаетесь получить тип изображения InputOutput?
  • ли перенаправлять корневое окно с помощью xcb_composite_redirect_subwindows(..., XCB_COMPOSITE_REDIRECT_MANUAL); (или эквивалент Xlib?)
    • Просто создание накладываемого не достаточно.
    • Примечание. Я не пробовал перенаправить отдельные окна и не пытался использовать _AUTOMATIC.
    • Необходимость xcb_composite_redirect_... скрыта в спецификации GLX_EXT_texture_from_pixmap.

Имейте в виду: вы не нужен другой компоновщик работает, и, вероятно, даже не другой менеджер окон. KWin, даже с отключенным композицией, нарушает текущую итерацию моего игрушечного композитора.


Unrelated к специфическому сообщение об ошибке, но возможный камень преткновения: в зависимости от возможностей графического процессора, возможно, придется использовать GL_NEAREST фильтр текстуры для мин и магнит- фильтров.

Дополнительное предостережение для вашей установки: оверлейное окно не позволит вам взаимодействовать с рабочим столом, так как это фактическое оверлей. Общим способом решения этой проблемы является использование XFixes для пробивания отверстия в вашем окне и в окне оверлея (насколько это касается системы ввода/события).