| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- Shader "Hidden/PostProcessing/Bloom"
- {
- HLSLINCLUDE
-
- #include "../StdLib.hlsl"
- #include "../Colors.hlsl"
- #include "../Sampling.hlsl"
- TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
- TEXTURE2D_SAMPLER2D(_BloomTex, sampler_BloomTex);
- TEXTURE2D_SAMPLER2D(_AutoExposureTex, sampler_AutoExposureTex);
- float4 _MainTex_TexelSize;
- float _SampleScale;
- float4 _ColorIntensity;
- float4 _Threshold; // x: threshold value (linear), y: threshold - knee, z: knee * 2, w: 0.25 / knee
- float4 _Params; // x: clamp, yzw: unused
- // ----------------------------------------------------------------------------------------
- // Prefilter
- half4 Prefilter(half4 color, float2 uv)
- {
- half autoExposure = SAMPLE_TEXTURE2D(_AutoExposureTex, sampler_AutoExposureTex, uv).r;
- color *= autoExposure;
- color = min(_Params.x, color); // clamp to max
- color = QuadraticThreshold(color, _Threshold.x, _Threshold.yzw);
- return color;
- }
- half4 FragPrefilter13(VaryingsDefault i) : SV_Target
- {
- half4 color = DownsampleBox13Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
- return Prefilter(SafeHDR(color), i.texcoord);
- }
- half4 FragPrefilter4(VaryingsDefault i) : SV_Target
- {
- half4 color = DownsampleBox4Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
- return Prefilter(SafeHDR(color), i.texcoord);
- }
- // ----------------------------------------------------------------------------------------
- // Downsample
- half4 FragDownsample13(VaryingsDefault i) : SV_Target
- {
- half4 color = DownsampleBox13Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
- return color;
- }
- half4 FragDownsample4(VaryingsDefault i) : SV_Target
- {
- half4 color = DownsampleBox4Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
- return color;
- }
- // ----------------------------------------------------------------------------------------
- // Upsample & combine
- half4 Combine(half4 bloom, float2 uv)
- {
- half4 color = SAMPLE_TEXTURE2D(_BloomTex, sampler_BloomTex, uv);
- return bloom + color;
- }
- half4 FragUpsampleTent(VaryingsDefault i) : SV_Target
- {
- half4 bloom = UpsampleTent(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
- return Combine(bloom, i.texcoordStereo);
- }
- half4 FragUpsampleBox(VaryingsDefault i) : SV_Target
- {
- half4 bloom = UpsampleBox(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
- return Combine(bloom, i.texcoordStereo);
- }
- // ----------------------------------------------------------------------------------------
- // Debug overlays
- half4 FragDebugOverlayThreshold(VaryingsDefault i) : SV_Target
- {
- half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoordStereo);
- return half4(Prefilter(SafeHDR(color), i.texcoord).rgb, 1.0);
- }
- half4 FragDebugOverlayTent(VaryingsDefault i) : SV_Target
- {
- half4 bloom = UpsampleTent(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
- return half4(bloom.rgb * _ColorIntensity.w * _ColorIntensity.rgb, 1.0);
- }
- half4 FragDebugOverlayBox(VaryingsDefault i) : SV_Target
- {
- half4 bloom = UpsampleBox(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
- return half4(bloom.rgb * _ColorIntensity.w * _ColorIntensity.rgb, 1.0);
- }
- ENDHLSL
- SubShader
- {
- Cull Off ZWrite Off ZTest Always
- // 0: Prefilter 13 taps
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragPrefilter13
- ENDHLSL
- }
- // 1: Prefilter 4 taps
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragPrefilter4
- ENDHLSL
- }
- // 2: Downsample 13 taps
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragDownsample13
- ENDHLSL
- }
- // 3: Downsample 4 taps
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragDownsample4
- ENDHLSL
- }
- // 4: Upsample tent filter
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragUpsampleTent
- ENDHLSL
- }
- // 5: Upsample box filter
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragUpsampleBox
- ENDHLSL
- }
- // 6: Debug overlay (threshold)
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragDebugOverlayThreshold
- ENDHLSL
- }
- // 7: Debug overlay (tent filter)
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragDebugOverlayTent
- ENDHLSL
- }
- // 8: Debug overlay (box filter)
- Pass
- {
- HLSLPROGRAM
- #pragma vertex VertDefault
- #pragma fragment FragDebugOverlayBox
- ENDHLSL
- }
- }
- }
|