news 2026/5/31 7:13:11

鸿蒙开发-想控制光线追踪的范围?RT可见掩码怎么用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙开发-想控制光线追踪的范围?RT可见掩码怎么用

在 3D 游戏里,阴影和环境光遮蔽(Ambient Occlusion,AO)是让画面看起来"立体"的两个关键因素。没有阴影,物体会显得"飘"在地面上;没有 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_tpropertyCount=0;HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,NULL);XEG_ExtensionProperties*properties=malloc(sizeof(XEG_ExtensionProperties)*propertyCount);HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,properties);bool supported=false;for(uint32_ti=0;i<propertyCount;i++){if(strcmp(properties[i].extensionName,XEG_RT_SHADOW_AO_EXTENSION_NAME)==0){supported=true;break;}}free(properties);if(!supported)return;

XEG_RT_SHADOW_AO_EXTENSION_NAME的值是"XEG_rt_shadow_ao"

创建 XEG_RTVisibleMask 对象

XEG_RTVisibleMask rtVisibleMask=VK_NULL_HANDLE;XEG_RTShadowAOCreateInfo createInfo={// 阴影和AO的配置信息};VkResult result=HMS_XEG_CreateRTVisibleMask(device,&createInfo,&rtVisibleMask);if(result!=VK_SUCCESS){// 创建失败return;}

HMS_XEG_CreateRTVisibleMask的三个参数:

  • deviceVkDevice
  • pCreateInfo:创建信息结构体指针,当前仅支持XEG_RTShadowAOCreateInfo类型
  • pRTVisibleMask:输出句柄的指针

XEG_RTShadowAOCreateInfo结构体包含了阴影和 AO 的初始化配置。创建参数变化时需要重建对象。

录制渲染命令

XEG_RTShadowAODescription description={// 当前帧的渲染参数};VkResult result=HMS_XEG_CmdRenderRTVisibleMask(commandBuffer,rtVisibleMask,&description);if(result!=VK_SUCCESS){// 命令录制失败}

HMS_XEG_CmdRenderRTVisibleMask的三个参数:

  • commandBufferVkCommandBuffer
  • rtVisibleMask:已创建的XEG_RTVisibleMask对象
  • pDescription:当前仅支持XEG_RTShadowAODescription类型

相关参数结构体

RT VisibleMask 涉及几个参数结构体,分别控制不同的效果:

XEG_RTShadowParameters:阴影参数

控制阴影效果的具体参数,比如光源方向、阴影的软硬度等。

XEG_RTAOParameters:AO 参数

控制环境光遮蔽效果的参数,比如采样半径、采样数量等。

XEG_RTShadowAODenoiserParameters:去噪参数

光线追踪的结果通常会有噪点(因为采样数量有限),这个结构体控制去噪算法的行为。

去噪有几种模式可选(通过XEG_DenoiseQualityMode枚举):

enumXEG_DenoiseQualityMode{XEG_DENOISE_QUALITY_MODE_NONE=0,// 不去噪XEG_DENOISE_QUALITY_MODE_QUALITY=1,// 高质量去噪(可能较慢)XEG_DENOISE_QUALITY_MODE_BALANCED=2,// 平衡模式XEG_DENOISE_QUALITY_MODE_PERFORMANCES=3// 高性能模式};
  • NONE:不做去噪,适合采样率很高、噪点已经很少的情况
  • QUALITY:最高质量的去噪,效果最好但可能较慢
  • BALANCED:质量和性能的平衡
  • PERFORMANCES:优先保证性能,去噪质量可能稍差

遍历模式

XEG_TraversalMode枚举控制光线追踪的遍历方式:

enumXEG_TraversalMode{XEG_TRAVERSAL_MODE_DEFAULT=0,// 逐像素遍历XEG_TRAVERSAL_MODE_PERFORMANCES=1// 算法优化遍历,更快但可能有细微画质差异};
  • DEFAULT:逐像素进行光线追踪场景遍历,最准确
  • PERFORMANCES:通过算法优化来加速遍历,性能更好但画质可能有细微差别

销毁对象

HMS_XEG_DestroyRTVisibleMask(rtVisibleMask);

完整流程

// 1. 查询扩展uint32_tpropertyCount=0;HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,NULL);XEG_ExtensionProperties*properties=malloc(sizeof(XEG_ExtensionProperties)*propertyCount);HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,properties);bool supported=false;for(uint32_ti=0;i<propertyCount;i++){if(strcmp(properties[i].extensionName,XEG_RT_SHADOW_AO_EXTENSION_NAME)==0){supported=true;break;}}free(properties);if(!supported)return;// 2. 创建对象XEG_RTVisibleMask rtVisibleMask=VK_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);

使用场景

  1. 室内场景:房间的角落、家具之间的缝隙,AO 能让这些地方看起来更真实
  2. 角色阴影:光线追踪阴影比 Shadow Map 更准确,不会有锯齿和 peter-panning 问题
  3. 植被渲染:树木、草地的阴影和自遮蔽效果
  4. 建筑场景:建筑物之间的互相遮挡产生的阴影和 AO

使用建议

去噪模式的选择流程:

很高 噪点很少

一般

充足

适中

紧张

选择去噪模式

采样率高吗?

NONE 不去噪

性能预算?

QUALITY 高质量去噪

BALANCED 平衡模式

PERFORMANCES 高性能模式

遍历模式选择

画质优先?

DEFAULT 逐像素遍历

PERFORMANCES 算法优化遍历

  1. 选择合适的去噪模式:如果性能预算充足,用 QUALITY 模式;如果需要兼顾性能,用 BALANCED 或 PERFORMANCES 模式。如果采样率很高(噪点很少),可以考虑不开去噪(NONE)。

  2. 遍历模式的取舍:DEFAULT 模式最准确,PERFORMANCES 模式更快。建议先用 DEFAULT 模式看看效果,如果性能不够再切到 PERFORMANCES。

  3. 阴影和 AO 可以单独使用:虽然这个特性叫"ShadowAO",但你可以只开阴影、只开 AO、或者两个都开,取决于你的需求。

  4. 注意命令缓冲类型:和 RT Reflection 一样,需要使用 Primary 类型的命令缓冲。

  5. 性能考虑:光线追踪的计算量和场景复杂度、分辨率成正比。如果性能紧张,可以考虑在较低分辨率下计算阴影/AO,然后上采样到最终分辨率。

RT VisibleMask 是让游戏画面从"能看"到"好看"的关键一步。虽然接入成本不低,但效果提升是立竿见影的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 7:13:07

鸿蒙开发-想让手机知道自己在哪?AR Engine的SLAM运动跟踪

你有没有想过一个问题&#xff1a;AR 应用是怎么知道手机在现实世界里移动了多少、转了多少度的&#xff1f; 比如说你在玩一个 AR 游戏&#xff0c;把一个虚拟小人放在桌面上&#xff0c;然后你拿着手机绕桌子走一圈。小人始终稳稳地站在那个位置&#xff0c;不会乱跑。这背后…

作者头像 李华
网站建设 2026/5/31 7:10:42

去中心化自治供应链:用区块链与智能合约重塑工业信任与协同

1. 项目概述&#xff1a;当供应链遇上“去中心化自治”如果你在工业领域摸爬滚打过几年&#xff0c;一定会对供应链的“黑箱”和“摩擦”深有体会。一笔订单从客户下单到最终交付&#xff0c;中间要经过多少环节&#xff1f;原材料采购、生产排期、物流运输、清关、仓储、分销……

作者头像 李华