近期看见一十字光斑教程,通过对传入UV进行变化在SphereMask阶段实现变化:

(出处:https://www.bilibili.com/video/BV1jjSmBDE2n)
饶有兴趣,拆解研究下。
1.本质是UV传入阶段对UV进行修改,首先将UV转换到[-1 - 1]区间,加上abs节点实现镜像。

2.如果再加上幂运算,可以实现曲线式的分布

3.绘制出来可以理解

4.原版中最后一步用了SphereMask,于是借助AI提取了UE SphereMask伪代码:
函数 GenerateHLSLExpression(Generator, Scope, OutputIndex, OutExpression):
// 获取 A 和 B 的 HLSL 表达式
ExpressionA = 获取 A 的 HLSL 表达式
ExpressionB = 获取 B 的 HLSL 表达式
// 如果 A 或 B 无效,则返回失败
如果 ExpressionA 或 ExpressionB 为空:
返回 False
// 计算 A 和 B 之间的距离
ExpressionDistance = 计算 A 和 B 之间的距离
// 获取 Radius 的 HLSL 表达式(或常量),并确保其有效
ExpressionRadius = 获取 Radius 的 HLSL 表达式 或 使用 AttenuationRadius 常量
ExpressionRcpRadius = 计算 1 / 最大(表达式 Radius, 0.00001)
// 归一化距离(使用半径进行缩放)
ExpressionNormalizedDistance = 距离 * 1 / 半径
// 获取 Hardness 的 HLSL 表达式(或常量),并转化为百分比
ExpressionHardness = 获取 Hardness 的 HLSL 表达式 或 使用 HardnessPercent 常量 * 0.01
// 计算 Softness,Softness = 1 - Hardness
ExpressionSoftness = 1 - Hardness
// 计算 Softness 的倒数,避免除以零
ExpressionRcpSoftness = 1 / 最大(Softness, 0.00001)
// 计算 1 - 距离
ExpressionOneMinusDistance = 1 - 距离
// 最终的表达式计算:根据 Softness 和 1 - 距离 生成遮罩效果
OutExpression = Saturate( (1 - 距离) * (1 / Softness) )
返回 True
似乎比较麻烦,但仔细一想直接上smoothstep应该也行。
4.所以最后再加上smoothstep提取发光区域即可完成,这个效果核心就是用power修改传入uv。
