在 X Window上使用opengl绘制yuv图像需要用GLX, glx相关资料和接口说明网上都能找到. opengl想直接绘制yuv图像的话,需要Linux系统和显卡驱动支持较高版本的opengl, 也就是说opengl需要支持可编程渲染管线,然后写个顶点shader和片元shader。另外我的使用场景需要单独的线程调用opengl做绘制。
下面看看具体实现:
1. 使用Xlib之前需要调用XInitThreads(); 让Xlib支持多线程. 可以在程序刚启动时就调用,代码如下:
int main(int argc, char *argv[])
{
XInitThreads();
// 其他代码
return 0;
}
QT也有相关的选项去调用XInitThreads();
2. 为了使用多线程,先创建了一个主的X窗口和四个X子窗口:
auto main_wid = XCreateSimpleWindow(display, root, 0, 0, main_w, main_h, 0, white_pixel, black_pixel);
XSelectInput(display, main_wid, StructureNotifyMask | KeyPressMask);
CreateSubWindows(display, screen, root, main_wid, gl_vi, gl_renders);
3. 为了方便测试,主X窗口大小变化时,四个子窗口也重新布局,监听ConfigureNotify事件:
if (xev.type ==