在 3D 游戏里阴影和环境光遮蔽Ambient OcclusionAO是让画面看起来立体的两个关键因素。没有阴影物体会显得飘在地面上没有 AO角落和缝隙会显得太亮、不自然。XEngine 的 RT VisibleMask 特性通过光线追踪来计算阴影和 AO效果比传统的 Shadow Map 和 SSAO 更准确。它起始版本是 6.0.0(20)是 Vulkan 专用的特性。什么是 VisibleMask下面是 RT VisibleMask 计算阴影和 AO 的工作原理阴影 Shadow环境光遮蔽 AO是否场景中的每个像素效果类型向光源方向发射光线向周围半球发射多条光线光线被遮挡?该像素在阴影中该像素被光照亮统计周围遮挡物数量遮挡越多像素越暗输出阴影/AO 结果去噪处理得到平滑结果VisibleMask 这个名字可能不太好理解。简单说它做的事情是对场景中的每个像素发射光线去检测哪些东西挡住了光或者周围有多少遮挡物。阴影Shadow从像素位置向光源方向发射光线如果光线被挡住了这个像素就在阴影里环境光遮蔽AO从像素位置向周围半球方向发射多条光线如果附近有很多遮挡物这个像素就比较暗这两种效果本质上都是发射光线 - 检测遮挡所以 XEngine 把它们放在同一个特性里。查询支持uint32_tpropertyCount0;HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,propertyCount,NULL);XEG_ExtensionProperties*propertiesmalloc(sizeof(XEG_ExtensionProperties)*propertyCount);HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,propertyCount,properties);bool supportedfalse;for(uint32_ti0;ipropertyCount;i){if(strcmp(properties[i].extensionName,XEG_RT_SHADOW_AO_EXTENSION_NAME)0){supportedtrue;break;}}free(properties);if(!supported)return;XEG_RT_SHADOW_AO_EXTENSION_NAME的值是XEG_rt_shadow_ao。创建 XEG_RTVisibleMask 对象XEG_RTVisibleMask rtVisibleMaskVK_NULL_HANDLE;XEG_RTShadowAOCreateInfo createInfo{// 阴影和AO的配置信息};VkResult resultHMS_XEG_CreateRTVisibleMask(device,createInfo,rtVisibleMask);if(result!VK_SUCCESS){// 创建失败return;}HMS_XEG_CreateRTVisibleMask的三个参数deviceVkDevicepCreateInfo创建信息结构体指针当前仅支持XEG_RTShadowAOCreateInfo类型pRTVisibleMask输出句柄的指针XEG_RTShadowAOCreateInfo结构体包含了阴影和 AO 的初始化配置。创建参数变化时需要重建对象。录制渲染命令XEG_RTShadowAODescription description{// 当前帧的渲染参数};VkResult resultHMS_XEG_CmdRenderRTVisibleMask(commandBuffer,rtVisibleMask,description);if(result!VK_SUCCESS){// 命令录制失败}HMS_XEG_CmdRenderRTVisibleMask的三个参数commandBufferVkCommandBufferrtVisibleMask已创建的XEG_RTVisibleMask对象pDescription当前仅支持XEG_RTShadowAODescription类型相关参数结构体RT VisibleMask 涉及几个参数结构体分别控制不同的效果XEG_RTShadowParameters阴影参数控制阴影效果的具体参数比如光源方向、阴影的软硬度等。XEG_RTAOParametersAO 参数控制环境光遮蔽效果的参数比如采样半径、采样数量等。XEG_RTShadowAODenoiserParameters去噪参数光线追踪的结果通常会有噪点因为采样数量有限这个结构体控制去噪算法的行为。去噪有几种模式可选通过XEG_DenoiseQualityMode枚举enumXEG_DenoiseQualityMode{XEG_DENOISE_QUALITY_MODE_NONE0,// 不去噪XEG_DENOISE_QUALITY_MODE_QUALITY1,// 高质量去噪可能较慢XEG_DENOISE_QUALITY_MODE_BALANCED2,// 平衡模式XEG_DENOISE_QUALITY_MODE_PERFORMANCES3// 高性能模式};NONE不做去噪适合采样率很高、噪点已经很少的情况QUALITY最高质量的去噪效果最好但可能较慢BALANCED质量和性能的平衡PERFORMANCES优先保证性能去噪质量可能稍差遍历模式XEG_TraversalMode枚举控制光线追踪的遍历方式enumXEG_TraversalMode{XEG_TRAVERSAL_MODE_DEFAULT0,// 逐像素遍历XEG_TRAVERSAL_MODE_PERFORMANCES1// 算法优化遍历更快但可能有细微画质差异};DEFAULT逐像素进行光线追踪场景遍历最准确PERFORMANCES通过算法优化来加速遍历性能更好但画质可能有细微差别销毁对象HMS_XEG_DestroyRTVisibleMask(rtVisibleMask);完整流程// 1. 查询扩展uint32_tpropertyCount0;HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,propertyCount,NULL);XEG_ExtensionProperties*propertiesmalloc(sizeof(XEG_ExtensionProperties)*propertyCount);HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,propertyCount,properties);bool supportedfalse;for(uint32_ti0;ipropertyCount;i){if(strcmp(properties[i].extensionName,XEG_RT_SHADOW_AO_EXTENSION_NAME)0){supportedtrue;break;}}free(properties);if(!supported)return;// 2. 创建对象XEG_RTVisibleMask rtVisibleMaskVK_NULL_HANDLE;XEG_RTShadowAOCreateInfo createInfo{/* ... */};HMS_XEG_CreateRTVisibleMask(device,createInfo,rtVisibleMask);// 3. 每帧准备参数并录制命令XEG_RTShadowAODescription desc{/* 当前帧参数 */};HMS_XEG_CmdRenderRTVisibleMask(commandBuffer,rtVisibleMask,desc);// 4. 提交命令缓冲vkQueueSubmit(queue,1,submitInfo,fence);// 5. 阴影和AO结果可用于后续渲染// 6. 退出时销毁HMS_XEG_DestroyRTVisibleMask(rtVisibleMask);使用场景室内场景房间的角落、家具之间的缝隙AO 能让这些地方看起来更真实角色阴影光线追踪阴影比 Shadow Map 更准确不会有锯齿和 peter-panning 问题植被渲染树木、草地的阴影和自遮蔽效果建筑场景建筑物之间的互相遮挡产生的阴影和 AO使用建议去噪模式的选择流程很高 噪点很少一般充足适中紧张是否选择去噪模式采样率高吗?NONE 不去噪性能预算?QUALITY 高质量去噪BALANCED 平衡模式PERFORMANCES 高性能模式遍历模式选择画质优先?DEFAULT 逐像素遍历PERFORMANCES 算法优化遍历选择合适的去噪模式如果性能预算充足用 QUALITY 模式如果需要兼顾性能用 BALANCED 或 PERFORMANCES 模式。如果采样率很高噪点很少可以考虑不开去噪NONE。遍历模式的取舍DEFAULT 模式最准确PERFORMANCES 模式更快。建议先用 DEFAULT 模式看看效果如果性能不够再切到 PERFORMANCES。阴影和 AO 可以单独使用虽然这个特性叫ShadowAO但你可以只开阴影、只开 AO、或者两个都开取决于你的需求。注意命令缓冲类型和 RT Reflection 一样需要使用 Primary 类型的命令缓冲。性能考虑光线追踪的计算量和场景复杂度、分辨率成正比。如果性能紧张可以考虑在较低分辨率下计算阴影/AO然后上采样到最终分辨率。RT VisibleMask 是让游戏画面从能看到好看的关键一步。虽然接入成本不低但效果提升是立竿见影的。