NLDClient-yudde/ProjectNLD/Assets/Code/Shaders/Others/EffectiveBloom.shader

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
}
}
}