[UE4]后处理模糊,几种方法

1.高斯模糊

 

static const int SceneTextureId = 14;
float2 TexelSize = View.ViewSizeAndInvSize.zw;
float2 UV = GetDefaultSceneTextureUV(Parameters, SceneTextureId);
float3 PixelSum = float3(0, 0, 0);
float WeightSum = 0;

for (int x = -Radius; x <= Radius; x++)
{
    for (int y = -Radius; y <= Radius; y++)
    {
        float2 Offset = UV + float2(x, y) * TexelSize;
        float3 PixelColor = SceneTextureLookup(Offset, SceneTextureId, 0).rgb;
        float Weight = Calculate1DGaussian(x / Radius) * Calculate1DGaussian(y / Radius);
        PixelSum += PixelColor * Weight;
        WeightSum += Weight;

    }
}

return PixelSum / WeightSum;

用到了SceneTextureLookupCalculate1DGaussian两个函数, 在前面通过这个方式导入,并不在Custom的Shader里起作用

Global:

    return 1;
}

float Calculate1DGaussian(float x)
{
    return exp(-0.5 * pow(3.141 * (x), 2));
 

 

这段代码在HLSL里面会自动补全

2.矩形模糊

UV = ViewportUVToBufferUV(UV);
float3 blur = SceneTextureLookup(UV, 14, false);
float numX = 0;
float numY = 0;
for(int i = 0; i < r; i++)
{
   if(dist.x!=0)
   {
       blur += SceneTextureLookup(UV+float2(i*dist.x, 0), 14, false);
       blur += SceneTextureLookup(UV-float2(i*dist.x, 0), 14, false);
       numX = 2;
   }

   if(dist.y!=0)
   {
       blur += SceneTextureLookup(UV+float2(0, i*dist.y), 14, false);
       blur += SceneTextureLookup(UV-float2(0, i*dist.y), 14, false);
       numY = 2;
    }
}

blur /= (numX+numY)*r+1;
return blur;

改写自UE4官方​​​​​​https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/ExpressionReference/Custom/

3.材质模糊

其他

关于效率问题也研究了一下放在知乎:

【UE4】几种全屏模糊方法的效率测试 - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值