掌握 XGE 全局混合模式的设置与查询,理解 18 种 Porter-Duff / CSS 混合公式的视觉效果。
混合模式决定了新绘制的像素(Source)如何与帧缓冲中已有的像素(Destination)进行合成。XGE 支持 18 种混合模式,涵盖经典 Porter-Duff 合成和 CSS Compositing 规范中的高级混合。
混合模式是全局状态——设置后影响后续所有绘制调用,直到再次更改。
| 函数 | 说明 |
|---|---|
void xgeBlendSet(int iBlend) | 设置全局混合模式(XGE_BLEND_* 常量) |
int xgeBlendGet(void) | 获取当前混合模式 |
| 常量 | 值 | 效果 |
|---|---|---|
XGE_BLEND_NONE | 0 | 不混合,Source 直接覆盖 |
XGE_BLEND_ALPHA | 1 | 标准 Alpha 混合(默认) |
XGE_BLEND_ADD | 2 | 加法混合,发光/粒子效果 |
XGE_BLEND_MULTIPLY | 3 | 正片叠底,变暗 |
XGE_BLEND_SCREEN | 4 | 滤色,变亮 |
XGE_BLEND_CUSTOM | 5 | 自定义(配合 Shader 使用) |
XGE_BLEND_DARKEN | 6 | 取两者较暗值 |
XGE_BLEND_LIGHTEN | 7 | 取两者较亮值 |
XGE_BLEND_OVERLAY | 8 | 叠加,增强对比 |
XGE_BLEND_COLOR_DODGE | 9 | 颜色减淡,高光 |
XGE_BLEND_COLOR_BURN | 10 | 颜色加深,阴影 |
XGE_BLEND_HARD_LIGHT | 11 | 强光 |
XGE_BLEND_SOFT_LIGHT | 12 | 柔光 |
XGE_BLEND_DIFFERENCE | 13 | 差值,反色效果 |
XGE_BLEND_EXCLUSION | 14 | 排除,类似差值但更柔和 |
XGE_BLEND_HUE | 15 | 保留 Source 色相 |
XGE_BLEND_SATURATION | 16 | 保留 Source 饱和度 |
XGE_BLEND_COLOR | 17 | 保留 Source 色相+饱和度 |
XGE_BLEND_LUMINOSITY | 18 | 保留 Source 亮度 |
gcc -O2 -I. -o ch12.exe ch12_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch12.exe
static int onFrame(void* pUser) {
xgeClear(0x081114FF);
// 绘制底层圆形(正常 Alpha 混合)
xgeBlendSet(XGE_BLEND_ALPHA);
xgeShapeCircleFill(400, 300, 100, 0x4FD8C2FF);
// 切换为加法混合 → 重叠区域更亮
xgeBlendSet(XGE_BLEND_ADD);
xgeShapeCircleFill(350, 300, 80, 0xFF6B5E80);
xgeShapeCircleFill(450, 300, 80, 0xFFB45480);
// 恢复默认
xgeBlendSet(XGE_BLEND_ALPHA);
return XGE_OK;
}// 先绘制彩色背景矩形
xgeShapeRectFill(100, 100, 600, 400, 0x6DB3F2FF);
// 用 Multiply 叠加半透明灰色 → 产生阴影区域
xgeBlendSet(XGE_BLEND_MULTIPLY);
xgeShapeRectFill(200, 200, 300, 200, 0x808080FF);
xgeBlendSet(XGE_BLEND_ALPHA); // 恢复int current = xgeBlendGet();
if (current != XGE_BLEND_ALPHA) {
xgeLogWrite(XGE_LOG_WARN, "Blend mode is %d, expected ALPHA", current);
xgeBlendSet(XGE_BLEND_ALPHA);
}将以下代码保存为 ch12_main.c,编译后运行即可看到加法混合的发光效果:
#include "xge.h"
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x081114FF);
// 底层圆形(标准 Alpha 混合)
xgeBlendSet(XGE_BLEND_ALPHA);
xgeShapeCircleFill(400, 300, 100, 0x4FD8C2FF);
// 加法混合 → 重叠区域更亮
xgeBlendSet(XGE_BLEND_ADD);
xgeShapeCircleFill(350, 300, 80, 0xFF6B5E80);
xgeShapeCircleFill(450, 300, 80, 0xFFB45480);
// 恢复默认混合模式
xgeBlendSet(XGE_BLEND_ALPHA);
return XGE_OK;
}
int main(void) {
xge_desc_t d = {0};
d.iWidth = 800;
d.iHeight = 600;
d.sTitle = "ch12 - Blend Modes";
d.iFlags = XGE_INIT_VSYNC;
xgeInit(&d);
xgeRun(onFrame, NULL);
xgeUnit();
return 0;
}xgeBlendSet(XGE_BLEND_ALPHA) 恢复标准透明混合,确保后续绘制不受特效影响。XGE_BLEND_ADD 将 Source 与 Destination 的 RGB 相加,重叠区域亮度叠加,模拟发光/光晕。80(Alpha=128)使圆形半透明,加法效果更柔和。XGE_BLEND_ALPHA。