186 lines
5.1 KiB
Plaintext
186 lines
5.1 KiB
Plaintext
Shader "Hidden/EffectiveBloom"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex ("EffectiveBloom", 2D) = "black" {}
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
HLSLINCLUDE
|
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
|
|
#pragma prefer_hlslcc gles
|
|
#pragma exclude_renderers d3d11_9x
|
|
#pragma target 2.0
|
|
|
|
struct Attributes
|
|
{
|
|
float4 positionOS : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
struct VaryingsBlur
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
TEXTURE2D(_MainTex);
|
|
SAMPLER(sampler_MainTex);
|
|
|
|
TEXTURE2D(_SourceTex);
|
|
SAMPLER(sampler_SourceTex);
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float2 _TexelSize;
|
|
half _Intensity;
|
|
half _Threshold;
|
|
half3 _Curve;
|
|
half4 _Tint;
|
|
CBUFFER_END
|
|
|
|
half4 BoxFilterOptimized(float2 uv)
|
|
{
|
|
return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
|
|
}
|
|
|
|
half4 BoxFilter(float2 uv, float2 texelSize)
|
|
{
|
|
half4 sum;
|
|
sum = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
|
|
sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv + float2(texelSize.x, 0.0));
|
|
sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv - float2(texelSize.x, 0.0));
|
|
sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv + float2(0.0, texelSize.y));
|
|
return sum * 0.25h;
|
|
}
|
|
|
|
half4 BoxFilter2Tap(float2 uv, float2 texelSize)
|
|
{
|
|
half4 sum;
|
|
sum = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv + float2(0.5, 0.5) * texelSize);
|
|
sum += SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv - float2(0.5, 0.5) * texelSize);
|
|
return sum * 0.5h;
|
|
}
|
|
|
|
Varyings vert_base(Attributes input)
|
|
{
|
|
Varyings output;
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
|
|
output.positionCS = vertexInput.positionCS;
|
|
output.uv = input.uv;
|
|
return output;
|
|
}
|
|
|
|
VaryingsBlur vert_blur(Attributes input)
|
|
{
|
|
VaryingsBlur output;
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
|
|
output.positionCS = vertexInput.positionCS;
|
|
output.uv = input.uv;
|
|
return output;
|
|
}
|
|
|
|
half4 frag_prefilter(Varyings input) : SV_Target
|
|
{
|
|
half4 c = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
|
|
|
|
half brightness = max(max(c.r, c.g), c.b);
|
|
half soft = clamp(brightness - _Curve.x, 0.0h, _Curve.y);
|
|
soft = soft * soft * _Curve.z;
|
|
half contribution = max(soft, brightness - _Threshold);
|
|
contribution /= max(brightness, 0.0001h);
|
|
|
|
return half4(c.rgb * contribution, c.a);
|
|
}
|
|
|
|
half4 frag_blur_downsample(VaryingsBlur input) : SV_Target
|
|
{
|
|
return BoxFilterOptimized(input.uv);
|
|
}
|
|
|
|
half4 frag_blur_upsample(VaryingsBlur input) : SV_Target
|
|
{
|
|
return BoxFilter2Tap(input.uv, _TexelSize);
|
|
}
|
|
|
|
half4 frag_final(VaryingsBlur input) : SV_Target
|
|
{
|
|
half4 bloom = BoxFilterOptimized(input.uv) * _Intensity;
|
|
bloom.rgb *= _Tint.rgb;
|
|
return bloom;
|
|
}
|
|
|
|
half4 frag_combine(VaryingsBlur input) : SV_Target
|
|
{
|
|
half3 bloom = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv).rgb;
|
|
half4 source = SAMPLE_TEXTURE2D(_SourceTex, sampler_SourceTex, input.uv);
|
|
return half4(source.rgb + bloom, source.a);
|
|
}
|
|
|
|
ENDHLSL
|
|
|
|
Pass
|
|
{
|
|
NAME "Prefilter"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex vert_base
|
|
#pragma fragment frag_prefilter
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass
|
|
{
|
|
NAME "Downsample"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex vert_blur
|
|
#pragma fragment frag_blur_downsample
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass
|
|
{
|
|
NAME "Upsample"
|
|
Blend One One
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex vert_blur
|
|
#pragma fragment frag_blur_upsample
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass
|
|
{
|
|
NAME "Final"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex vert_blur
|
|
#pragma fragment frag_final
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass
|
|
{
|
|
NAME "Combine"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex vert_blur
|
|
#pragma fragment frag_combine
|
|
ENDHLSL
|
|
}
|
|
}
|
|
}
|