@zephyr3d/scene 0.9.25 → 0.9.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { AbstractPostEffect, PostEffectLayer } from './posteffect.js';
2
+ import { linearToGamma } from '../shaders/misc.js';
2
3
  import { Vector4, Vector2 } from '@zephyr3d/base';
3
4
 
4
5
  /**
@@ -25,11 +26,16 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
25
26
  _threshold;
26
27
  _thresholdKnee;
27
28
  _intensity;
29
+ _filterRadius;
30
+ _karisAverage;
28
31
  /**
29
32
  * Creates an instance of tonemap post effect
30
33
  */ constructor(){
31
34
  super();
32
- this._layer = PostEffectLayer.transparent;
35
+ // End layer, so the pyramid is built from the TAA-resolved frame rather than the
36
+ // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing
37
+ // here depends on the transmission depth rewrite the transparent layer sits ahead of.
38
+ this._layer = PostEffectLayer.end;
33
39
  this._thresholdValue = new Vector4();
34
40
  this._invTexSize = new Vector2();
35
41
  this._maxDownsampleLevels = 4;
@@ -37,6 +43,8 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
37
43
  this._threshold = 0.8;
38
44
  this._thresholdKnee = 0;
39
45
  this._intensity = 1;
46
+ this._filterRadius = 1;
47
+ this._karisAverage = true;
40
48
  }
41
49
  /** The maximum downsample levels */ get maxDownsampleLevel() {
42
50
  return this._maxDownsampleLevels;
@@ -85,6 +93,36 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
85
93
  set intensity(val) {
86
94
  this._intensity = val;
87
95
  }
96
+ /**
97
+ * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.
98
+ *
99
+ * @remarks
100
+ * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each
101
+ * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the
102
+ * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to
103
+ * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky
104
+ * banding returns.
105
+ */ get filterRadius() {
106
+ return this._filterRadius;
107
+ }
108
+ set filterRadius(val) {
109
+ this._filterRadius = Math.max(0, val);
110
+ }
111
+ /**
112
+ * Whether the first downsample weights its taps by `1 / (1 + luma)` (the "Karis average").
113
+ *
114
+ * @remarks
115
+ * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel
116
+ * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on
117
+ * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,
118
+ * because the weighting deliberately holds the brightest samples back. Turn it off for a static
119
+ * scene that wants maximum reach and has no high-frequency speculars to stabilize.
120
+ */ get karisAverage() {
121
+ return this._karisAverage;
122
+ }
123
+ set karisAverage(val) {
124
+ this._karisAverage = !!val;
125
+ }
88
126
  /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */ requireLinearDepthTexture() {
89
127
  return false;
90
128
  }
@@ -226,7 +264,7 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
226
264
  device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);
227
265
  device.setViewport(null);
228
266
  device.setScissor(null);
229
- this.finalCompose(device, rg.getTexture(s.input), rg.getTexture(bloomHandle));
267
+ this.finalCompose(device, rg.getTexture(s.input), rg.getTexture(bloomHandle), output.srgbOutput);
230
268
  } finally{
231
269
  device.popDeviceStates();
232
270
  }
@@ -234,7 +272,7 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
234
272
  return output.color;
235
273
  });
236
274
  }
237
- /** {@inheritDoc AbstractPostEffect.apply} */ apply(ctx, inputColorTexture, _sceneDepthTexture, _srgbOutput) {
275
+ /** {@inheritDoc AbstractPostEffect.apply} */ apply(ctx, inputColorTexture, _sceneDepthTexture, srgbOutput) {
238
276
  const device = ctx.device;
239
277
  const downsampleTextures = [];
240
278
  this._prepare(device, inputColorTexture);
@@ -246,7 +284,7 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
246
284
  this.downsample(device, colorTex, downsampleTextures);
247
285
  this.upsample(device, downsampleTextures);
248
286
  device.popDeviceStates();
249
- this.finalCompose(device, inputColorTexture, downsampleTextures[0]);
287
+ this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput);
250
288
  for (const tex of downsampleTextures){
251
289
  device.pool.releaseTexture(tex);
252
290
  }
@@ -268,14 +306,22 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
268
306
  Bloom._bindgroupPrefilter.setTexture('tex', srcTexture);
269
307
  Bloom._bindgroupPrefilter.setValue('flip', device.type === 'webgpu' ? 1 : 0);
270
308
  Bloom._bindgroupPrefilter.setValue('threshold', this._thresholdValue);
309
+ // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.
310
+ this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);
311
+ Bloom._bindgroupPrefilter.setValue('invTexSize', this._invTexSize);
312
+ Bloom._bindgroupPrefilter.setValue('karis', this._karisAverage ? 1 : 0);
271
313
  this.drawFullscreenQuad();
