dot ue4_UE4剖切效果实现

本文介绍了在UE4中实现剖切效果的思路和方法,通过平面方程判断模型裁切,外部使用普通表面材质,内部使用UnLit自发光材质。由于UE4的限制,作者利用多Pass插件解决问题。详细步骤包括设置外部和内部材质,以及如何在蓝图类中应用这些材质。最终效果展示并提及了错误尝试和原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

686785227637da51bf66cc9da6f69e9d.png

前言

思路是使用平面方程来判断模型裁切,之后在另一面使用UnLit的自发光材质显示剖面。但Ue4的BlendingMaterialAttributes不能指定UnLit作为ShaderModel。所以可以使用我之前开发的多Pass插件搞定。

外部普通表面材质

使用平面方程来做一个Mask即可。

6e9f941ab617fb768e8d7bcf9976f99a.png

内部剖面材质

坡面材质需要使用UnLit材质模型,这样就不会有阴影与法线的干扰了。但Unlit不能翻转法线,所以需要再勾选双面渲染选项。

c3ac26d3ae7dbc75150a33e47f6be68d.png

使用方法说明

bluerose:基于插件的SkeletalMesh多Pass绘制方案​zhuanlan.zhihu.com
  1. 使用上面链接介绍的代码,新建一个蓝图类并且挂载UStrokeStaticMeshComponent。
  2. 赋予UStrokeStaticMeshComponent所需剖切的模型,以及上文制作好的外部表面材质。
  3. 赋予SecondPassMaterial内部剖面材质,并勾选UStrokeStaticMeshComponent的NeedSecondPass变量。
  4. 将蓝图类拖到关卡中,并且设置2个材质的PlaneNormal与PlanePoint。PlanePoint为世界坐标,PlaneNormal需要归一化。

最终效果

锯齿是因为垃圾笔记本散热差,把效果开低的关系。

120fcaa366b8703f8e84df67116d3920.png

错误的尝试

之前还尝试WorldPositionOffset的思路来做,不过后来发现没有实用性。因为剖面的大小与形状是不确定的,用投射的方式来平移内部可见顶点,会造成多余的顶点平移到平面外的问题。所以只适合拿来做规整模型的剖切效果。

e30ab255b5d726a72e2d1975f3ad247c.png

6dfd3a31eea379247018f44c8b7b6448.png

错误结果:

b5124bbb834841f44656fc38d00686d6.png

实现节点如下:

d787636317ce696bbdc3bb9772865989.png

CustomNode代码:

// Input PlaneNormal
// Input PlanePoint
// Input WorldPosition
float NormalPower2= pow(PlaneNormal.x,2) + pow(PlaneNormal.y,2) + pow(PlaneNormal.z,2);
float D=dot(PlaneNormal.xyz,PlanePoint.xyz)*-1;

float posX= ((pow(PlaneNormal.y,2) + pow(PlaneNormal.z,2))*WorldPosition.x-PlaneNormal.x*(PlaneNormal.y*WorldPosition.y+PlaneNormal.z*WorldPosition.z+D))/NormalPower2;

float posY=((pow(PlaneNormal.x,2) + pow(PlaneNormal.z,2))*WorldPosition.y-PlaneNormal.y*(PlaneNormal.x*WorldPosition.x+PlaneNormal.z*WorldPosition.z+D))/NormalPower2;

float posZ=((pow(PlaneNormal.x,2) + pow(PlaneNormal.y,2))*WorldPosition.z-PlaneNormal.z*(PlaneNormal.x*WorldPosition.x+PlaneNormal.y*WorldPosition.y+D))/NormalPower2;

return float3(posX,posY,posZ)-WorldPosition.xyz;
### 虚幻引擎中的效果实现 在虚幻引擎中,实现效果通常涉及使用材质和蓝图来控制几何体的显示方式。以下是关于如何通过材质和蓝图技术实现效果的具体方法。 #### 材质设置 为了创建效果,可以利用材质节点 `Pixel Depth Offset` 和 `Custom Depth Stencil` 功能[^2]。这些功能允许开发者定义哪些部分应该被裁剪掉或者隐藏。具体来说: - 使用 `Material Domain` 设置为 `Surface` 的材质。 - 添加一个浮点参数到材质编辑器中,用于控制平面的位置。 - 利用 `Vertex Position` 或者 `World Position` 结合自定义矢量方向计算当前顶点相对于面的距离[^3]。 ```cpp // 计算距离伪代码示例 float DistanceFromPlane = dot(VertexPosition - PlaneOrigin, PlaneNormal); if (DistanceFromPlane < CutThreshold) { discard; } ``` 上述逻辑可以通过 HLSL 片段着色器表达出来,并嵌入至 UE4/UE5 中支持的 Material Expression Graphs 内部结构里[^4]。 #### 蓝图集成 除了纯材质解决方案外,还可以借助蓝图系统动态调整参数。例如,在角色移动过程中实时更新位置或角度等属性值[^5]。 1. 创建一个新的 Actor Blueprint 并附加给目标对象。 2. 在 EventGraph 下拉菜单找到 Update Transform Events。 3. 将变换数据传递给之前提到过的材质实例变量上作为输入源之一。 这样就可以让玩家交互行为影响视觉呈现形式了。 ```blueprint SetScalarParameterValue Node -> Link with Dynamic Parameter Name "CutThreshold" ``` 以上就是基于所提供的信息以及行业标准做法下对于虚幻引擎内完成简单展示的技术指导说明[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值