【UE】如何手搓一个完美贴合地形的 Mesh Decal(面片贴花)

QQ20260508-122142-HD

在UE5开发中,我们经常需要在地面上放置道路标志线又或者魔法阵、裂缝、血迹等图案。

如果直接放一个半透明的面片,遇到高低不平的地形必然会穿模。

虽然官方推荐使用 Decal Actor,但在某些需要复杂顶点动画、粒子特效绑定或特殊Mesh拓扑的场景下,我们必须使用实体面片来实现贴花效果。

今天就来分享一下,如何纯靠材质节点让一个普通的半透明面片像投影仪一样,完美"印"在模型表面。

思路

  1. 读取屏幕深度(SceneDepth),反推面片背后地形的绝对世界坐标。
  2. 将世界坐标转换到面片的局部空间,生成投影UV。
  3. 限制UV范围,防止贴图平铺重复。

Step 1:利用深度反推地形世界坐标

要把图案贴在地形上,首先得知道地形在哪。我们通过相机向量和场景深度来重建世界坐标:

  1. 将 Camera Vector 和 Camera Direction Vector 进行 Dot Product(点乘)。
  2. 用 SceneDepth 除以(Divide)上一步的结果。
  3. 把结果乘以(Multiply)Camera Vector。
  4. 最后加上(Add)Camera Position。

公式:
地形世界坐标 = CameraPosition + CameraVector * (SceneDepth / Dot(CamVec, CamDir))

这样我们就拿到了面片背后每一个地形像素的绝对坐标。

Step 2:世界坐标转局部UV(避坑指南)

拿到世界坐标后,我们需要将其转换为面片的局部UV。

但是在某些渲染管线例如贴花域下, TransformPosition 会失效。最稳妥的做法是用向量点乘手动投影:

  1. 获取相对位置:地形世界坐标 - ObjectPositionWS。
  2. 获取面片朝向:用两个常量向量 (1,0,0) 和 (0,1,0) 分别连接 TransformVector(Local to World),得到面片的世界空间X轴和Y轴。
  3. 将相对位置分别与这两个轴进行 Dot。
  4. 用 Append 把两个点乘结果组合起来,除以你的面片尺寸Size,再加上 0.5回归到0-1的UV区间。

这样算出来的UV,无论你的面片怎么旋转、缩放,贴图都会跟住模型表面进行投影。

Step 3:防止贴图重复(终极性能优化)

算出的投影UV超出了 0~1 的范围时,贴图默认会平铺(Wrap)。

不过怎么抠掉边缘最快?

方案A:纯数学Mask(5个节点)

将算好的UV接 Floor -> Abs -> 与 (1,1) 进行 Dot -> Saturate -> OneMinus。

这个算法极度廉价,只要UV超出0~1,输出就是0,否则是1。

方案B:某些情况可以零开销

连节点都不用写!

  1. 确保你的贴图四周有 至少1像素的纯透明边缘 。
  2. 打开贴图资产,将 X/Y-axis Tiling Method 从 Wrap 改为 Clamp 。
    利用Clamp的特性,超出范围的UV会无限采样边缘的那一圈透明像素.

蓝图如下:

Step 4:剔除拉伸与穿透

如果不加限制,投影会无限向下延伸,并且在悬崖处产生严重的垂直拉伸。

  • 法线遮罩(防拉伸): 采样 SceneTexture: WorldNormal,与朝上的向量 (0,0,1) 进行点乘。平地为1,峭壁为0,用作Opacity的乘数。
  • 深度遮罩(防穿透): 用 SceneDepth - PixelDepth 算出深度差,除以一个允许的投影厚度值,接 1-x 和 Saturate。这样投影过深的地方就会自然淡出。

我这次不需要处理这部分,就不做演示了



相关推荐
mengzhi啊18 小时前
UE5 沙漠添加植物,然后在湖泊游泳。关键词:湖泊使用蓝图的重叠事件,湖泊的碰撞偏移。所有的物体都可以使用蓝图来使用它
ue5
总要学点什么2 天前
第96篇:三维数据加载-城市建筑白模样式+着色器——让色带按体量上色,最白的那档却涂不上去
前端·gis·webgl·cesium·着色器·空间分析·白模
总要学点什么3 天前
第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算
前端·gis·webgl·cesium·着色器·空间分析·白模
Martina_03213 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
ue星空3 天前
UE径向模糊+色差材质制作
材质
总要学点什么3 天前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
Martina_03214 天前
AI生成3D场景从白模换成精模后镜头全偏了?用6步检查单位、枢轴与层级替换
图像处理·人工智能·3d·ai·自然语言处理·材质·1024程序员节
敢敢のwings5 天前
机器人如何通过触觉认识物体:从材质分类到接触状态判断
分类·机器人·材质
Zhichao_978 天前
【UE5.8】VS2026安装
ue5
DolitD8 天前
UE像素流与云渲染技术方案对比分析
3d·云原生·ue5·云计算·图形渲染