272
314
  }
273
- /** @internal */ finalCompose(device, srcTexture, bloomTexture) {
315
+ /** @internal */ finalCompose(device, srcTexture, bloomTexture, srgbOutput) {
274
316
  device.setProgram(Bloom._programFinalCompose);
275
317
  device.setBindGroup(0, Bloom._bindgroupFinalCompose);
276
318
  Bloom._bindgroupFinalCompose.setTexture('srcTex', srcTexture);
277
319
  Bloom._bindgroupFinalCompose.setTexture('bloomTex', bloomTexture);
278
320
  Bloom._bindgroupFinalCompose.setValue('intensity', this._intensity);
321
+ // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this
322
+ // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the
323
+ // display scene-linear and everything darkens the moment bloom is switched on.
324
+ Bloom._bindgroupFinalCompose.setValue('srgbOut', srgbOutput ? 1 : 0);
279
325
  Bloom._bindgroupFinalCompose.setValue('flip', device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0);
280
326
  this.drawFullscreenQuad();
281
327
  }
@@ -289,6 +335,11 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
289
335
  device.setBindGroup(0, Bloom._bindgroupUpsample);
290
336
  Bloom._bindgroupUpsample.setValue('flip', device.type === 'webgpu' ? 1 : 0);
291
337
  Bloom._bindgroupUpsample.setTexture('tex', srcTexture);
338
+ // Tent offsets are in source-texel units, so the filter widens with the level it reads
339
+ // from and every level contributes a similarly shaped blur in screen space.
340
+ this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);
341
+ Bloom._bindgroupUpsample.setValue('invTexSize', this._invTexSize);
342
+ Bloom._bindgroupUpsample.setValue('radius', this._filterRadius);
292
343
  device.setFramebuffer([
293
344
  dstTexture
294
345
  ]);
@@ -362,6 +413,7 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
362
413
  this.srcTex = pb.tex2D().uniform(0);
363
414
  this.bloomTex = pb.tex2D().uniform(0);
364
415
  this.intensity = pb.float().uniform(0);
416
+ this.srgbOut = pb.int().uniform(0);
365
417
  this.$outputs.outColor = pb.vec4();
366
418
  pb.main(function() {
367
419
  this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);
@@ -376,6 +428,10 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
376
428
  this.$l.bloom = this.$choice(pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))), this.bloomSample.rgb, pb.vec3(0));
377
429
  // The clamp then only guards the half-float write against accumulated overshoot.
378
430
  this.$l.composed = pb.clamp(pb.add(this.src, pb.mul(this.bloom, this.intensity)), pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX));
431
+ // Only when this pass writes the screen directly; intermediate targets stay linear.
432
+ this.$if(pb.notEqual(this.srgbOut, 0), function() {
433
+ this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));
434
+ });
379
435
  this.$outputs.outColor = pb.vec4(this.composed, 1);
380
436
  });
381
437
  }
@@ -400,9 +456,54 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
400
456
  fragment (pb) {
401
457
  this.tex = pb.tex2D().uniform(0);
402
458
  this.threshold = pb.vec4().uniform(0);
459
+ this.invTexSize = pb.vec2().uniform(0);
460
+ this.karis = pb.int().uniform(0);
403
461
  this.$outputs.outColor = pb.vec4();
404
462
  pb.main(function() {
405
- this.$l.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);
463
+ // This pass is also the first (full -> half resolution) downsample, which is where the
464
+ // Call of Duty presentation puts the Karis average: a lone very bright texel -- a
465
+ // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates
466
+ // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by
467
+ // 1/(1+luma) lets the group's dimmer texels hold that spike down.
468
+ //
469
+ // The four taps sit at half-texel diagonals so each bilinear fetch already averages a
470
+ // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.
471
+ this.$l.raw = pb.vec4(0);
472
+ this.$if(pb.notEqual(this.karis, 0), function() {
473
+ this.$l.o = pb.mul(this.invTexSize, 0.5);
474
+ this.$l.acc = pb.vec3(0);
475
+ this.$l.wsum = pb.float(0);
476
+ const quad = [
477
+ [
478
+ -1,
479
+ -1
480
+ ],
481
+ [
482
+ 1,
483
+ -1
484
+ ],
485
+ [
486
+ -1,
487
+ 1
488
+ ],
489
+ [
490
+ 1,
491
+ 1
492
+ ]
493
+ ];
494
+ for (const [dx, dy] of quad){
495
+ this.$l.s = pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0).rgb;
496
+ // Reject non-finite taps here too; see the guard below for why.
497
+ this.s = this.$choice(pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))), pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)), pb.vec3(0));
498
+ // Karis weight uses perceived luminance, matching the original.
499
+ this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));
500
+ this.acc = pb.add(this.acc, pb.mul(this.s, this.w));
501
+ this.wsum = pb.add(this.wsum, this.w);
502
+ }
503
+ this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);
504
+ }).$else(function() {
505
+ this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);
506
+ });
406
507
  // Reject non-finite input before any arithmetic. An Inf makes the contribution below
