你在玩游戏的时候有没有注意到阳光照进房间墙壁会被染上淡淡的红色光线从窗户射进来在地板上形成的光斑会照亮周围的物体。这些现象叫全局光照Global IlluminationGI——光线不只从光源直接照射物体还会在物体之间反弹产生间接光照。传统的做法是用烘焙Lightmap来模拟 GI但烘焙是静态的不能响应动态光源和动态物体。XEngine 的 RTGIRay Tracing Global Illumination特性通过实时的光线追踪来计算全局光照支持动态场景效果更真实。RTGI 提供了两种实现方式DDGI 和 NNGI。DDGI 和 NNGI 是什么下面是 RTGI 两种实现方式的对比大型开放场景室内或复杂光照选择 RTGI 实现方式场景类型?DDGI 动态漫反射全局光照NNGI 神经网络全局光照在场景中放置探针探针发射光线探测环境光照存储光照信息供着色读取性能好 效果稳定神经网络学习光照分布快速推断间接光照质量高 适应性强DDGIDynamic Diffuse Global Illumination动态漫反射全局光照通过在场景中放置探针Probe来采样光照信息。探针会发射光线去探测周围环境的光照然后把这些信息存储起来着色的时候从探针里读取。优点是性能好、效果稳定适合大场景。NNGINeural Network Global Illumination神经网络全局光照用神经网络来预测全局光照。它学习光照的分布模式然后快速推断出间接光照的效果。优点是质量高、适应性强。两种方式各有优劣你可以根据你的场景和性能需求来选择。查询支持RTGI 需要通过扩展查询确认支持起始版本 6.0.0(20)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_RTGI_EXTENSION_NAME)0){supportedtrue;break;}}free(properties);if(!supported)return;XEG_RTGI_EXTENSION_NAME的值是XEG_rtgi。创建 XEG_RTGI 对象RTGI 对象的创建接口设计得比较特殊——它接受void*类型的创建信息指针根据你传入的结构体类型来决定创建 DDGI 还是 NNGI创建 DDGI 对象XEG_RTGI rtGIVK_NULL_HANDLE;XEG_DDGICreateInfo ddgiCreateInfo{// DDGI 的配置信息// 包括探针的分布、数量、更新频率等};VkResult resultHMS_XEG_CreateRTGI(device,ddgiCreateInfo,rtGI);if(result!VK_SUCCESS){// 创建失败return;}XEG_DDGICreateInfo里需要包含XEG_DDGIVolumeEntryParameters描述每个 DDGI 体积的参数。创建 NNGI 对象XEG_RTGI rtGIVK_NULL_HANDLE;XEG_NNGICreateInfo nngiCreateInfo{// NNGI 的配置信息};VkResult resultHMS_XEG_CreateRTGI(device,nngiCreateInfo,rtGI);if(result!VK_SUCCESS){return;}HMS_XEG_CreateRTGI的三个参数deviceVkDevicepCreateInfo创建信息指针。DDGI 用XEG_DDGICreateInfoNNGI 用XEG_NNGICreateInfopRtGI输出句柄的指针创建参数变化时需要重建对象。录制渲染命令每帧录制 GI 渲染命令。同样用void*来传递描述信息根据创建时的类型来决定用哪种描述结构体DDGI 渲染XEG_DDGIDescription ddgiDesc{// DDGI 的渲染参数// 包括探针更新信息、输出图像等};VkResult resultHMS_XEG_CmdRenderRTGI(commandBuffer,rtGI,ddgiDesc);NNGI 渲染XEG_NNGIDescription nngiDesc{// NNGI 的渲染参数};VkResult resultHMS_XEG_CmdRenderRTGI(commandBuffer,rtGI,nngiDesc);HMS_XEG_CmdRenderRTGI的三个参数commandBufferVkCommandBuffer必须提交到vkQueueSubmit才会执行rtGI已创建的XEG_RTGI对象pDescriptionDDGI 用XEG_DDGIDescriptionNNGI 用XEG_NNGIDescription。不允许为空返回VK_SUCCESS表示命令录制成功。等待 GI 结果GI 的计算可能是异步的。当你需要使用 GI 结果比如在后续的合成步骤中读取 GI 贴图你需要确保 GI 计算已经完成。这时候用HMS_XEG_CmdSetSynchronization来设置同步信号// 录制 GI 渲染命令HMS_XEG_CmdRenderRTGI(commandBuffer,rtGI,description);// 设置同步信号等待 GI 结果写入目标图像HMS_XEG_CmdSetSynchronization(commandBuffer,rtGI);// 后续命令可以安全使用 GI 结果了这个同步接口在 RTGI 场景下非常重要。没有它后续步骤可能会读到还没写完的 GI 数据导致画面闪烁或者错误。质量模式RTGI 支持三种输出质量模式通过XEG_RTGIQualityMode枚举enumXEG_RTGIQualityMode{XEG_RTGI_QUALITY_MODE_QUALITY0,// 质量模式XEG_RTGI_QUALITY_MODE_BALANCED1,// 平衡模式XEG_RTGI_QUALITY_MODE_PERFORMANCE2// 性能模式};QUALITY最高质量适合高端设备或者画质优先的场景BALANCED质量和性能的平衡PERFORMANCE优先保证性能适合中低端设备销毁对象HMS_XEG_DestroyRTGI(rtGI);完整流程RTGI 的完整使用流程如下否是DDGINNGI查询设备是否支持 RTGI 扩展支持?使用传统光照烘焙方案选择实现方式配置探针分布和数量配置神经网络参数创建 XEG_RTGI 对象每帧录制 GI 渲染命令设置同步信号等待结果提交命令缓冲执行GI 结果可用于后续渲染退出时销毁对象// 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_RTGI_EXTENSION_NAME)0){supportedtrue;break;}}free(properties);if(!supported)return;// 2. 创建对象以 DDGI 为例XEG_RTGI rtGIVK_NULL_HANDLE;XEG_DDGICreateInfo createInfo{/* ... */};HMS_XEG_CreateRTGI(device,createInfo,rtGI);// 3. 每帧录制 GI 渲染命令XEG_DDGIDescription desc{/* 当前帧参数 */};HMS_XEG_CmdRenderRTGI(commandBuffer,rtGI,desc);// 4. 设置同步信号HMS_XEG_CmdSetSynchronization(commandBuffer,rtGI);// 5. 提交命令缓冲vkQueueSubmit(queue,1,submitInfo,fence);// 6. 退出时销毁HMS_XEG_DestroyRTGI(rtGI);DDGI 和 NNGI 的选择方面DDGINNGI原理探针采样神经网络推断适合场景大型开放场景室内、复杂光照场景性能相对稳定取决于网络复杂度配置复杂度需要设计探针分布相对简单如果你的场景是开放世界比如大型 RPGDDGI 可能更合适因为探针可以覆盖大范围的区域。如果你的场景是室内或者光照比较复杂比如有很多颜色的灯光NNGI 可能效果更好。使用建议同步很重要GI 计算是异步的一定要在使用 GI 结果之前调用HMS_XEG_CmdSetSynchronization。质量模式从 BALANCED 开始先用平衡模式看看效果和性能再根据情况调整。创建参数要规划好特别是 DDGI 的探针分布这会直接影响 GI 的质量和性能。探针太稀疏会导致 GI 效果不连续太密集会浪费性能。和其他 XEngine 特性配合RTGI 可以和超分、VRS 等特性配合使用。比如在低分辨率下计算 GI然后用超分放大到最终分辨率。RTGI 是让游戏画面达到电影级真实感的关键技术之一。虽然接入成本不低但效果提升是质的飞跃。