Unreal | Shader | Hlsl | Stylized Post Processing
- 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;
Comments