top of page

Unreal | Shader | Hlsl | Stylized Post Processing

  • Writer: Max Liu
    Max Liu
  • May 7, 2020
  • 1 min read

Updated: Dec 24, 2024





   return 1;
}


//Range(x,y,x,w) = x,0,z,0
float4 GetKernelMeanAndVariance(float2 UV, float4 Range)
{

    float2 TexelSize = View.BufferSizeAndInvSize.zw;
    float Sample = 0;
    float3 Mean = float3(0,0,0);
    float3 Variance = float3(0,0,0);


    for (int xOffset = Range.x; xOffset <= Range.y; xOffset++)
    {
        for(int yOffset = Range.z; yOffset <= Range.w; yOffset++)
        {
            float2 Offset = float2(xOffset, yOffset) * TexelSize;
            float3 PixelColor = SceneTextureLookup(UV + Offset, 14, false).rgb; //Getcolor

            Mean += PixelColor;
            Variance += PixelColor * PixelColor;
            Sample++;
            

        }
    }

    Mean /= Sample; 
    Variance = Variance/Sample - Mean * Mean;
    float TotalVariance = Variance.r + Variance.g + Variance.b;
    return float4(Mean.r, Mean.g, Mean.b, TotalVariance);




float4 Range;
float4 MeanAndVariance[4];
float2 UV = GetDefaultSceneTextureUV(Parameters, 14); //    return float4(Mean.r, Mean.g, Mean.b, TotalVariance)

Range = float4(-XRadius, 0, -YRadius, 0);
MeanAndVariance[0] = GetKernelMeanAndVariance(UV, Range);


Range = float4(0, XRadius, -YRadius, 0 );
MeanAndVariance[1] = GetKernelMeanAndVariance(UV, Range);


Range = float4(-XRadius, 0, 0, YRadius);
MeanAndVariance[2] = GetKernelMeanAndVariance(UV, Range);

Range = float4(0,-XRadius, 0, YRadius);
MeanAndVariance[3] = GetKernelMeanAndVariance(UV, Range);

//Get Final Color
float3 FinalColor = MeanAndVariance[0].rgb; //RGB
float MinimunVariance = MeanAndVariance[0].a; //Alpha

for(int i = 1; i< 4; i++)
{
    if(MeanAndVariance[i].a < MinimunVariance)
    {
        FinalColor = MeanAndVariance[i].rgb;
        MinimunVariance = MeanAndVariance[i].a;
    }
}

return FinalColor; 

Recent Posts

See All

Comments


bottom of page