bloom-kawase-dual.effect 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
  2. // Based on Kawase Dual Filter Blur
  3. // https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_slides.pdf
  4. CCEffect %{
  5. techniques:
  6. - passes:
  7. - vert: bloom-vs
  8. frag: prefilter-fs
  9. pass: cc-bloom-prefilter
  10. rasterizerState:
  11. cullMode: none
  12. depthStencilState:
  13. depthTest: false
  14. depthWrite: false
  15. - vert: bloom-vs
  16. frag: downsample-fs
  17. pass: cc-bloom-downsample
  18. rasterizerState:
  19. cullMode: none
  20. depthStencilState:
  21. depthTest: false
  22. depthWrite: false
  23. - vert: bloom-vs
  24. frag: upsample-fs
  25. pass: cc-bloom-upsample
  26. rasterizerState:
  27. cullMode: none
  28. depthStencilState:
  29. depthTest: false
  30. depthWrite: false
  31. - vert: bloom-vs
  32. frag: combine-fs
  33. pass: cc-bloom-combine
  34. rasterizerState:
  35. cullMode: none
  36. depthStencilState:
  37. depthTest: false
  38. depthWrite: false
  39. blendState:
  40. targets:
  41. - blend: true
  42. blendSrc: one
  43. blendDst: one
  44. blendSrcAlpha: zero
  45. blendDstAlpha: one
  46. }%
  47. CCProgram bloom-vs %{
  48. precision highp float;
  49. #include <legacy/decode-standard>
  50. #include <post-process/pipeline>
  51. out vec2 v_uv;
  52. void main() {
  53. StandardVertInput In;
  54. CCDecode(In);
  55. FLIP_VULKAN_NDC(In.position);
  56. gl_Position = In.position;
  57. v_uv = a_texCoord;
  58. FLIP_SAMPLE_FROM_RT(v_uv);
  59. }
  60. }%
  61. CCProgram prefilter-fs %{
  62. precision highp float;
  63. #include <common/color/gamma>
  64. in vec2 v_uv;
  65. #pragma rate BloomUBO pass
  66. uniform BloomUBO {
  67. mediump vec4 bloomParams; // x: useHDRIlluminance z: threshold, w: enableAlphaMask
  68. };
  69. #pragma rate inputTexture pass
  70. uniform sampler2D inputTexture; // hdr input
  71. layout(location = 0)out vec4 fragColor;
  72. float luminance(vec3 color) {
  73. return dot(color, vec3(0.3, 0.5, 0.2));
  74. }
  75. void main() {
  76. vec4 color = texture(inputTexture, v_uv);
  77. float contribute = step(bloomParams.z, luminance(color.rgb));
  78. contribute *= mix(1.0, step(253.0 / 255.0, color.a), bloomParams.w);
  79. fragColor = vec4(color.xyz * contribute, 1.0);
  80. }
  81. }%
  82. CCProgram downsample-fs %{
  83. precision highp float;
  84. in vec2 v_uv;
  85. #pragma rate BloomTexUBO pass
  86. uniform BloomTexUBO {
  87. mediump vec4 bloomTexSize; // size
  88. };
  89. #pragma rate bloomTexture pass
  90. uniform sampler2D bloomTexture;
  91. layout(location = 0)out vec4 fragColor;
  92. #pragma define SAM(uv) texture(bloomTexture, uv).xyz
  93. vec3 downsample(vec2 uv, vec2 halfpixel) {
  94. // halfpixel is:
  95. // 1. half of the pixel size of the output texture
  96. // 2. pixel size of the input texture
  97. vec3 sum = SAM(uv) * 4.0;
  98. sum += SAM(uv - halfpixel.xy);
  99. sum += SAM(uv + halfpixel.xy);
  100. halfpixel.y = -halfpixel.y;
  101. sum += SAM(uv - halfpixel.xy);
  102. sum += SAM(uv + halfpixel.xy);
  103. return sum / 8.0;
  104. }
  105. vec3 downsample4taps(vec2 uv, vec2 halfpixel) {
  106. vec3 sum = SAM(uv + vec2(-halfpixel.x, halfpixel.y));
  107. sum += SAM(uv + vec2(halfpixel.x, halfpixel.y));
  108. sum += SAM(uv + vec2(halfpixel.x, - halfpixel.y));
  109. sum += SAM(uv + vec2(-halfpixel.x, - halfpixel.y));
  110. return sum / 4.0;
  111. }
  112. void main()
  113. {
  114. vec3 result = downsample4taps(v_uv, 1.0 / bloomTexSize.xy).rgb;
  115. fragColor = vec4(result, 1.0);
  116. }
  117. }%
  118. CCProgram upsample-fs %{
  119. precision highp float;
  120. in vec2 v_uv;
  121. #pragma rate BloomTexUBO pass
  122. uniform BloomTexUBO {
  123. mediump vec4 bloomTexSize;
  124. };
  125. #pragma rate bloomTexture pass
  126. uniform sampler2D bloomTexture;
  127. layout(location = 0)out vec4 fragColor;
  128. #pragma define SAM(uv) texture(bloomTexture, uv).xyz
  129. vec3 upsample(vec2 uv, vec2 halfpixel) {
  130. // halfpixel is:
  131. // 1. half of the pixel size of the input texture
  132. // 2. pixel size of the output texture
  133. vec3 sum = SAM(uv + vec2(-halfpixel.x * 2.0, 0.0));
  134. sum += SAM(uv + vec2(-halfpixel.x, halfpixel.y)) * 2.0;
  135. sum += SAM(uv + vec2(0.0, halfpixel.y * 2.0));
  136. sum += SAM(uv + vec2(halfpixel.x, halfpixel.y)) * 2.0;
  137. sum += SAM(uv + vec2(halfpixel.x * 2.0, 0.0));
  138. sum += SAM(uv + vec2(halfpixel.x, - halfpixel.y)) * 2.0;
  139. sum += SAM(uv + vec2(0.0, - halfpixel.y * 2.0));
  140. sum += SAM(uv + vec2(-halfpixel.x, - halfpixel.y)) * 2.0;
  141. return sum / 12.0;
  142. }
  143. vec3 upsample4taps(vec2 uv, vec2 halfpixel) {
  144. vec3 sum = SAM(uv + vec2(-halfpixel.x, halfpixel.y));
  145. sum += SAM(uv + vec2(halfpixel.x, halfpixel.y));
  146. sum += SAM(uv + vec2(halfpixel.x, - halfpixel.y));
  147. sum += SAM(uv + vec2(-halfpixel.x, - halfpixel.y));
  148. return sum / 4.0;
  149. }
  150. void main() {
  151. vec3 result = upsample(v_uv, 0.5 / bloomTexSize.xy).rgb;
  152. fragColor = vec4(result, 1.0);
  153. }
  154. }%
  155. CCProgram combine-fs %{
  156. precision highp float;
  157. in vec2 v_uv;
  158. #pragma rate BloomUBO pass
  159. uniform BloomUBO {
  160. mediump vec4 bloomParams; // x: useHDRIlluminance z: threshold, w: enableAlphaMask
  161. };
  162. #pragma rate bloomTexture pass
  163. uniform sampler2D bloomTexture;
  164. layout(location = 0)out vec4 fragColor;
  165. void main() {
  166. vec3 bloomColor = texture(bloomTexture, v_uv).rgb * bloomParams.w;
  167. fragColor = vec4(bloomColor, 0);
  168. }
  169. }%