
1. 项目概述为什么深度图和Mask图是UE5渲染的“隐藏王牌”如果你在UE5里鼓捣过一阵子渲染大概率会听过“深度图”和“Mask图”这两个词。它们不像基础颜色、法线贴图那样直接决定物体长什么样但在很多高级效果和后期处理环节它们才是真正的幕后操盘手。简单来说深度图记录了场景中每个像素到摄像机的距离信息是一张灰度图越白代表越近越黑代表越远。而Mask图或叫模板图、ID图则是一种“分类标签”它可以把场景中的特定物体比如角色、武器、特定建筑单独标记出来渲染成一张纯色的、易于程序识别的图像。为什么说它们是“王牌”因为现代游戏和影视级的实时渲染早已不满足于“一镜到底”的最终画面。你需要把画面拆解成不同的“图层”在后期进行更精细、更灵活的合成与调整。比如你想单独给远处的山脉加一层雾气或者只让主角在特定时刻发光又或者实现那种电影里常见的“子弹时间”景深模糊效果甚至是为后续的计算机视觉任务如刚才热词里提到的“深度图转点云”、“foundationpose输入”准备数据都离不开这两张图。UE5.6在渲染管线、虚拟几何体、Nanite等方面持续进化对深度和Mask数据的生成与控制也提供了更强大、更稳定的支持。这篇文章我就以一个实际项目为例带你从零开始在UE5.6中完整配置并运用深度图和Mask图打通从项目设置、材质编写、渲染输出到后期处理的全流程。无论你是想提升画面表现的技术美术还是需要特定数据输出的图形程序员或是好奇高级渲染流程的开发者这套实战经验都能让你直接上手。2. 核心思路与项目配置奠定数据输出的基础在动手写任何材质或蓝图之前正确的项目设置是确保深度和Mask数据能被正确渲染出来的第一步。很多新手卡在第一步就是因为没搞清楚这几个关键开关在哪里以及它们之间的依赖关系。2.1 深度图渲染的全局开关与精度选择深度信息的渲染在UE5里是默认开启的但我们需要关心的是它的精度和范围。进入“编辑” - “项目设置”在“渲染”分类下找到“早期Z通道”和“遮挡剔除方法”相关设置。对于深度图应用我强烈建议保持“早期Z通道”启用它能提前进行深度测试优化性能并为后续的深度读取提供一致的数据基础。更关键的是“深度缓冲位数”的考量。在“平台”-“Windows”-“RHI”下你可以选择深度缓冲的精度。默认的“24位深度8位模板”对于大多数情况够用但如果你做的场景纵深特别大比如开放世界可能会遇到Z-fighting深度冲突问题即距离非常接近的表面出现闪烁。这时可以考虑使用“反转的深度缓冲”这是一种现代图形API如DX12 Vulkan常用的技术它用浮点数的精度优势来更好地处理远距离物体能显著缓解远距离的深度冲突。在UE5.6中你可以在控制台命令中尝试r.DepthReversal来测试效果但生产环境更改需要评估兼容性。注意深度图本身是引擎内部用于可见性判断的数据我们要把它“提取”出来还需要通过后处理材质或渲染目标Render Target来捕获。这一步我们稍后详解。2.2 Mask图渲染的核心自定义深度-模板通道这是Mask图渲染的基石也是很多教程会强调但未必讲透的一点。同样在“项目设置”-“渲染”中找到“自定义深度-模板通道”选项。你必须将其从默认的“禁用”或“仅深度”改为“启用带模板”。这个选项的名字有点误导性。“自定义深度”和“自定义模板”其实是两个独立但相关的功能。启用“带模板”后引擎会为Mesh分配一个额外的“模板值”缓冲区。我们可以通过材质或Actor属性为任何Mesh指定一个唯一的整数值通常是0到255但实际可用范围取决于硬件这个值就会被写入到这张“模板缓冲区”中最终形成我们需要的Mask图也叫ID图、对象缓冲区。为什么必须启用“带模板”因为如果只启用“仅深度”你只能得到另一张深度图而无法获得基于对象的分类信息。只有启用了模板你才能给物体“贴标签”。改完这个设置后记得重启编辑器以确保渲染管线状态完全更新。2.3 为物体“贴标签”分配自定义深度/模板值设置好项目后下一步就是告诉引擎哪些物体需要被标记到Mask图里。有两种主要方式方式一通过Actor属性批量设置。在世界大纲视图中选中一个或多个静态网格体ActorStaticMeshActor在细节面板中搜索“Render”你会找到“Render CustomDepth”和“Custom Depth Stencil Value”两个属性。勾选“Render CustomDepth”这个物体就会被纳入自定义深度/模板的渲染流程。然后在“Custom Depth Stencil Value”里填一个数字比如1代表主角2代表敌人3代表可交互物品等。这个值最终会体现在Mask图的颜色或灰度中。方式二通过材质节点精细控制。在材质编辑器中你可以使用“Custom Depth”和“Custom Stencil”节点。这提供了更灵活的控制比如你可以根据材质参数动态改变模板值或者只在材质的某些部分通过Mask启用自定义深度。将“Custom Depth”节点连接到“自定义深度”输入引脚并将“Custom Stencil Value”节点连接到“自定义模板值”输入引脚即可。这种方式适合需要基于材质逻辑进行复杂标记的情况。实操心得对于大量需要标记的物体用蓝图或Python脚本批量设置Actor属性效率更高。可以写一个简单的循环遍历特定文件夹下的所有资产或场景中特定标签的Actor自动为它们分配递增的模板值避免手动设置出错和遗漏。3. 捕获与可视化将数据变成可用的纹理配置好物体后我们如何在运行时“看到”或“拿到”这些深度和Mask数据呢引擎不会直接把它们作为最终输出我们需要通过后处理材质来捕获。3.1 深度数据的捕获与线性化处理在后处理材质或在场景捕获的材质中我们可以通过“Scene Texture”节点获取深度信息。将其“场景纹理ID”设置为“Custom Depth”或“Scene Depth”。两者有细微区别“Scene Depth”是主深度缓冲区的信息包含所有不透明物体的深度“Custom Depth”则只包含那些启用了“Render CustomDepth”的物体的深度。根据你的需求选择。直接采样到的深度值是非线性的通常是透视投影后的深度范围在0到1之间但分布不均匀。对于很多后期效果如雾效、景深和数据分析如转点云我们需要线性深度即物体到摄像机的真实距离以世界单位或某种线性比例表示。转换线性深度的关键步骤在材质中完成。核心是利用摄像机的近平面和远平面距离可以通过“Camera Position WS”等节点获取或作为参数传入以及投影矩阵的知识进行反算。一个常见的公式是LinearDepth NearPlane * FarPlane / (FarPlane - DepthSample * (FarPlane - NearPlane))在UE材质中你可以通过“Custom Node”编写HLSL代码或者使用一些社区提供的函数库节点来实现。将计算出的线性深度归一化到0-1范围除以FarPlane就能得到一张直观的线性深度图白色代表近处黑色代表远处灰度过渡是均匀的。3.2 Mask图的渲染与颜色编码Mask图的获取相对直接。在后处理材质中使用“Scene Texture”节点并将“场景纹理ID”设置为“Custom Stencil”。采样后你得到的是一个单通道的整数值对应之前设置的模板值。为了便于可视化或输出为图像我们通常需要把它编码成颜色。最简单的编码是灰度编码直接将模板值除以最大值如255得到一个0-1的灰度值。这样不同ID的物体会显示为不同灰度的白色。 更常用的是伪彩色编码这样人眼更容易区分相邻的ID。我们可以写一个简单的函数将模板值映射到RGB颜色。例如取模板值的低几位分别作为R、G、B的输入生成鲜艳且差异明显的颜色。在材质中可以用“Frac”和“乘法”等节点来构造一个简单的哈希映射。注意事项模板缓冲区精度通常是8位这意味着你最多有256个不同的ID0-255。ID 0通常有特殊用途表示未写入/背景所以实际可用的ID是1-255。规划好你的ID分配方案避免冲突。对于超过255个物体的需求需要考虑分层渲染或其他编码方案。3.3 使用场景捕获组件Scene Capture输出独立图像后处理材质让我们能在屏幕上叠加查看这些信息但如果我们想将深度图或Mask图保存为独立的图像文件如PNG、EXR序列或者传输给其他系统如热词中提到的“foundationpose输入”就需要用到“场景捕获组件”Scene Capture Component。创建场景捕获Actor在放置面板中搜索“Scene Capture 2D”将其拖入场景。调整其位置和旋转使其对准你想要捕获的区域。配置捕获属性在细节面板中关键设置包括纹理目标Texture Target创建一个新的“渲染目标Render Target 2D”资产并指定给它。这个资产将保存捕获的图像。捕获源Capture Source这是核心设置。要捕获深度选择“最终颜色Final Color”并在材质中处理深度或者更直接地在UE5.6中你可以尝试使用“场景深度Scene Depth”作为源但可能需要配合自定义渲染通道。更通用的方法是设置为“最终颜色”然后为这个场景捕获单独指定一个后处理材质该材质只输出我们处理好的深度或Mask信息。后期处理材质Post Process Material在这里指定你编写的、用于提取并编码深度或Mask的后处理材质。渲染与保存在运行时场景捕获组件会根据其设置更新其纹理目标。你可以通过蓝图或C读取这个渲染目标的数据保存为磁盘文件或通过网络发送。对于序列帧输出可以每帧触发一次捕获并保存。4. 核心应用实战从屏幕效果到数据管道有了深度图和Mask图我们能做什么下面通过几个典型场景把理论知识变成实际效果。4.1 后期处理效果景深与雾气这是深度图最经典的应用之一。景深Depth of Field虚幻引擎内置的景深效果如Bokeh DOF严重依赖场景深度信息。它根据深度值决定哪些像素是清晰的焦平面哪些应该模糊前景和背景。你可以通过后处理体积Post Process Volume控制焦平面距离和模糊强度。更高级的玩法是利用Mask图实现选择性景深比如只模糊背景中的特定物体ID为某值的敌人而保持主角和其他环境清晰。这需要你自定义景深逻辑在后期材质中根据Mask ID来调制模糊强度。距离雾Distance Fog基于线性深度可以轻松实现逼真的指数高度雾或线性距离雾。公式通常是FogFactor exp(-Density * LinearDepth)。将计算出的雾效因子与场景颜色混合即可。结合Mask图你可以实现分层雾例如只对山谷特定ID区域添加浓雾而山顶保持清晰。4.2 屏幕空间特效边缘检测与距离遮罩基于深度的边缘检测Depth Edge Detection对深度图进行索贝尔Sobel或罗伯茨Roberts等边缘检测滤波可以快速找出场景中深度不连续的地方即物体的轮廓。这可以用来制作卡通描边、碰撞高亮或者特殊的视觉特效。实现时注意先对深度图进行适当的模糊以减少噪声带来的锯齿状边缘。距离遮罩Distance Mask利用线性深度创建一张遮罩用于控制其他效果的范围。例如制作一个“扫描雷达”效果扫描波从摄像机由近及远推进。你可以用当前时间乘以速度得到一个“当前扫描距离”然后与每个像素的线性深度比较深度值接近扫描距离的像素显示高亮。公式类似Mask saturate(1.0 - abs(LinearDepth - ScanDistance) / ScanWidth)。4.3 数据输出与外部应用点云与位姿估计这是深度图在非图形学领域的重要应用也呼应了热词中的“深度图转点云”和“foundationpose输入”。深度图转点云原理是将深度图中的每个像素根据其2D屏幕坐标和深度值反投影回3D世界空间。需要的数据包括深度图线性深度、摄像机的内参矩阵焦距、主点和外参矩阵位置、旋转。在UE中你可以通过摄像机组件获取视图-投影矩阵及其逆矩阵。在蓝图或C中对深度图每个像素执行以下步骤将像素坐标归一化到NDC空间-1到1。结合线性深度构成一个3D点x, y, depth。用摄像机的投影矩阵的逆矩阵乘以这个点将其转换到视图空间。再用视图矩阵的逆矩阵乘以这个点得到世界空间坐标。 将所有这些点可能还需要结合RGB颜色从场景颜色图获取保存为PLY、PCD等点云格式即可被CloudCompare、MeshLab等软件或深度学习框架读取。为FoundationPose等CV任务准备数据像FoundationPose这样的6D物体位姿估计算法通常需要RGB图像和对应的深度图作为输入。你需要确保尺寸对齐RGB图和深度图必须分辨率完全一致。使用场景捕获组件可以保证这一点。坐标系与精度算法通常需要的是对齐的深度即深度图中每个像素的值直接对应RGB图中同位置像素的物体距离以米为单位。这就是为什么我们之前强调要使用线性深度并确保深度值与世界单位米对应。你需要验证从UE输出的深度值例如0-1范围代表0到FarPlane米是否符合算法预期的数值范围可能需要缩放。数据同步确保每一帧的RGB和深度图是严格同一时刻捕获的。使用同一个场景捕获组件在同一帧触发捕获两个渲染目标一个配置为最终颜色另一个配置为经过深度处理的材质输出是最可靠的方法。5. 性能优化与疑难排坑开启自定义深度和模板渲染以及全屏的后处理材质采样都会带来性能开销。在移动平台或复杂场景中需要精打细算。5.1 性能开销分析与优化策略开销来源额外的渲染通道启用“Render CustomDepth”的物体会被多渲染一次或一次额外的Pass增加了顶点着色和像素着色的负担。这是最主要的开销。带宽占用自定义深度/模板缓冲区需要额外的显存带宽来读写。后处理材质采样全屏采样场景纹理尤其是深度纹理和复杂的计算如线性化、边缘检测会消耗GPU算力。优化策略最小化标记对象只对确实需要在后期处理或数据输出中用到的物体启用“Render CustomDepth”。不要图省事给所有物体都勾上。使用LOD确保自定义深度渲染也遵循模型的LOD细节层次系统。为远距离物体使用低模版本进行深度渲染可以节省大量顶点处理开销。降低捕获分辨率如果不是用于最终高清输出场景捕获组件的纹理目标可以设置较低的分辨率。例如用于实时数据处理的Mask图分辨率可能不需要和屏幕一样高。简化后处理材质在材质编辑器中使用“Stat”视图查看指令数。优化复杂的数学运算减少纹理采样次数。考虑将一些计算移到更低精度的通道或者使用查找表LUT来替代实时计算。按需更新如果深度/Mask数据不需要每帧更新例如静态场景的Mask可以设置场景捕获组件为“仅手动更新”或降低其更新频率。5.2 常见问题与解决方案实录问题一自定义深度/模板渲染不生效物体在Mask图中看不到。排查步骤检查项目设置确认“自定义深度-模板通道”已设置为“启用带模板”并已重启编辑器。检查Actor属性选中物体确认“Render CustomDepth”已勾选且“Custom Depth Stencil Value”非00通常被视为背景。检查材质如果通过材质控制确保材质中“Custom Depth”节点已正确连接并且材质的“Blend Mode”不是“Translucent”半透明物体渲染到自定义深度需要特殊处理通常更复杂。检查后处理材质确保“Scene Texture”节点的“场景纹理ID”正确设置为“Custom Stencil”并且材质已应用到后处理体积或场景捕获组件。检查渲染顺序某些后期处理效果可能会覆盖或清除自定义模板缓冲区。尝试禁用其他后处理材质进行隔离测试。问题二深度图边缘出现锯齿或闪烁Z-fighting。原因与解决精度不足这是最常见原因。尝试启用“反转的深度缓冲”如果平台支持。在项目设置的“渲染”-“优化”下可以找到相关实验性选项。多边形重叠检查模型是否存在共面或极度接近的面。在建模软件中确保模型干净避免不必要的几何体重叠。深度偏差Depth Bias对于Decals贴花或特殊材质可以适当调整“深度偏差”值强制让多边形在深度测试中稍微提前或延后避免冲突。但需谨慎使用过度调整可能导致“彼得潘”阴影阴影与物体分离。问题三线性深度计算错误远处物体距离值异常。排查步骤验证近远平面确保传入深度线性化公式的NearPlane和FarPlane值与当前摄像机的设置一致。最好通过蓝图获取摄像机组件的这些属性动态传入材质。检查深度采样源确认你采样的是“Scene Depth”还是“Custom Depth”。两者的值域和用途可能略有不同。“Custom Depth”可能只包含特定物体其未覆盖的区域深度值为0或1可能导致计算错误。公式实现在材质中仔细核对线性化公式的每一个步骤确保除法和减法顺序正确。建议将中间计算结果如(FarPlane - NearPlane)作为参数先计算出来避免复杂表达式导致的错误。问题四场景捕获输出的图像全黑或全白。排查步骤检查渲染目标确认创建的“Render Target 2D”格式正确例如对于Mask伪彩图可能需要RGBA8。检查捕获源与材质如果捕获源是“最终颜色”但后处理材质输出的是单通道的深度或Mask数据需要确保材质输出节点的“材质域”设置为“后期处理”并且其输出是有效的RGB或RGBA值。单通道的灰度值需要复制到RGB三个通道。检查光照如果场景完全没有光照捕获的“最终颜色”可能就是黑的。确保场景有光源或者使用“无光照”模式进行捕获。更新策略确认场景捕获组件不是“仅捕获一次”且早已完成而后续场景发生了变化。将其设置为“每帧捕获”或在需要时手动调用“捕获场景”函数。6. 进阶技巧与扩展思路掌握了基础流程后可以探索一些更高级的用法让深度和Mask数据发挥更大威力。6.1 多Mask图层管理与复合编码当你需要标记的物体类型超过255种时单通道的8位模板缓冲区就不够用了。解决方案是分层渲染或复合编码。分层渲染使用多个场景捕获组件每个组件配置不同的后处理材质只捕获特定ID范围的物体。例如第一层捕获ID 1-100环境物体第二层捕获ID 101-200角色然后将多张Mask图合成使用。这需要额外的管理和合成开销。复合编码推荐利用RGB三个通道各8位共同编码一个ID。这样你就有24位可以表示超过1600万种ID。在材质中你可以将一个大ID拆分成R、G、B三个部分。例如R floor(ID / (256*256))G floor((ID % (256*256)) / 256)B ID % 256。在读取时再反向解码。这只需要一次渲染但编码解码逻辑稍复杂。6.2 与 Niagara粒子系统的深度交互深度图可以极大地增强粒子效果的真实感。深度碰撞在Niagara粒子系统中你可以采样场景深度图。通过比较粒子的屏幕空间深度与场景深度可以检测碰撞。当粒子深度大于场景深度即粒子跑到物体后面了你可以让粒子消亡、反弹或改变颜色实现粒子与场景几何体的完美交互而无需昂贵的物理碰撞检测。深度消隐让粒子在靠近场景表面时淡出模拟雪花落在物体表面融化、灰尘附着等效果。同样是通过比较粒子深度和场景深度当差值小于某个阈值时逐渐将粒子的Alpha值减为0。基于深度的参数控制用深度值来驱动粒子的属性比如根据粒子所在位置的深度距离来改变其大小、颜色或运动速度模拟大气透视效果。6.3 程序化生成与动态物体ID分配对于动态生成的物体如刷怪系统生成的敌人、随机放置的宝箱需要动态分配唯一的模板值。蓝图管理可以创建一个全局的ID管理器Actor或游戏实例GameInstance蓝图。它维护一个当前可用的ID池如1-255。当一个动态物体需要被标记时向管理器请求一个ID管理器分配一个未使用的ID并记录。物体销毁时将其ID归还给池子。材质参数集合Material Parameter Collection可以将当前需要高亮的物体ID存储在一个材质参数集合中。在后处理材质中读取这个集合并与每个像素的模板值比较如果匹配则对该像素应用高亮效果如外发光。这样可以实现“选中物体高亮”的效果而无需为每个物体单独创建材质实例。深度图和Mask图是现代实时渲染管线中不可或缺的“元数据”。它们搭建起了从3D场景到2D图像再到更高级别应用视觉特效、数据分析的桥梁。在UE5.6中随着渲染管线的日益成熟利用好这些工具能让你的项目在视觉表现力和功能性上都更上一层楼。最关键的是理解其原理然后大胆地在项目中实践、调试和优化。