遮罩用另一个 Shape 或 Scene 的 Alpha/Luma 通道控制当前图形的可见区域。
| 常量 / 函数 | 说明 |
|---|---|
#define XGE_SHAPE_EX_MASK_ALPHA 0 | Alpha 通道遮罩 |
#define XGE_SHAPE_EX_MASK_LUMA 1 | 亮度遮罩 |
int xgeShapeExMaskShapeSet(xge_shape_ex pShape, xge_shape_ex pTarget, int iMethod) | 用 Shape 作为遮罩 |
int xgeShapeExMaskSceneSet(xge_shape_ex pShape, xge_shape_ex_scene pTarget, int iMethod) | 用 Scene 作为遮罩 |
gcc -O2 -I. -o ch55.exe ch55_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch55.exe
// 遮罩:径向渐变圆(中心不透明→边缘透明)
xge_shape_ex mask = NULL;
xgeShapeExCreate(&mask);
xgeShapeExAppendCircle(mask, 400, 300, 200, 200, 1);
xge_shape_ex_color_stop_t stops[] = {
{ 0.0f, 0xFFFFFFFF }, // 中心不透明
{ 1.0f, 0xFFFFFF00 }, // 边缘全透明
};
xgeShapeExFillRadialGradient(mask, 400,300,200, 400,300,
XGE_SHAPE_EX_GRADIENT_USER_SPACE, stops, 2);
// 被遮罩的图形:彩色矩形
xge_shape_ex content = NULL;
xgeShapeExCreate(&content);
xgeShapeExAppendRect(content, 100,100, 600,400, 0,0, 1);
xgeShapeExFillColor(content, 0x4FD8C2FF);
// 应用 Alpha 遮罩
xgeShapeExMaskShapeSet(content, mask, XGE_SHAPE_EX_MASK_ALPHA);
xgeShapeExDraw(content, 0.25f);将以下代码保存为 ch55_main.c,编译后运行即可看到圆形渐隐遮罩效果:
#include "xge.h"
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x081114FF);
// 遮罩:径向渐变圆(中心不透明→边缘透明)
xge_shape_ex mask = NULL;
xgeShapeExCreate(&mask);
xgeShapeExAppendCircle(mask, 400, 300, 200, 200, 1);
xge_shape_ex_color_stop_t stops[] = {
{ 0.0f, 0xFFFFFFFF },
{ 1.0f, 0xFFFFFF00 },
};
xgeShapeExFillRadialGradient(mask, 400,300,200, 400,300,
XGE_SHAPE_EX_GRADIENT_USER_SPACE, stops, 2);
// 被遮罩的图形:彩色矩形
xge_shape_ex content = NULL;
xgeShapeExCreate(&content);
xgeShapeExAppendRect(content, 100,100, 600,400, 0,0, 1);
xgeShapeExFillColor(content, 0x4FD8C2FF);
// 应用 Alpha 遮罩
xgeShapeExMaskShapeSet(content, mask, XGE_SHAPE_EX_MASK_ALPHA);
xgeShapeExDraw(content, 0.25f);
xgeShapeExDestroy(content);
xgeShapeExDestroy(mask);
return XGE_OK;
}
int main(void) {
xge_desc_t d = {0};
d.iWidth = 800;
d.iHeight = 600;
d.sTitle = "ch55 - Alpha Mask";
d.iFlags = XGE_INIT_VSYNC;
xgeInit(&d);
xgeRun(onFrame, NULL);
xgeUnit();
return 0;
}