在 Linux 中使用 XRender 进行渲染
一 环境准备与验证
xdpyinfo | grep XRender,输出包含 XRender 即表示支持。sudo apt-get install libxrender-dev x11proto-render-devsudo yum install libXrender-develsudo pacman -S libxrendergcc your_program.c -o output -lXrender -lX11。二 最小示例 创建 Picture 并进行合成
gcc xrender_demo.c -o xrender_demo -lXrender -lX11#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) { fprintf(stderr, "无法打开显示\n"); return 1; }
int major, minor;
if (!XRenderQueryVersion(dpy, &major, &minor)) {
fprintf(stderr, "XRender 不可用\n");
return 1;
}
printf("XRender 版本: %d.%d\n", major, minor);
int scr = DefaultScreen(dpy);
Visual *vis = DefaultVisual(dpy, scr);
Colormap cmap = DefaultColormap(dpy, scr);
// 找一个带 Alpha 的 PictFormat(常见为 PictStandardARGB32)
XRenderPictFormat *fmt = XRenderFindVisualFormat(dpy, vis);
if (!fmt) {
fprintf(stderr, "未找到 PictFormat\n");
return 1;
}
// 创建一个窗口并为其创建 Picture
Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, scr),
100, 100, 320, 240, 1,
BlackPixel(dpy, scr), WhitePixel(dpy, scr));
XMapWindow(dpy, win);
Picture pic = XRenderCreatePicture(dpy, win, fmt, 0, NULL);
if (!pic) {
fprintf(stderr, "创建 Picture 失败\n");
return 1;
}
// 清屏为半透明黑(预乘 ARGB:0x80000000)
XRenderColor clear = { .red = 0, .green = 0, .blue = 0, .alpha = 0x8000 };
XRenderFillRectangle(dpy, PictOpSrc, pic, &clear, 0, 0, 320, 240);
// 演示:用一个不透明的矩形叠加(PictOpOver 合成)
XRenderColor rect = { .red = 0xffff, .green = 0, .blue = 0, .alpha = 0xffff };
XRenderFillRectangle(dpy, PictOpOver, pic, &rect, 120, 80, 80, 80);
XFlush(dpy);
sleep(5); // 便于观察
XRenderFreePicture(dpy, pic);
XDestroyWindow(dpy, win);
XCloseDisplay(dpy);
return 0;
}
XRenderFindVisualFormat / XRenderFindStandardFormat:获取 PictFormat(如 PictStandardARGB32)。XRenderCreatePicture:创建可绘制的 Picture。XRenderComposite:执行合成(如 PictOpOver、PictOpSrc)。XRenderFillRectangle / XRenderDrawRectangles / XRenderCompositeString8 等用于具体绘制。三 透明与合成进阶
XCompositeRedirectWindow(dpy, win, CompositeRedirectManual); 将窗口重定向到离屏缓冲。XCompositeNameWindowPixmap(dpy, win, win); 获取窗口的像素图,再为其创建 Picture 进行 XRenderComposite 合成。XRenderPictureAttributes 设置 CPAlpha 等属性,用 XRenderIntToFixed(128) 等方式设置透明度(半透明示例)。四 桌面环境启用与性能优化
backend = xrender,重启 Compiz 或重新登录。五 常见故障排查
xdpyinfo | grep XRender 确认;若缺失,更新 X 服务器 与显卡驱动。XRenderFindVisualFormat 获取带 Alpha 的格式。-lXrender -lX11。