
参数UV,SampleDistance,Function,Amount,DistanceSum
cpp
// 将采样数量限制在 2 到 64 之间,防止采样次数过少或过多
int IntAmount = clamp((int)Amount, 2, 64);
// 指定后处理输入纹理索引,14 对应 PostProcessInput0
const int TexIndex = 14;
// 根据采样数量计算每次采样的距离,防止除零
float PDistance = DistanceSum / max(IntAmount, 1);
// 设置径向模糊中心点,UV 坐标中心为 (0.5, 0.5)
float2 Center = float2(0.5, 0.5);
// 计算当前像素指向模糊中心的方向向量
float2 Dir = Center - UV;
// 初始化颜色累加器,用于存储所有采样的颜色
float3 SumColor = 0;
// 初始化权重累加器,用于存储 RGB 通道的颜色权重
float3 SumWeight = 0;
// 根据采样数量循环,逐步获取不同位置的场景颜色
for (int i = 0; i < IntAmount; i++)
{
// 将当前采样序号转换为 0 到 1 之间的渐变值
float Alpha = (float)i / (IntAmount - 1);
// 根据渐变值计算当前采样的 RGB 色彩权重
float3 ColorM = Lerp3Color(Alpha);
// 沿径向方向计算采样位置,形成径向模糊效果
float2 Pos = UV + Dir * (PDistance * i * SampleDistance);
// 将采样坐标限制在 0 到 1 之间,防止超出屏幕范围
Pos = saturate(Pos);
// 将视口 UV 坐标转换为场景纹理 UV 坐标
float2 FinalUV = ViewportUVToSceneTextureUV(Pos, TexIndex);
// 从 PostProcessInput0 中读取当前采样位置的场景颜色
float3 SceneColor = SceneTextureLookup(FinalUV, TexIndex, false).rgb;
// 将采样颜色乘以 RGB 权重,并累加到颜色结果中
SumColor += SceneColor * ColorM;
// 累加 RGB 权重,用于最后的颜色归一化
SumWeight += ColorM;
}
// 将累加颜色除以总权重,防止权重为零导致计算异常,并输出最终颜色
return float4(SumColor / max(SumWeight, 0.0001), 1.0);
cpp
// 返回数值 1,作为前一个代码块的输出结果
return 1;
}
// 定义 Lerp3Color 颜色插值函数,输入 Alpha 用于控制颜色渐变
float3 Lerp3Color(float Alpha)
{
// 定义蓝色通道,蓝色强度为 1.5
float3 R = float3(0.0, 0.0, 1.5);
// 定义绿色通道,绿色强度为 0.5
float3 G = float3(0.0, 0.5, 0.0);
// 定义红色通道,红色强度为 1.0
float3 B = float3(1.0, 0.0, 0.0);
// 先根据 Alpha 在蓝色和绿色之间插值,再根据 Alpha 在结果和红色之间插值
return lerp(
// Alpha 从 0 到 0.5 时,蓝色逐渐过渡到绿色
lerp(R, G, saturate(Alpha * 2.0)),
// 第二阶段的目标颜色为红色
B,
// 将 Alpha 映射到 0 到 1,控制绿色到红色的过渡
saturate(Alpha * 2.0 - 1.0)
); // 返回最终的 RGB 渐变颜色