Bloom.shader 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. Shader "Hidden/PostProcessing/Bloom"
  2. {
  3. HLSLINCLUDE
  4. #include "../StdLib.hlsl"
  5. #include "../Colors.hlsl"
  6. #include "../Sampling.hlsl"
  7. TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
  8. TEXTURE2D_SAMPLER2D(_BloomTex, sampler_BloomTex);
  9. TEXTURE2D_SAMPLER2D(_AutoExposureTex, sampler_AutoExposureTex);
  10. float4 _MainTex_TexelSize;
  11. float _SampleScale;
  12. float4 _ColorIntensity;
  13. float4 _Threshold; // x: threshold value (linear), y: threshold - knee, z: knee * 2, w: 0.25 / knee
  14. float4 _Params; // x: clamp, yzw: unused
  15. // ----------------------------------------------------------------------------------------
  16. // Prefilter
  17. half4 Prefilter(half4 color, float2 uv)
  18. {
  19. half autoExposure = SAMPLE_TEXTURE2D(_AutoExposureTex, sampler_AutoExposureTex, uv).r;
  20. color *= autoExposure;
  21. color = min(_Params.x, color); // clamp to max
  22. color = QuadraticThreshold(color, _Threshold.x, _Threshold.yzw);
  23. return color;
  24. }
  25. half4 FragPrefilter13(VaryingsDefault i) : SV_Target
  26. {
  27. half4 color = DownsampleBox13Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
  28. return Prefilter(SafeHDR(color), i.texcoord);
  29. }
  30. half4 FragPrefilter4(VaryingsDefault i) : SV_Target
  31. {
  32. half4 color = DownsampleBox4Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
  33. return Prefilter(SafeHDR(color), i.texcoord);
  34. }
  35. // ----------------------------------------------------------------------------------------
  36. // Downsample
  37. half4 FragDownsample13(VaryingsDefault i) : SV_Target
  38. {
  39. half4 color = DownsampleBox13Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
  40. return color;
  41. }
  42. half4 FragDownsample4(VaryingsDefault i) : SV_Target
  43. {
  44. half4 color = DownsampleBox4Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy);
  45. return color;
  46. }
  47. // ----------------------------------------------------------------------------------------
  48. // Upsample & combine
  49. half4 Combine(half4 bloom, float2 uv)
  50. {
  51. half4 color = SAMPLE_TEXTURE2D(_BloomTex, sampler_BloomTex, uv);
  52. return bloom + color;
  53. }
  54. half4 FragUpsampleTent(VaryingsDefault i) : SV_Target
  55. {
  56. half4 bloom = UpsampleTent(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
  57. return Combine(bloom, i.texcoordStereo);
  58. }
  59. half4 FragUpsampleBox(VaryingsDefault i) : SV_Target
  60. {
  61. half4 bloom = UpsampleBox(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
  62. return Combine(bloom, i.texcoordStereo);
  63. }
  64. // ----------------------------------------------------------------------------------------
  65. // Debug overlays
  66. half4 FragDebugOverlayThreshold(VaryingsDefault i) : SV_Target
  67. {
  68. half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoordStereo);
  69. return half4(Prefilter(SafeHDR(color), i.texcoord).rgb, 1.0);
  70. }
  71. half4 FragDebugOverlayTent(VaryingsDefault i) : SV_Target
  72. {
  73. half4 bloom = UpsampleTent(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
  74. return half4(bloom.rgb * _ColorIntensity.w * _ColorIntensity.rgb, 1.0);
  75. }
  76. half4 FragDebugOverlayBox(VaryingsDefault i) : SV_Target
  77. {
  78. half4 bloom = UpsampleBox(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, UnityStereoAdjustedTexelSize(_MainTex_TexelSize).xy, _SampleScale);
  79. return half4(bloom.rgb * _ColorIntensity.w * _ColorIntensity.rgb, 1.0);
  80. }
  81. ENDHLSL
  82. SubShader
  83. {
  84. Cull Off ZWrite Off ZTest Always
  85. // 0: Prefilter 13 taps
  86. Pass
  87. {
  88. HLSLPROGRAM
  89. #pragma vertex VertDefault
  90. #pragma fragment FragPrefilter13
  91. ENDHLSL
  92. }
  93. // 1: Prefilter 4 taps
  94. Pass
  95. {
  96. HLSLPROGRAM
  97. #pragma vertex VertDefault
  98. #pragma fragment FragPrefilter4
  99. ENDHLSL
  100. }
  101. // 2: Downsample 13 taps
  102. Pass
  103. {
  104. HLSLPROGRAM
  105. #pragma vertex VertDefault
  106. #pragma fragment FragDownsample13
  107. ENDHLSL
  108. }
  109. // 3: Downsample 4 taps
  110. Pass
  111. {
  112. HLSLPROGRAM
  113. #pragma vertex VertDefault
  114. #pragma fragment FragDownsample4
  115. ENDHLSL
  116. }
  117. // 4: Upsample tent filter
  118. Pass
  119. {
  120. HLSLPROGRAM
  121. #pragma vertex VertDefault
  122. #pragma fragment FragUpsampleTent
  123. ENDHLSL
  124. }
  125. // 5: Upsample box filter
  126. Pass
  127. {
  128. HLSLPROGRAM
  129. #pragma vertex VertDefault
  130. #pragma fragment FragUpsampleBox
  131. ENDHLSL
  132. }
  133. // 6: Debug overlay (threshold)
  134. Pass
  135. {
  136. HLSLPROGRAM
  137. #pragma vertex VertDefault
  138. #pragma fragment FragDebugOverlayThreshold
  139. ENDHLSL
  140. }
  141. // 7: Debug overlay (tent filter)
  142. Pass
  143. {
  144. HLSLPROGRAM
  145. #pragma vertex VertDefault
  146. #pragma fragment FragDebugOverlayTent
  147. ENDHLSL
  148. }
  149. // 8: Debug overlay (box filter)
  150. Pass
  151. {
  152. HLSLPROGRAM
  153. #pragma vertex VertDefault
  154. #pragma fragment FragDebugOverlayBox
  155. ENDHLSL
  156. }
  157. }
  158. }