407
508
  // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable
408
509
  // blur smears it across the coarsest mip and the upsample chain expands that single
@@ -442,9 +543,68 @@ import { Vector4, Vector2 } from '@zephyr3d/base';
442
543
  },
443
544
  fragment (pb) {
444
545
  this.tex = pb.tex2D().uniform(0);
546
+ this.invTexSize = pb.vec2().uniform(0);
547
+ this.radius = pb.float().uniform(0);
445
548
  this.$outputs.outColor = pb.vec4();
446
549
  pb.main(function() {
447
- this.$outputs.outColor = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);
550
+ // 3x3 tent filter, the upsample kernel from "Next Generation Post Processing in
551
+ // Call of Duty: Advanced Warfare". A bare bilinear tap here is what produced the
552
+ // blocky halo: one coarse texel covers a large screen area, so the level's square
553
+ // texel grid survives magnification and shows up as axis-aligned banding. The tent
554
+ // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.
555
+ this.$l.o = pb.mul(this.invTexSize, this.radius);
556
+ this.$l.sum = pb.vec3(0);
557
+ const taps = [
558
+ [
559
+ -1,
560
+ -1,
561
+ 1
562
+ ],
563
+ [
564
+ 0,
565
+ -1,
566
+ 2
567
+ ],
568
+ [
569
+ 1,
570
+ -1,
571
+ 1
572
+ ],
573
+ [
574
+ -1,
575
+ 0,
576
+ 2
577
+ ],
578
+ [
579
+ 0,
580
+ 0,
581
+ 4
582
+ ],
583
+ [
584
+ 1,
585
+ 0,
586
+ 2
587
+ ],
588
+ [
589
+ -1,
590
+ 1,
591
+ 1
592
+ ],
593
+ [
594
+ 0,
595
+ 1,
596
+ 2
597
+ ],
598
+ [
599
+ 1,
600
+ 1,
601
+ 1
602
+ ]
603
+ ];
604
+ for (const [dx, dy, w] of taps){
605
+ this.sum = pb.add(this.sum, pb.mul(pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0).rgb, w / 16));
606
+ }
607
+ this.$outputs.outColor = pb.vec4(this.sum, 1);
448
608
  });
449
609
  }
450
610
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.transparent;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(\r\n output.framebuffer ? rg.getFramebuffer<FrameBuffer>(output.framebuffer) : null\r\n );\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(device, rg.getTexture<Texture2D>(s.input), rg.getTexture<Texture2D>(bloomHandle));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, _srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_layer","PostEffectLayer","transparent","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","Math","max","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","color","apply","inputColorTexture","_sceneDepthTexture","_srgbOutput","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","drawFullscreenQuad","bloomTexture","textures","dstTexture","setXY","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","name","createBindGroup","bindGroupLayouts","raw","finite","p","brightness","r","g","b","soft","contrib","div","sub","offsets","weights","invTexSize","sum","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
1
+ {"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', this._karisAverage ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D, srgbOutput: boolean) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","textures","dstTexture","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","karis","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","weights","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
@@ -18,7 +18,8 @@ import { fetchSampler } from '../utility/misc.js';
18
18
  * Creates an instance of color adjust post effect.
19
19
  */ constructor(){
20
20
  super();
21
- this._layer = PostEffectLayer.transparent;
21
+ // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).
22
+ this._layer = PostEffectLayer.end;
22
23
  this._invTexSize = new Vector2();
23
24
  this._saturation = 1;
24
25
  this._contrast = 1;