XGE 提供两种图元渲染算法:AA-Mesh(抗锯齿网格)和 SDF(有向距离场)。本章学习如何切换及各自适用场景。
| 函数 / 常量 | 说明 |
|---|---|
#define XGE_SHAPE_RENDER_AA_MESH 0 | 抗锯齿网格模式(默认) |
#define XGE_SHAPE_RENDER_SDF 1 | SDF 距离场模式 |
void xgeShapeRenderModeSet(int iMode) | 设置全局图元渲染模式 |
int xgeShapeRenderModeGet(void) | 获取当前渲染模式 |
gcc -O2 -I. -o ch32.exe ch32_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch32.exe
// 上半屏:AA-Mesh 模式
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_AA_MESH);
xgeShapeCircleFill(200, 200, 80, 0x4FD8C2FF);
xgeShapeRoundRectFill((xge_rect_t){350,140,160,120}, 20, 0xFFB454FF);
// 下半屏:SDF 模式
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_SDF);
xgeShapeCircleFill(200, 450, 80, 0x4FD8C2FF);
xgeShapeRoundRectFill((xge_rect_t){350,390,160,120}, 20, 0xFFB454FF);
// 恢复默认
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_AA_MESH);int mode = xgeShapeRenderModeGet();
if (mode == XGE_SHAPE_RENDER_SDF) {
xgeLogWrite(XGE_LOG_INFO, "当前使用 SDF 渲染");
} else {
xgeLogWrite(XGE_LOG_INFO, "当前使用 AA-Mesh 渲染");
}// 高 DPI 屏幕使用 SDF 获得更锐利的边缘
float dpi = xgePlatformRuntimeGet()->fContentScale;
if (dpi > 1.5f) {
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_SDF);
} else {
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_AA_MESH);
}将以下代码保存为 ch32_main.c,编译后运行即可对比 AA-Mesh 与 SDF 两种渲染模式的边缘质量:
#include "xge.h"
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x081114FF);
// 上半屏:AA-Mesh 模式
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_AA_MESH);
xgeShapeCircleFill(200, 180, 80, 0x4FD8C2FF);
xge_rect_t r1 = { 350, 120, 180, 120 };
xgeShapeRoundRectFill(r1, 24.0f, 0xFFB454FF);
// 下半屏:SDF 模式
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_SDF);
xgeShapeCircleFill(200, 430, 80, 0x4FD8C2FF);
xge_rect_t r2 = { 350, 370, 180, 120 };
xgeShapeRoundRectFill(r2, 24.0f, 0xFFB454FF);
// 恢复默认
xgeShapeRenderModeSet(XGE_SHAPE_RENDER_AA_MESH);
// 查询当前模式
int mode = xgeShapeRenderModeGet();
(void)mode;
return XGE_OK;
}
int main(void) {
xge_desc_t d = {0};
d.iWidth = 800;
d.iHeight = 600;
d.sTitle = "ch32 - AA-Mesh vs SDF";
d.iFlags = XGE_INIT_VSYNC;
xgeInit(&d);
xgeRun(onFrame, NULL);
xgeUnit();
return 0;
}xgeShapeRenderModeSet,对不同图形使用不同渲染算法。xgeShapeRenderModeSet 控制所有图元;xgeShapeRoundRectModeSet 仅控制圆角矩形(第 30 章)。