理解 XGE 中深度缓冲的作用,学习如何启用/禁用深度测试来控制图元的前后遮挡关系。
在纯 2D 渲染中,绘制顺序决定了遮挡关系(后画的覆盖先画的)。但当使用透视投影或 3D 变换(如 xgeDrawQuad3D)时,仅靠绘制顺序无法正确处理遮挡——这时需要深度缓冲(Z-Buffer)。
XGE 默认关闭深度测试。开启后,每个片元在写入颜色缓冲前会与深度缓冲比较,只有"更近"的片元才能通过。
| 函数 | 说明 |
|---|---|
void xgeDepthTestSet(int bEnabled) | 启用(1)或禁用(0)深度测试 |
int xgeDepthTestGet(void) | 查询当前深度测试状态(1=开启) |
gcc -O2 -I. -o ch13.exe ch13_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch13.exe
static int onFrame(void* pUser) {
xgeClear(0x081114FF);
// 开启深度测试
xgeDepthTestSet(1);
// 使用透视相机(见第 15 章)
xge_camera_t cam = xgeCameraPerspective(
800, 600, // 视口尺寸
60.0f, // FOV
0.1f, // 近裁剪面
1000.0f // 远裁剪面
);
xgeCameraSet(&cam);
// 绘制 3D 四边形(深度测试确保正确遮挡)
// xgeDrawQuad3D(...);
// 2D 绘制前关闭深度测试
xgeDepthTestSet(0);
return XGE_OK;
}// 保存当前状态
int bWasDepth = xgeDepthTestGet();
// 临时开启
xgeDepthTestSet(1);
// ... 3D 绘制代码 ...
// 恢复原始状态
xgeDepthTestSet(bWasDepth);| 场景 | 推荐方式 |
|---|---|
| 2D UI / HUD | 关闭深度测试,靠绘制顺序 |
| 2.5D 等距视角 | 关闭深度测试,手动排序 |
| 透视 3D 场景 | 开启深度测试 |
| 粒子系统(加法混合) | 关闭深度测试(避免粒子被裁切) |
将以下代码保存为 ch13_main.c,编译后运行即可观察深度测试状态切换:
#include "xge.h"
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x081114FF);
// 查询并显示当前深度测试状态
int bDepth = xgeDepthTestGet();
// 按空格键切换深度测试
if (xgeKeyPressed(XGE_KEY_SPACE)) {
xgeDepthTestSet(!bDepth);
}
// 绘制两个重叠矩形(观察遮挡关系)
xgeShapeRectFill(200, 200, 250, 200, 0x4FD8C2FF);
xgeShapeRectFill(350, 250, 250, 200, 0xFF6B5EFF);
return XGE_OK;
}
int main(void) {
xge_desc_t d = {0};
d.iWidth = 800;
d.iHeight = 600;
d.sTitle = "ch13 - Depth Test";
d.iFlags = XGE_INIT_VSYNC;
xgeInit(&d);
xgeRun(onFrame, NULL);
xgeUnit();
return 0;
}xgeDepthTestGet() 返回当前深度测试状态(0=关闭,1=开启)。xgeDepthTestSet(!bDepth) 取反当前状态,实现一键切换。