bloom.effect 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
  2. CCEffect %{
  3. techniques:
  4. - passes:
  5. - vert: bloom-vs
  6. frag: prefilter-fs
  7. pass: bloom-prefilter
  8. depthStencilState:
  9. depthTest: false
  10. depthWrite: false
  11. # Supports up to MAX_BLOOM_FILTER_PASS_NUM upsample/downsample passes
  12. - vert: bloom-vs
  13. frag: downsample-fs
  14. pass: bloom-downsample0
  15. depthStencilState:
  16. depthTest: false
  17. depthWrite: false
  18. - vert: bloom-vs
  19. frag: downsample-fs
  20. pass: bloom-downsample1
  21. depthStencilState:
  22. depthTest: false
  23. depthWrite: false
  24. - vert: bloom-vs
  25. frag: downsample-fs
  26. pass: bloom-downsample2
  27. depthStencilState:
  28. depthTest: false
  29. depthWrite: false
  30. - vert: bloom-vs
  31. frag: downsample-fs
  32. pass: bloom-downsample3
  33. depthStencilState:
  34. depthTest: false
  35. depthWrite: false
  36. - vert: bloom-vs
  37. frag: downsample-fs
  38. pass: bloom-downsample4
  39. depthStencilState:
  40. depthTest: false
  41. depthWrite: false
  42. - vert: bloom-vs
  43. frag: downsample-fs
  44. pass: bloom-downsample5
  45. depthStencilState:
  46. depthTest: false
  47. depthWrite: false
  48. - vert: bloom-vs
  49. frag: upsample-fs
  50. pass: bloom-upsample0
  51. depthStencilState:
  52. depthTest: false
  53. depthWrite: false
  54. - vert: bloom-vs
  55. frag: upsample-fs
  56. pass: bloom-upsample1
  57. depthStencilState:
  58. depthTest: false
  59. depthWrite: false
  60. - vert: bloom-vs
  61. frag: upsample-fs
  62. pass: bloom-upsample2
  63. depthStencilState:
  64. depthTest: false
  65. depthWrite: false
  66. - vert: bloom-vs
  67. frag: upsample-fs
  68. pass: bloom-upsample3
  69. depthStencilState:
  70. depthTest: false
  71. depthWrite: false
  72. - vert: bloom-vs
  73. frag: upsample-fs
  74. pass: bloom-upsample4
  75. depthStencilState:
  76. depthTest: false
  77. depthWrite: false
  78. - vert: bloom-vs
  79. frag: upsample-fs
  80. pass: bloom-upsample5
  81. depthStencilState:
  82. depthTest: false
  83. depthWrite: false
  84. - vert: bloom-vs
  85. frag: combine-fs
  86. pass: bloom-combine
  87. depthStencilState:
  88. depthTest: false
  89. depthWrite: false
  90. }%
  91. CCProgram bloom-vs %{
  92. precision highp float;
  93. #include <legacy/input-standard>
  94. #include <builtin/uniforms/cc-global>
  95. #include <common/common-define>
  96. out vec2 v_uv;
  97. void main () {
  98. StandardVertInput In;
  99. CCVertInput(In);
  100. CC_HANDLE_GET_CLIP_FLIP(In.position.xy);
  101. gl_Position = In.position;
  102. gl_Position.y = gl_Position.y;
  103. v_uv = a_texCoord;
  104. }
  105. }%
  106. CCProgram prefilter-fs %{
  107. precision highp float;
  108. #include <builtin/uniforms/cc-global>
  109. #include <common/color/gamma>
  110. #include <common/common-define>
  111. in vec2 v_uv;
  112. uniform BloomUBO {
  113. mediump vec4 texSize;// x: useHDRIlluminance,z: threshold, w: enableAlphaMask
  114. };
  115. #pragma rate outputResultMap pass
  116. uniform sampler2D outputResultMap; // ldr input
  117. #pragma rate hdrInputMap pass
  118. uniform sampler2D hdrInputMap; // hdr input
  119. layout(location = 0) out vec4 fragColor;
  120. float luminance(vec3 color) {
  121. return dot(color, vec3(0.3, 0.5, 0.2));
  122. }
  123. void main() {
  124. vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
  125. #if CC_USE_FLOAT_OUTPUT
  126. if(texSize.x > 0.0) {
  127. color = texture(hdrInputMap, v_uv);
  128. } else {
  129. color = texture(outputResultMap, v_uv);
  130. // color.xyz = SRGBToLinear(color.xyz);
  131. }
  132. #else
  133. color = texture(outputResultMap, v_uv);
  134. // color.xyz = SRGBToLinear(color.xyz);
  135. #endif
  136. float contribute = step(texSize.z, luminance(color.rgb));
  137. contribute *= mix(1.0, step(253.0 / 255.0, color.a), texSize.w);
  138. fragColor = vec4(color.xyz * contribute, 1.0);
  139. }
  140. }%
  141. CCProgram downsample-fs %{
  142. precision highp float;
  143. #include <builtin/uniforms/cc-global>
  144. in vec2 v_uv;
  145. uniform BloomUBO {
  146. mediump vec4 texSize;
  147. };
  148. #pragma rate bloomTexture pass
  149. uniform sampler2D bloomTexture;
  150. layout(location = 0) out vec4 fragColor;
  151. #pragma define SAM(uv) texture(bloomTexture, uv).xyz
  152. vec3 downsample(vec2 uv, vec2 halfpixel) {
  153. vec3 sum = SAM(uv) * 4.0;
  154. sum += SAM(uv - halfpixel.xy);
  155. sum += SAM(uv + halfpixel.xy);
  156. halfpixel.y = -halfpixel.y;
  157. sum += SAM(uv - halfpixel.xy);
  158. sum += SAM(uv + halfpixel.xy);
  159. return sum / 8.0;
  160. }
  161. vec3 downsample4taps(vec2 uv, vec2 halfpixel) {
  162. vec3 sum = SAM(uv + vec2(-halfpixel.x, halfpixel.y));
  163. sum += SAM(uv + vec2(halfpixel.x, halfpixel.y));
  164. sum += SAM(uv + vec2(halfpixel.x, -halfpixel.y));
  165. sum += SAM(uv + vec2(-halfpixel.x, -halfpixel.y));
  166. return sum / 4.0;
  167. }
  168. void main()
  169. {
  170. vec3 result = downsample4taps(v_uv, 1.0 / texSize.xy).rgb;
  171. fragColor = vec4(result, 1.0);
  172. }
  173. }%
  174. CCProgram upsample-fs %{
  175. precision highp float;
  176. #include <builtin/uniforms/cc-global>
  177. in vec2 v_uv;
  178. uniform BloomUBO {
  179. mediump vec4 texSize;
  180. };
  181. #pragma rate bloomTexture pass
  182. uniform sampler2D bloomTexture;
  183. layout(location = 0) out vec4 fragColor;
  184. #pragma define SAM(uv) texture(bloomTexture, uv).xyz
  185. vec3 upsample(vec2 uv, vec2 halfpixel) {
  186. vec3 sum = SAM(uv + vec2(-halfpixel.x * 2.0, 0.0));
  187. sum += SAM(uv + vec2(-halfpixel.x, halfpixel.y)) * 2.0;
  188. sum += SAM(uv + vec2(0.0, halfpixel.y * 2.0));
  189. sum += SAM(uv + vec2(halfpixel.x, halfpixel.y)) * 2.0;
  190. sum += SAM(uv + vec2(halfpixel.x * 2.0, 0.0));
  191. sum += SAM(uv + vec2(halfpixel.x, -halfpixel.y)) * 2.0;
  192. sum += SAM(uv + vec2(0.0, -halfpixel.y * 2.0));
  193. sum += SAM(uv + vec2(-halfpixel.x, -halfpixel.y)) * 2.0;
  194. return sum / 12.0;
  195. }
  196. vec3 upsample4taps(vec2 uv, vec2 halfpixel) {
  197. vec3 sum = SAM(uv + vec2(-halfpixel.x, halfpixel.y));
  198. sum += SAM(uv + vec2(halfpixel.x, halfpixel.y));
  199. sum += SAM(uv + vec2(halfpixel.x, -halfpixel.y));
  200. sum += SAM(uv + vec2(-halfpixel.x, -halfpixel.y));
  201. return sum / 4.0;
  202. }
  203. void main() {
  204. vec3 result = upsample4taps(v_uv, 0.5 / texSize.xy).rgb;
  205. fragColor = vec4(result, 1.0);
  206. }
  207. }%
  208. CCProgram combine-fs %{
  209. precision highp float;
  210. #include <builtin/uniforms/cc-global>
  211. in vec2 v_uv;
  212. uniform BloomUBO {
  213. mediump vec4 texSize;
  214. };
  215. #pragma rate outputResultMap pass
  216. uniform sampler2D outputResultMap;
  217. #pragma rate bloomTexture pass
  218. uniform sampler2D bloomTexture;
  219. layout(location = 0) out vec4 fragColor;
  220. void main() {
  221. vec4 hdrColor = texture(outputResultMap, v_uv);
  222. vec3 bloomColor = texture(bloomTexture, v_uv).rgb;
  223. vec3 result = hdrColor.rgb + bloomColor * texSize.w;
  224. fragColor = vec4(result, hdrColor.a);
  225. }
  226. }%