Rasagar/Library/PackageCache/com.unity.postprocessing/PostProcessing/Shaders/Builtins/Bloom.shader
2024-09-27 20:27:46 +03:00

206 lines
6.3 KiB
Plaintext

Shader "Hidden/PostProcessing/Bloom"
{
HLSLINCLUDE
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/Colors.hlsl"
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/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
}
}
}