@zephyr3d/scene 0.9.24 → 0.9.26

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 (264) hide show
  1. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  2. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  3. package/dist/animation/joint_dynamics/controller.js +7 -5
  4. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/morphtrack.js +3 -4
  8. package/dist/animation/morphtrack.js.map +1 -1
  9. package/dist/animation/skeleton.js +58 -24
  10. package/dist/animation/skeleton.js.map +1 -1
  11. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  12. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  13. package/dist/animation/spring/spring_collider.js +4 -3
  14. package/dist/animation/spring/spring_collider.js.map +1 -1
  15. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  16. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  17. package/dist/animation/spring/spring_particle.js +2 -0
  18. package/dist/animation/spring/spring_particle.js.map +1 -1
  19. package/dist/animation/spring/spring_system.js +11 -3
  20. package/dist/animation/spring/spring_system.js.map +1 -1
  21. package/dist/animation/spring_modifier.js +10 -0
  22. package/dist/animation/spring_modifier.js.map +1 -1
  23. package/dist/app/engine.js +53 -43
  24. package/dist/app/engine.js.map +1 -1
  25. package/dist/app/scriptingsystem.js +119 -6
  26. package/dist/app/scriptingsystem.js.map +1 -1
  27. package/dist/app/scriptregistry.js +3 -2
  28. package/dist/app/scriptregistry.js.map +1 -1
  29. package/dist/asset/assetmanager.js +284 -67
  30. package/dist/asset/assetmanager.js.map +1 -1
  31. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  32. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  33. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  34. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  35. package/dist/asset/model.js +178 -67
  36. package/dist/asset/model.js.map +1 -1
  37. package/dist/camera/camera.js +193 -21
  38. package/dist/camera/camera.js.map +1 -1
  39. package/dist/camera/perspectivecamera.js +3 -1
  40. package/dist/camera/perspectivecamera.js.map +1 -1
  41. package/dist/index.d.ts +4040 -1290
  42. package/dist/index.js +16 -6
  43. package/dist/index.js.map +1 -1
  44. package/dist/material/eye.js +932 -0
  45. package/dist/material/eye.js.map +1 -0
  46. package/dist/material/hair.js +917 -0
  47. package/dist/material/hair.js.map +1 -0
  48. package/dist/material/hairstrand.js +842 -0
  49. package/dist/material/hairstrand.js.map +1 -0
  50. package/dist/material/hairstrand_data.js +162 -0
  51. package/dist/material/hairstrand_data.js.map +1 -0
  52. package/dist/material/lambert.js +5 -2
  53. package/dist/material/lambert.js.map +1 -1
  54. package/dist/material/material.js +338 -300
  55. package/dist/material/material.js.map +1 -1
  56. package/dist/material/meshmaterial.js +120 -19
  57. package/dist/material/meshmaterial.js.map +1 -1
  58. package/dist/material/mixins/albedocolor.js +1 -1
  59. package/dist/material/mixins/albedocolor.js.map +1 -1
  60. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  61. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  63. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  65. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  67. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  70. package/dist/material/mixins/lit.js +73 -18
  71. package/dist/material/mixins/lit.js.map +1 -1
  72. package/dist/material/mixins/pbr/common.js +4 -4
  73. package/dist/material/mixins/pbr/common.js.map +1 -1
  74. package/dist/material/mixins/texture.js +48 -11
  75. package/dist/material/mixins/texture.js.map +1 -1
  76. package/dist/material/mtoon.js +6 -5
  77. package/dist/material/mtoon.js.map +1 -1
  78. package/dist/material/pbrblueprint.js +146 -28
  79. package/dist/material/pbrblueprint.js.map +1 -1
  80. package/dist/material/pbrblueprint_instance.js +501 -0
  81. package/dist/material/pbrblueprint_instance.js.map +1 -0
  82. package/dist/material/pbrmr.js +15 -16
  83. package/dist/material/pbrmr.js.map +1 -1
  84. package/dist/material/shader/helper.js +766 -456
  85. package/dist/material/shader/helper.js.map +1 -1
  86. package/dist/material/shader/terrain_blend.js +55 -0
  87. package/dist/material/shader/terrain_blend.js.map +1 -0
  88. package/dist/material/skin.js +192 -32
  89. package/dist/material/skin.js.map +1 -1
  90. package/dist/material/spriteblueprint.js +16 -1
  91. package/dist/material/spriteblueprint.js.map +1 -1
  92. package/dist/material/subsurfaceprofile.js +86 -23
  93. package/dist/material/subsurfaceprofile.js.map +1 -1
  94. package/dist/material/water.js +3 -1
  95. package/dist/material/water.js.map +1 -1
  96. package/dist/posteffect/bloom.js +167 -7
  97. package/dist/posteffect/bloom.js.map +1 -1
  98. package/dist/posteffect/coloradjust.js +2 -1
  99. package/dist/posteffect/coloradjust.js.map +1 -1
  100. package/dist/posteffect/compositor.js.map +1 -1
  101. package/dist/posteffect/fxaa.js +2 -1
  102. package/dist/posteffect/fxaa.js.map +1 -1
  103. package/dist/posteffect/grayscale.js +3 -1
  104. package/dist/posteffect/grayscale.js.map +1 -1
  105. package/dist/posteffect/motionblur.js +4 -1
  106. package/dist/posteffect/motionblur.js.map +1 -1
  107. package/dist/posteffect/posteffect.js.map +1 -1
  108. package/dist/posteffect/skinsss.js +368 -69
  109. package/dist/posteffect/skinsss.js.map +1 -1
  110. package/dist/posteffect/ssgi.js +16 -9
  111. package/dist/posteffect/ssgi.js.map +1 -1
  112. package/dist/posteffect/ssr.js +3 -0
  113. package/dist/posteffect/ssr.js.map +1 -1
  114. package/dist/posteffect/sss.js +91 -34
  115. package/dist/posteffect/sss.js.map +1 -1
  116. package/dist/posteffect/taa.js.map +1 -1
  117. package/dist/posteffect/tonemap.js +44 -1
  118. package/dist/posteffect/tonemap.js.map +1 -1
  119. package/dist/render/abuffer_oit.js +45 -39
  120. package/dist/render/abuffer_oit.js.map +1 -1
  121. package/dist/render/cluster_light.js +4 -4
  122. package/dist/render/cluster_light.js.map +1 -1
  123. package/dist/render/cull_visitor.js +19 -0
  124. package/dist/render/cull_visitor.js.map +1 -1
  125. package/dist/render/depthpass.js +36 -2
  126. package/dist/render/depthpass.js.map +1 -1
  127. package/dist/render/drawable_mixin.js +26 -1
  128. package/dist/render/drawable_mixin.js.map +1 -1
  129. package/dist/render/dualdepthpeeling_oit.js +52 -51
  130. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  131. package/dist/render/envlight.js +1 -1
  132. package/dist/render/envlight.js.map +1 -1
  133. package/dist/render/fbm_wavegenerator.js +3 -0
  134. package/dist/render/fbm_wavegenerator.js.map +1 -1
  135. package/dist/render/gerstner_wavegenerator.js +3 -0
  136. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  137. package/dist/render/globalbindgroup_allocator.js +3 -0
  138. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  139. package/dist/render/oit.js +29 -0
  140. package/dist/render/oit.js.map +1 -0
  141. package/dist/render/render_queue.js +3 -0
  142. package/dist/render/render_queue.js.map +1 -1
  143. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  144. package/dist/render/rendergraph/executor.js +2 -0
  145. package/dist/render/rendergraph/executor.js.map +1 -1
  146. package/dist/render/rendergraph/forward_plus_builder.js +61 -1
  147. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  148. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  149. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  150. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  151. package/dist/render/rendergraph/types.js.map +1 -1
  152. package/dist/render/shadow_mask_pass.js +73 -8
  153. package/dist/render/shadow_mask_pass.js.map +1 -1
  154. package/dist/render/sky.js +166 -126
  155. package/dist/render/sky.js.map +1 -1
  156. package/dist/render/weightedblended_oit.js +36 -35
  157. package/dist/render/weightedblended_oit.js.map +1 -1
  158. package/dist/scene/basesprite.js +8 -0
  159. package/dist/scene/basesprite.js.map +1 -1
  160. package/dist/scene/batchgroup.js +3 -0
  161. package/dist/scene/batchgroup.js.map +1 -1
  162. package/dist/scene/environment.js +4 -1
  163. package/dist/scene/environment.js.map +1 -1
  164. package/dist/scene/hair.js +963 -0
  165. package/dist/scene/hair.js.map +1 -0
  166. package/dist/scene/light.js +5 -1
  167. package/dist/scene/light.js.map +1 -1
  168. package/dist/scene/mesh.js +481 -47
  169. package/dist/scene/mesh.js.map +1 -1
  170. package/dist/scene/meshdrawable.js +6 -0
  171. package/dist/scene/meshdrawable.js.map +1 -1
  172. package/dist/scene/msdftext.js +3 -0
  173. package/dist/scene/msdftext.js.map +1 -1
  174. package/dist/scene/msdftextsprite.js +3 -0
  175. package/dist/scene/msdftextsprite.js.map +1 -1
  176. package/dist/scene/particlesys.js +6 -0
  177. package/dist/scene/particlesys.js.map +1 -1
  178. package/dist/scene/scene.js +3 -0
  179. package/dist/scene/scene.js.map +1 -1
  180. package/dist/scene/scene_node.js +6 -1
  181. package/dist/scene/scene_node.js.map +1 -1
  182. package/dist/scene/terrain-cm/grass.js +273 -249
  183. package/dist/scene/terrain-cm/grass.js.map +1 -1
  184. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  185. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  186. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  187. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  188. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  189. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  190. package/dist/scene/water.js +6 -0
  191. package/dist/scene/water.js.map +1 -1
  192. package/dist/shaders/atmosphere.js.map +1 -1
  193. package/dist/shaders/diffusion.js +54 -0
  194. package/dist/shaders/diffusion.js.map +1 -0
  195. package/dist/shaders/shadow.js +33 -21
  196. package/dist/shaders/shadow.js.map +1 -1
  197. package/dist/shaders/temporal.js +71 -33
  198. package/dist/shaders/temporal.js.map +1 -1
  199. package/dist/shadow/dom.js +546 -0
  200. package/dist/shadow/dom.js.map +1 -0
  201. package/dist/shadow/pcf_opt.js +3 -5
  202. package/dist/shadow/pcf_opt.js.map +1 -1
  203. package/dist/shadow/pcf_pd.js +1 -1
  204. package/dist/shadow/pcf_pd.js.map +1 -1
  205. package/dist/shadow/receiver_bias.js +41 -0
  206. package/dist/shadow/receiver_bias.js.map +1 -0
  207. package/dist/shadow/shader.js +20 -60
  208. package/dist/shadow/shader.js.map +1 -1
  209. package/dist/shadow/shadow_impl.js +89 -0
  210. package/dist/shadow/shadow_impl.js.map +1 -1
  211. package/dist/shadow/shadow_region.js +50 -50
  212. package/dist/shadow/shadow_region.js.map +1 -1
  213. package/dist/shadow/shadowmapper.js +150 -37
  214. package/dist/shadow/shadowmapper.js.map +1 -1
  215. package/dist/shapes/shape.js +11 -2
  216. package/dist/shapes/shape.js.map +1 -1
  217. package/dist/shapes/sphere.js +50 -9
  218. package/dist/shapes/sphere.js.map +1 -1
  219. package/dist/utility/blueprint/common/constants.js +112 -2
  220. package/dist/utility/blueprint/common/constants.js.map +1 -1
  221. package/dist/utility/blueprint/material/func.js +142 -49
  222. package/dist/utility/blueprint/material/func.js.map +1 -1
  223. package/dist/utility/blueprint/material/ir.js +490 -25
  224. package/dist/utility/blueprint/material/ir.js.map +1 -1
  225. package/dist/utility/blueprint/material/texture.js +898 -4
  226. package/dist/utility/blueprint/material/texture.js.map +1 -1
  227. package/dist/utility/serialization/manager.js +431 -100
  228. package/dist/utility/serialization/manager.js.map +1 -1
  229. package/dist/utility/serialization/scene/animation.js +370 -3
  230. package/dist/utility/serialization/scene/animation.js.map +1 -1
  231. package/dist/utility/serialization/scene/batch.js +4 -0
  232. package/dist/utility/serialization/scene/batch.js.map +1 -1
  233. package/dist/utility/serialization/scene/camera.js +133 -1
  234. package/dist/utility/serialization/scene/camera.js.map +1 -1
  235. package/dist/utility/serialization/scene/common.js +26 -5
  236. package/dist/utility/serialization/scene/common.js.map +1 -1
  237. package/dist/utility/serialization/scene/hair.js +1141 -0
  238. package/dist/utility/serialization/scene/hair.js.map +1 -0
  239. package/dist/utility/serialization/scene/light.js +84 -4
  240. package/dist/utility/serialization/scene/light.js.map +1 -1
  241. package/dist/utility/serialization/scene/material.js +1867 -166
  242. package/dist/utility/serialization/scene/material.js.map +1 -1
  243. package/dist/utility/serialization/scene/mesh.js +231 -14
  244. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  245. package/dist/utility/serialization/scene/node.js +141 -7
  246. package/dist/utility/serialization/scene/node.js.map +1 -1
  247. package/dist/utility/serialization/scene/particle.js +4 -0
  248. package/dist/utility/serialization/scene/particle.js.map +1 -1
  249. package/dist/utility/serialization/scene/primitive.js +18 -0
  250. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  251. package/dist/utility/serialization/scene/sprite.js +4 -0
  252. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  253. package/dist/utility/serialization/scene/terrain.js +92 -69
  254. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  255. package/dist/utility/serialization/scene/text.js +4 -0
  256. package/dist/utility/serialization/scene/text.js.map +1 -1
  257. package/dist/utility/serialization/scene/water.js +4 -0
  258. package/dist/utility/serialization/scene/water.js.map +1 -1
  259. package/dist/utility/serialization/types.js.map +1 -1
  260. package/dist/utility/shprojector.js +96 -95
  261. package/dist/utility/shprojector.js.map +1 -1
  262. package/dist/values.js +105 -58
  263. package/dist/values.js.map +1 -1
  264. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"taa.js","sources":["../../src/posteffect/taa.ts"],"sourcesContent":["import type { BindGroup, FrameBuffer, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext, Primitive } from '../render';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { BoxShape } from '../shapes';\r\nimport { temporalResolve } from '../shaders/temporal';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_COMPARE_DEFAULT, DEPTH_FARTHEST, Vector2 } from '@zephyr3d/base';\r\nimport { RGHistoryResources } from '../render/rendergraph/history_resources';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport type { RGHandle, RGTextureDesc } from '../render/rendergraph/types';\r\n\r\n/** @internal */\r\nexport class TAA extends AbstractPostEffect {\r\n private static _resolveProgram: GPUProgram[] = [];\r\n private static _skyMotionVectorProgram: Nullable<GPUProgram> = null;\r\n private static _box: Primitive;\r\n private static readonly _texSize = new Vector2();\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _skyMotionVectorBindGroup: Nullable<BindGroup>;\r\n constructor() {\r\n super();\r\n this._bindGroup = null;\r\n this._layer = PostEffectLayer.end;\r\n this._skyMotionVectorBindGroup = null;\r\n }\r\n renderSkyMotionVectors(ctx: DrawContext) {\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n ctx.motionVectorTexture!,\r\n ctx.depthTexture\r\n );\r\n const program = TAA._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = TAA._getBox(ctx);\r\n this._skyMotionVectorBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n this._skyMotionVectorBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n this._skyMotionVectorBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n this._skyMotionVectorBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._skyMotionVectorBindGroup);\r\n ctx.device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, DEPTH_COMPARE_DEFAULT));\r\n ctx.device.setFramebuffer(fb);\r\n box.draw();\r\n ctx.device.popDeviceStates();\r\n ctx.device.pool.releaseFrameBuffer(fb);\r\n }\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const historyManager = ctx.camera.getHistoryResourceManager();\r\n const prevColorTex = historyManager!.tryGetPrevious(RGHistoryResources.TAA_COLOR);\r\n const prevMotionVectorTex = historyManager!.tryGetPrevious(RGHistoryResources.TAA_MOTION_VECTOR);\r\n if (\r\n !prevColorTex ||\r\n !prevMotionVectorTex ||\r\n prevColorTex.width !== inputColorTexture.width ||\r\n prevColorTex.height !== inputColorTexture.height\r\n ) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n } else {\r\n this._resolve(\r\n ctx,\r\n inputColorTexture,\r\n sceneDepthTexture,\r\n ctx.motionVectorTexture!,\r\n prevColorTex,\r\n prevMotionVectorTex,\r\n srgbOutput\r\n );\r\n }\r\n }\r\n /** @internal */\r\n private _resolve(\r\n ctx: DrawContext,\r\n inputColorTexture: Texture2D,\r\n sceneDepthTexture: Texture2D,\r\n motionVectorTexture: Texture2D,\r\n prevColorTex: Texture2D,\r\n prevMotionVectorTex: Texture2D,\r\n srgbOutput: boolean\r\n ) {\r\n let program = TAA._resolveProgram[ctx.camera.TAADebug];\r\n if (!program) {\r\n program = TAA._getResolveProgram(ctx, ctx.camera.TAADebug);\r\n TAA._resolveProgram[ctx.camera.TAADebug] = program;\r\n }\r\n if (!this._bindGroup) {\r\n this._bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n this._bindGroup.setTexture('historyColorTex', prevColorTex, fetchSampler('clamp_linear_nomip'));\r\n this._bindGroup.setTexture('currentColorTex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('currentDepthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('motionVector', motionVectorTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('prevMotionVector', prevMotionVectorTex, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n this._bindGroup.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n TAA._texSize.setXY(sceneDepthTexture.width, sceneDepthTexture.height);\r\n this._bindGroup.setValue('texSize', TAA._texSize);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._bindGroup);\r\n this.drawFullscreenQuad();\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native implementation: previous-frame color/motion-vector textures are\r\n * imported as graph resources at build time and this frame's resolve output\r\n * and motion vectors are queued as retained history commits, making TAA\r\n * fully self-describing (no builder-side history plumbing).\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx, history, blackboard } = s;\r\n const motionVectorHandle = blackboard.get(FrameResources.MotionVector);\r\n const linearDepthHandle = blackboard.get(FrameResources.LinearDepth);\r\n if (!history || !motionVectorHandle || !linearDepthHandle) {\r\n // No temporal inputs available this frame — the legacy path degrades to\r\n // a pass-through.\r\n return this._setupFromApply(s);\r\n }\r\n const historySize = { width: s.width, height: s.height };\r\n const colorDesc: RGTextureDesc = {\r\n format: s.colorFormat,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const motionVectorDesc: RGTextureDesc = {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const prevColorHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_COLOR,\r\n colorDesc,\r\n historySize\r\n );\r\n const prevMotionVectorHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n motionVectorDesc,\r\n historySize\r\n );\r\n\r\n return graph.addPass('PostEffect:TAA', (builder) => {\r\n builder.read(s.input);\r\n builder.read(linearDepthHandle);\r\n builder.read(motionVectorHandle);\r\n if (prevColorHandle) {\r\n builder.read(prevColorHandle);\r\n }\r\n if (prevMotionVectorHandle) {\r\n builder.read(prevMotionVectorHandle);\r\n }\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n // requireDepthAttachment is true, so this always resolves to an\r\n // intermediate texture — required anyway for the history commit below.\r\n const output = s.createOutput(builder, { needDepthAttachment: true });\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 const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n const depthTexture = rg.getTexture<Texture2D>(linearDepthHandle);\r\n const motionVectorTexture = rg.getTexture<Texture2D>(motionVectorHandle);\r\n const prevColorTex = prevColorHandle ? rg.getTexture<Texture2D>(prevColorHandle) : null;\r\n const prevMotionVectorTex = prevMotionVectorHandle\r\n ? rg.getTexture<Texture2D>(prevMotionVectorHandle)\r\n : null;\r\n if (\r\n !prevColorTex ||\r\n !prevMotionVectorTex ||\r\n prevColorTex.width !== inputTexture.width ||\r\n prevColorTex.height !== inputTexture.height\r\n ) {\r\n this.passThrough(ctx, inputTexture, output.srgbOutput);\r\n } else {\r\n this._resolve(\r\n ctx,\r\n inputTexture,\r\n depthTexture,\r\n motionVectorTexture,\r\n prevColorTex,\r\n prevMotionVectorTex,\r\n output.srgbOutput\r\n );\r\n }\r\n // Queue this frame's history: the TAA resolve output and the frame's\r\n // motion vectors. Commits are applied only after the graph executes\r\n // successfully (HistoryResourceManager.commitFrame).\r\n const outputTexture = rg.getTexture<Texture2D>(output.color);\r\n history.queueRetainedCommit(\r\n RGHistoryResources.TAA_COLOR,\r\n {\r\n format: outputTexture.format,\r\n sizeMode: 'absolute',\r\n width: outputTexture.width,\r\n height: outputTexture.height\r\n },\r\n { width: outputTexture.width, height: outputTexture.height },\r\n outputTexture\r\n );\r\n history.queueRetainedCommit(\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n {\r\n format: motionVectorTexture.format,\r\n sizeMode: 'absolute',\r\n width: motionVectorTexture.width,\r\n height: motionVectorTexture.height\r\n },\r\n { width: motionVectorTexture.width, height: motionVectorTexture.height },\r\n motionVectorTexture\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return true;\r\n }\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return true;\r\n }\r\n requireMotionVectorTexture(_ctx: DrawContext) {\r\n return true;\r\n }\r\n private static _getSkyMotionVectorProgram(ctx: DrawContext) {\r\n if (!this._skyMotionVectorProgram) {\r\n this._skyMotionVectorProgram = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = ShaderHelper.farthestClipZ(this, this.clipPos.w);\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n this._skyMotionVectorProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n return this._skyMotionVectorProgram;\r\n }\r\n private static _getBox(_ctx: DrawContext) {\r\n if (!this._box) {\r\n this._box = new BoxShape({\r\n size: 2,\r\n needNormal: false,\r\n needUV: false\r\n });\r\n }\r\n return this._box;\r\n }\r\n private static _getResolveProgram(ctx: DrawContext, debug: number) {\r\n const program = ctx.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, DEPTH_FARTHEST, 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.historyColorTex = pb.tex2D().uniform(0);\r\n this.currentColorTex = pb.tex2D().uniform(0);\r\n this.currentDepthTex = pb.tex2D().uniform(0);\r\n this.motionVector = pb.tex2D().uniform(0);\r\n this.prevMotionVector = pb.tex2D().uniform(0);\r\n this.texSize = pb.vec2().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.screenUV = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.texSize);\r\n this.$l.resolvedColor = temporalResolve(\r\n this,\r\n this.currentColorTex,\r\n this.historyColorTex,\r\n this.currentDepthTex,\r\n this.motionVector,\r\n this.prevMotionVector,\r\n this.screenUV,\r\n this.texSize,\r\n debug\r\n );\r\n this.$if(pb.equal(this.srgbOut, 0), function () {\r\n this.$outputs.outColor = pb.vec4(this.resolvedColor, 1);\r\n }).$else(function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.resolvedColor), 1);\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@TAA_Resolve';\r\n return program;\r\n }\r\n}\r\n"],"names":["TAA","AbstractPostEffect","_resolveProgram","_skyMotionVectorProgram","_box","_texSize","Vector2","_bindGroup","_skyMotionVectorBindGroup","_layer","PostEffectLayer","end","renderSkyMotionVectors","ctx","fb","device","pool","fetchTemporalFramebuffer","motionVectorTexture","depthTexture","program","_getSkyMotionVectorProgram","createBindGroup","bindGroupLayouts","box","_getBox","setValue","camera","viewProjectionMatrix","prevVPMatrix","getWorldPosition","prevPosition","pushDeviceStates","setProgram","setBindGroup","setRenderStates","getDefaultRenderState","DEPTH_COMPARE_DEFAULT","setFramebuffer","draw","popDeviceStates","releaseFrameBuffer","apply","inputColorTexture","sceneDepthTexture","srgbOutput","historyManager","getHistoryResourceManager","prevColorTex","tryGetPrevious","RGHistoryResources","TAA_COLOR","prevMotionVectorTex","TAA_MOTION_VECTOR","width","height","passThrough","_resolve","TAADebug","_getResolveProgram","setTexture","fetchSampler","needFlip","setXY","drawFullscreenQuad","setup","s","graph","history","blackboard","motionVectorHandle","get","FrameResources","MotionVector","linearDepthHandle","LinearDepth","_setupFromApply","historySize","colorDesc","format","colorFormat","sizeMode","motionVectorDesc","prevColorHandle","importPreviousIfCompatible","prevMotionVectorHandle","addPass","builder","read","input","dep","dependencies","output","createOutput","needDepthAttachment","setExecute","rg","framebuffer","getFramebuffer","inputTexture","getTexture","outputTexture","color","queueRetainedCommit","requireLinearDepthTexture","_ctx","requireDepthAttachment","requireMotionVectorTexture","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","ShaderHelper","farthestClipZ","w","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","name","BoxShape","size","needNormal","needUV","debug","flip","int","vec2","uv","DEPTH_FARTHEST","$if","notEqual","y","neg","historyColorTex","tex2D","currentColorTex","currentDepthTex","prevMotionVector","texSize","srgbOut","outColor","screenUV","fragCoord","resolvedColor","temporalResolve","equal","$else","linearToGamma"],"mappings":"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"}
1
+ {"version":3,"file":"taa.js","sources":["../../src/posteffect/taa.ts"],"sourcesContent":["import type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext, Primitive } from '../render';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { BoxShape } from '../shapes';\r\nimport { temporalResolve } from '../shaders/temporal';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_COMPARE_DEFAULT, DEPTH_FARTHEST, Vector2 } from '@zephyr3d/base';\r\nimport { RGHistoryResources } from '../render/rendergraph/history_resources';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport type { RGHandle, RGTextureDesc } from '../render/rendergraph/types';\r\n\r\n/** @internal */\r\nexport class TAA extends AbstractPostEffect {\r\n private static _resolveProgram: GPUProgram[] = [];\r\n private static _skyMotionVectorProgram: Nullable<GPUProgram> = null;\r\n private static _box: Primitive;\r\n private static readonly _texSize = new Vector2();\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _skyMotionVectorBindGroup: Nullable<BindGroup>;\r\n constructor() {\r\n super();\r\n this._bindGroup = null;\r\n this._layer = PostEffectLayer.end;\r\n this._skyMotionVectorBindGroup = null;\r\n }\r\n renderSkyMotionVectors(ctx: DrawContext) {\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n ctx.motionVectorTexture!,\r\n ctx.depthTexture\r\n );\r\n const program = TAA._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = TAA._getBox(ctx);\r\n this._skyMotionVectorBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n this._skyMotionVectorBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n this._skyMotionVectorBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n this._skyMotionVectorBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._skyMotionVectorBindGroup);\r\n ctx.device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, DEPTH_COMPARE_DEFAULT));\r\n ctx.device.setFramebuffer(fb);\r\n box.draw();\r\n ctx.device.popDeviceStates();\r\n ctx.device.pool.releaseFrameBuffer(fb);\r\n }\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const historyManager = ctx.camera.getHistoryResourceManager();\r\n const prevColorTex = historyManager!.tryGetPrevious(RGHistoryResources.TAA_COLOR);\r\n const prevMotionVectorTex = historyManager!.tryGetPrevious(RGHistoryResources.TAA_MOTION_VECTOR);\r\n if (\r\n !prevColorTex ||\r\n !prevMotionVectorTex ||\r\n prevColorTex.width !== inputColorTexture.width ||\r\n prevColorTex.height !== inputColorTexture.height\r\n ) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n } else {\r\n this._resolve(\r\n ctx,\r\n inputColorTexture,\r\n sceneDepthTexture,\r\n ctx.motionVectorTexture!,\r\n prevColorTex,\r\n prevMotionVectorTex,\r\n srgbOutput\r\n );\r\n }\r\n }\r\n /** @internal */\r\n private _resolve(\r\n ctx: DrawContext,\r\n inputColorTexture: Texture2D,\r\n sceneDepthTexture: Texture2D,\r\n motionVectorTexture: Texture2D,\r\n prevColorTex: Texture2D,\r\n prevMotionVectorTex: Texture2D,\r\n srgbOutput: boolean\r\n ) {\r\n let program = TAA._resolveProgram[ctx.camera.TAADebug];\r\n if (!program) {\r\n program = TAA._getResolveProgram(ctx, ctx.camera.TAADebug);\r\n TAA._resolveProgram[ctx.camera.TAADebug] = program;\r\n }\r\n if (!this._bindGroup) {\r\n this._bindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n this._bindGroup.setTexture('historyColorTex', prevColorTex, fetchSampler('clamp_linear_nomip'));\r\n this._bindGroup.setTexture('currentColorTex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('currentDepthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('motionVector', motionVectorTexture, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setTexture('prevMotionVector', prevMotionVectorTex, fetchSampler('clamp_nearest_nomip'));\r\n this._bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n this._bindGroup.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n TAA._texSize.setXY(sceneDepthTexture.width, sceneDepthTexture.height);\r\n this._bindGroup.setValue('texSize', TAA._texSize);\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._bindGroup);\r\n this.drawFullscreenQuad();\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native implementation: previous-frame color/motion-vector textures are\r\n * imported as graph resources at build time and this frame's resolve output\r\n * and motion vectors are queued as retained history commits, making TAA\r\n * fully self-describing (no builder-side history plumbing).\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx, history, blackboard } = s;\r\n const motionVectorHandle = blackboard.get(FrameResources.MotionVector);\r\n const linearDepthHandle = blackboard.get(FrameResources.LinearDepth);\r\n if (!history || !motionVectorHandle || !linearDepthHandle) {\r\n // No temporal inputs available this frame — the legacy path degrades to\r\n // a pass-through.\r\n return this._setupFromApply(s);\r\n }\r\n const historySize = { width: s.width, height: s.height };\r\n const colorDesc: RGTextureDesc = {\r\n format: s.colorFormat,\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const motionVectorDesc: RGTextureDesc = {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: s.width,\r\n height: s.height\r\n };\r\n const prevColorHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_COLOR,\r\n colorDesc,\r\n historySize\r\n );\r\n const prevMotionVectorHandle = history.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n motionVectorDesc,\r\n historySize\r\n );\r\n\r\n return graph.addPass('PostEffect:TAA', (builder) => {\r\n builder.read(s.input);\r\n builder.read(linearDepthHandle);\r\n builder.read(motionVectorHandle);\r\n if (prevColorHandle) {\r\n builder.read(prevColorHandle);\r\n }\r\n if (prevMotionVectorHandle) {\r\n builder.read(prevMotionVectorHandle);\r\n }\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n // requireDepthAttachment is true, so this always resolves to an\r\n // intermediate texture — required anyway for the history commit below.\r\n const output = s.createOutput(builder, { needDepthAttachment: true });\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 const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n const depthTexture = rg.getTexture<Texture2D>(linearDepthHandle);\r\n const motionVectorTexture = rg.getTexture<Texture2D>(motionVectorHandle);\r\n const prevColorTex = prevColorHandle ? rg.getTexture<Texture2D>(prevColorHandle) : null;\r\n const prevMotionVectorTex = prevMotionVectorHandle\r\n ? rg.getTexture<Texture2D>(prevMotionVectorHandle)\r\n : null;\r\n if (\r\n !prevColorTex ||\r\n !prevMotionVectorTex ||\r\n prevColorTex.width !== inputTexture.width ||\r\n prevColorTex.height !== inputTexture.height\r\n ) {\r\n this.passThrough(ctx, inputTexture, output.srgbOutput);\r\n } else {\r\n this._resolve(\r\n ctx,\r\n inputTexture,\r\n depthTexture,\r\n motionVectorTexture,\r\n prevColorTex,\r\n prevMotionVectorTex,\r\n output.srgbOutput\r\n );\r\n }\r\n // Queue this frame's history: the TAA resolve output and the frame's\r\n // motion vectors. Commits are applied only after the graph executes\r\n // successfully (HistoryResourceManager.commitFrame).\r\n const outputTexture = rg.getTexture<Texture2D>(output.color);\r\n history.queueRetainedCommit(\r\n RGHistoryResources.TAA_COLOR,\r\n {\r\n format: outputTexture.format,\r\n sizeMode: 'absolute',\r\n width: outputTexture.width,\r\n height: outputTexture.height\r\n },\r\n { width: outputTexture.width, height: outputTexture.height },\r\n outputTexture\r\n );\r\n history.queueRetainedCommit(\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n {\r\n format: motionVectorTexture.format,\r\n sizeMode: 'absolute',\r\n width: motionVectorTexture.width,\r\n height: motionVectorTexture.height\r\n },\r\n { width: motionVectorTexture.width, height: motionVectorTexture.height },\r\n motionVectorTexture\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return true;\r\n }\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return true;\r\n }\r\n requireMotionVectorTexture(_ctx: DrawContext) {\r\n return true;\r\n }\r\n private static _getSkyMotionVectorProgram(ctx: DrawContext) {\r\n if (!this._skyMotionVectorProgram) {\r\n this._skyMotionVectorProgram = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = ShaderHelper.farthestClipZ(this, this.clipPos.w);\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n this._skyMotionVectorProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n return this._skyMotionVectorProgram;\r\n }\r\n private static _getBox(_ctx: DrawContext) {\r\n if (!this._box) {\r\n this._box = new BoxShape({\r\n size: 2,\r\n needNormal: false,\r\n needUV: false\r\n });\r\n }\r\n return this._box;\r\n }\r\n private static _getResolveProgram(ctx: DrawContext, debug: number) {\r\n const program = ctx.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, DEPTH_FARTHEST, 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.historyColorTex = pb.tex2D().uniform(0);\r\n this.currentColorTex = pb.tex2D().uniform(0);\r\n this.currentDepthTex = pb.tex2D().uniform(0);\r\n this.motionVector = pb.tex2D().uniform(0);\r\n this.prevMotionVector = pb.tex2D().uniform(0);\r\n this.texSize = pb.vec2().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.screenUV = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this.texSize);\r\n this.$l.resolvedColor = temporalResolve(\r\n this,\r\n this.currentColorTex,\r\n this.historyColorTex,\r\n this.currentDepthTex,\r\n this.motionVector,\r\n this.prevMotionVector,\r\n this.screenUV,\r\n this.texSize,\r\n debug\r\n );\r\n this.$if(pb.equal(this.srgbOut, 0), function () {\r\n this.$outputs.outColor = pb.vec4(this.resolvedColor, 1);\r\n }).$else(function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.resolvedColor), 1);\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@TAA_Resolve';\r\n return program;\r\n }\r\n}\r\n"],"names":["TAA","AbstractPostEffect","_resolveProgram","_skyMotionVectorProgram","_box","_texSize","Vector2","_bindGroup","_skyMotionVectorBindGroup","_layer","PostEffectLayer","end","renderSkyMotionVectors","ctx","fb","device","pool","fetchTemporalFramebuffer","motionVectorTexture","depthTexture","program","_getSkyMotionVectorProgram","createBindGroup","bindGroupLayouts","box","_getBox","setValue","camera","viewProjectionMatrix","prevVPMatrix","getWorldPosition","prevPosition","pushDeviceStates","setProgram","setBindGroup","setRenderStates","getDefaultRenderState","DEPTH_COMPARE_DEFAULT","setFramebuffer","draw","popDeviceStates","releaseFrameBuffer","apply","inputColorTexture","sceneDepthTexture","srgbOutput","historyManager","getHistoryResourceManager","prevColorTex","tryGetPrevious","RGHistoryResources","TAA_COLOR","prevMotionVectorTex","TAA_MOTION_VECTOR","width","height","passThrough","_resolve","TAADebug","_getResolveProgram","setTexture","fetchSampler","needFlip","setXY","drawFullscreenQuad","setup","s","graph","history","blackboard","motionVectorHandle","get","FrameResources","MotionVector","linearDepthHandle","LinearDepth","_setupFromApply","historySize","colorDesc","format","colorFormat","sizeMode","motionVectorDesc","prevColorHandle","importPreviousIfCompatible","prevMotionVectorHandle","addPass","builder","read","input","dep","dependencies","output","createOutput","needDepthAttachment","setExecute","rg","framebuffer","getFramebuffer","inputTexture","getTexture","outputTexture","color","queueRetainedCommit","requireLinearDepthTexture","_ctx","requireDepthAttachment","requireMotionVectorTexture","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","ShaderHelper","farthestClipZ","w","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","name","BoxShape","size","needNormal","needUV","debug","flip","int","vec2","uv","DEPTH_FARTHEST","$if","notEqual","y","neg","historyColorTex","tex2D","currentColorTex","currentDepthTex","prevMotionVector","texSize","srgbOut","outColor","screenUV","fragCoord","resolvedColor","temporalResolve","equal","$else","linearToGamma"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { AbstractPostEffect, PostEffectLayer } from './posteffect.js';
2
2
  import { linearToGamma } from '../shaders/misc.js';
3
+ import { SSR_interleavedGradientNoise } from '../shaders/ssr.js';
3
4
  import { fetchSampler } from '../utility/misc.js';
4
5
 
5
6
  /**
@@ -15,12 +16,32 @@ import { fetchSampler } from '../utility/misc.js';
15
16
  static _programTonemap = null;
16
17
  static _bindgroupTonemap = null;
17
18
  _exposure;
19
+ _dither;
18
20
  /**
19
21
  * Creates an instance of tonemap post effect
20
22
  */ constructor(){
21
23
  super();
22
- this._layer = PostEffectLayer.transparent;
24
+ // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).
25
+ this._layer = PostEffectLayer.end;
23
26
  this._exposure = 1;
27
+ this._dither = true;
28
+ }
29
+ /**
30
+ * Whether to dither the result before it is quantized to an 8-bit target.
31
+ *
32
+ * @remarks
33
+ * Costs a handful of ALU operations and removes the banding that shallow gradients -- bloom
34
+ * halos, smooth skies, fog -- otherwise show once rounded to 8 bits. The added noise is +-1 code
35
+ * value, below the visible threshold on any ordinary display. Only applied when this pass writes
36
+ * the final 8-bit target; a half-float intermediate is left untouched.
37
+ *
38
+ * Turn it off when capturing frames for pixel comparison, where reproducible output matters more
39
+ * than smooth gradients.
40
+ */ get dither() {
41
+ return this._dither;
42
+ }
43
+ set dither(val) {
44
+ this._dither = !!val;
24
45
  }
25
46
  /**
26
47
  * Exposure multiplier applied before the ACES curve.
@@ -47,6 +68,9 @@ import { fetchSampler } from '../utility/misc.js';
47
68
  }
48
69
  /** @internal */ _tonemap(device, inputColorTexture, sRGBOutput) {
49
70
  Tonemap._bindgroupTonemap.setValue('srgbOut', sRGBOutput ? 1 : 0);
71
+ // Only dither when this pass feeds an 8-bit target. Writing into a half-float intermediate
72
+ // (an effect still follows) has ~11 bits of mantissa to spare, so noise there is pure loss.
73
+ Tonemap._bindgroupTonemap.setValue('dither', this._dither && sRGBOutput ? 1 : 0);
50
74
  Tonemap._bindgroupTonemap.setValue('exposure', this._exposure * Tonemap.ACES_INPUT_SCALE);
51
75
  Tonemap._bindgroupTonemap.setValue('flip', this.needFlip(device) ? 1 : 0);
52
76
  Tonemap._bindgroupTonemap.setTexture('tex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));
@@ -72,6 +96,7 @@ import { fetchSampler } from '../utility/misc.js';
72
96
  fragment (pb) {
73
97
  this.srgbOut = pb.int().uniform(0);
74
98
  this.exposure = pb.float().uniform(0);
99
+ this.dither = pb.int().uniform(0);
75
100
  this.tex = pb.tex2D().uniform(0);
76
101
  this.$outputs.outColor = pb.vec4();
77
102
  pb.func('RRTAndODTFit', [
@@ -93,6 +118,24 @@ import { fetchSampler } from '../utility/misc.js';
93
118
  this.$if(pb.notEqual(this.srgbOut, 0), function() {
94
119
  this.color = linearToGamma(this, this.color);
95
120
  });
121
+ // Dither before the 8-bit write. This pass ends the HDR chain, so it is where a
122
+ // shallow gradient gets quantized -- and a bloom halo is the shallowest gradient the
123
+ // renderer produces: it can fall by less than 1/255 over several pixels, which
124
+ // rounding turns into wide flat bands. Offsetting each pixel by well under one code
125
+ // value before rounding trades those bands for noise below the visible threshold.
126
+ //
127
+ // The offset is a triangular PDF (sum of two uniforms), which is what audio and video
128
+ // dithering use: unlike a single uniform it leaves no residual correlation between the
129
+ // quantization error and the signal, so the bands do not merely move.
130
+ this.$if(pb.notEqual(this.dither, 0), function() {
131
+ // Interleaved gradient noise, the same helper the SSR and eye passes use. Two
132
+ // decorrelated samples (the second offset by a half-period) sum to the triangular
133
+ // distribution; (n1 + n2 - 1) then spans [-1, 1], scaled here to +-1 code value.
134
+ this.$l.n1 = SSR_interleavedGradientNoise(this, this.$builtins.fragCoord.xy, 0);
135
+ this.$l.n2 = SSR_interleavedGradientNoise(this, pb.add(this.$builtins.fragCoord.xy, pb.vec2(37, 17)), 0);
136
+ this.color = pb.add(this.color, pb.vec3(pb.div(pb.sub(pb.add(this.n1, this.n2), 1), 255)));
137
+ this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(1));
138
+ });
96
139
  this.$outputs.outColor = pb.vec4(this.color, 1);
97
140
  });
98
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tonemap.js","sources":["../../src/posteffect/tonemap.ts"],"sourcesContent":["import { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * The tonemap post effect\r\n * @public\r\n */\r\nexport class Tonemap extends AbstractPostEffect {\r\n /**\r\n * @internal\r\n *\r\n * ACES input calibration. Matches Filament's `ACESLegacy` tone mapper, which pre-scales its input\r\n * by `1 / 0.6` before the RRT+ODT fit. Applied in every lighting mode, independent of exposure.\r\n */\r\n static readonly ACES_INPUT_SCALE = 1 / 0.6;\r\n private static _programTonemap: Nullable<GPUProgram> = null;\r\n private static _bindgroupTonemap: Nullable<BindGroup> = null;\r\n private _exposure: 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._exposure = 1;\r\n }\r\n /**\r\n * Exposure multiplier applied before the ACES curve.\r\n *\r\n * @remarks\r\n * Physical lighting pre-exposes every light quantity on the CPU, so this stays at 1 there and\r\n * only legacy uses it as a brightness control.\r\n */\r\n get exposure() {\r\n return this._exposure;\r\n }\r\n set exposure(val) {\r\n this._exposure = 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.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n this._prepare(device, inputColorTexture);\r\n this._tonemap(device, inputColorTexture, srgbOutput);\r\n }\r\n /** @internal */\r\n private _tonemap(device: AbstractDevice, inputColorTexture: Texture2D, sRGBOutput: boolean) {\r\n Tonemap._bindgroupTonemap!.setValue('srgbOut', sRGBOutput ? 1 : 0);\r\n Tonemap._bindgroupTonemap!.setValue('exposure', this._exposure * Tonemap.ACES_INPUT_SCALE);\r\n Tonemap._bindgroupTonemap!.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n Tonemap._bindgroupTonemap!.setTexture('tex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n device.setProgram(Tonemap._programTonemap);\r\n device.setBindGroup(0, Tonemap._bindgroupTonemap!);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Tonemap._programTonemap) {\r\n Tonemap._programTonemap = 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.srgbOut = pb.int().uniform(0);\r\n this.exposure = pb.float().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('RRTAndODTFit', [pb.vec3('v')], function () {\r\n this.$l.a = pb.sub(pb.mul(this.v, pb.add(this.v, pb.vec3(0.0245786))), pb.vec3(0.000090537));\r\n this.$l.b = pb.add(\r\n pb.mul(this.v, pb.add(pb.mul(this.v, 0.983729), pb.vec3(0.432951))),\r\n pb.vec3(0.238081)\r\n );\r\n this.$return(pb.div(this.a, this.b));\r\n });\r\n pb.main(function () {\r\n this.$l.vSample = pb.textureSample(this.tex, this.$inputs.uv);\r\n this.$l.ACESInputMat = pb.mat3(\r\n 0.59719,\r\n 0.076,\r\n 0.0284,\r\n 0.35458,\r\n 0.90834,\r\n 0.13383,\r\n 0.04823,\r\n 0.01566,\r\n 0.83777\r\n );\r\n this.$l.ACESOutputMat = pb.mat3(\r\n 1.60475,\r\n -0.10208,\r\n -0.00327,\r\n -0.53108,\r\n 1.10813,\r\n -0.07276,\r\n -0.07367,\r\n -0.00605,\r\n 1.07602\r\n );\r\n this.$l.color = pb.mul(this.vSample.rgb, this.exposure);\r\n this.color = pb.mul(this.ACESInputMat, this.color);\r\n this.color = this.RRTAndODTFit(this.color);\r\n this.color = pb.mul(this.ACESOutputMat, this.color);\r\n this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(1));\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.color = linearToGamma(this, this.color);\r\n });\r\n this.$outputs.outColor = pb.vec4(this.color, 1);\r\n });\r\n }\r\n })!;\r\n Tonemap._programTonemap.name = '@Tonemap';\r\n Tonemap._bindgroupTonemap = device.createBindGroup(Tonemap._programTonemap.bindGroupLayouts[0]);\r\n }\r\n }\r\n}\r\n"],"names":["Tonemap","AbstractPostEffect","ACES_INPUT_SCALE","_programTonemap","_bindgroupTonemap","_exposure","_layer","PostEffectLayer","transparent","exposure","val","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","_prepare","_tonemap","sRGBOutput","setValue","needFlip","setTexture","fetchSampler","setProgram","setBindGroup","drawFullscreenQuad","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srgbOut","float","tex","tex2D","outColor","func","vec3","$l","a","sub","v","b","$return","div","vSample","textureSample","ACESInputMat","mat3","ACESOutputMat","color","rgb","RRTAndODTFit","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
1
+ {"version":3,"file":"tonemap.js","sources":["../../src/posteffect/tonemap.ts"],"sourcesContent":["import { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { SSR_interleavedGradientNoise } from '../shaders/ssr';\r\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * The tonemap post effect\r\n * @public\r\n */\r\nexport class Tonemap extends AbstractPostEffect {\r\n /**\r\n * @internal\r\n *\r\n * ACES input calibration. Matches Filament's `ACESLegacy` tone mapper, which pre-scales its input\r\n * by `1 / 0.6` before the RRT+ODT fit. Applied in every lighting mode, independent of exposure.\r\n */\r\n static readonly ACES_INPUT_SCALE = 1 / 0.6;\r\n private static _programTonemap: Nullable<GPUProgram> = null;\r\n private static _bindgroupTonemap: Nullable<BindGroup> = null;\r\n private _exposure: number;\r\n private _dither: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).\r\n this._layer = PostEffectLayer.end;\r\n this._exposure = 1;\r\n this._dither = true;\r\n }\r\n /**\r\n * Whether to dither the result before it is quantized to an 8-bit target.\r\n *\r\n * @remarks\r\n * Costs a handful of ALU operations and removes the banding that shallow gradients -- bloom\r\n * halos, smooth skies, fog -- otherwise show once rounded to 8 bits. The added noise is +-1 code\r\n * value, below the visible threshold on any ordinary display. Only applied when this pass writes\r\n * the final 8-bit target; a half-float intermediate is left untouched.\r\n *\r\n * Turn it off when capturing frames for pixel comparison, where reproducible output matters more\r\n * than smooth gradients.\r\n */\r\n get dither() {\r\n return this._dither;\r\n }\r\n set dither(val) {\r\n this._dither = !!val;\r\n }\r\n /**\r\n * Exposure multiplier applied before the ACES curve.\r\n *\r\n * @remarks\r\n * Physical lighting pre-exposes every light quantity on the CPU, so this stays at 1 there and\r\n * only legacy uses it as a brightness control.\r\n */\r\n get exposure() {\r\n return this._exposure;\r\n }\r\n set exposure(val) {\r\n this._exposure = 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.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n this._prepare(device, inputColorTexture);\r\n this._tonemap(device, inputColorTexture, srgbOutput);\r\n }\r\n /** @internal */\r\n private _tonemap(device: AbstractDevice, inputColorTexture: Texture2D, sRGBOutput: boolean) {\r\n Tonemap._bindgroupTonemap!.setValue('srgbOut', sRGBOutput ? 1 : 0);\r\n // Only dither when this pass feeds an 8-bit target. Writing into a half-float intermediate\r\n // (an effect still follows) has ~11 bits of mantissa to spare, so noise there is pure loss.\r\n Tonemap._bindgroupTonemap!.setValue('dither', this._dither && sRGBOutput ? 1 : 0);\r\n Tonemap._bindgroupTonemap!.setValue('exposure', this._exposure * Tonemap.ACES_INPUT_SCALE);\r\n Tonemap._bindgroupTonemap!.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n Tonemap._bindgroupTonemap!.setTexture('tex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n device.setProgram(Tonemap._programTonemap);\r\n device.setBindGroup(0, Tonemap._bindgroupTonemap!);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Tonemap._programTonemap) {\r\n Tonemap._programTonemap = 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.srgbOut = pb.int().uniform(0);\r\n this.exposure = pb.float().uniform(0);\r\n this.dither = pb.int().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('RRTAndODTFit', [pb.vec3('v')], function () {\r\n this.$l.a = pb.sub(pb.mul(this.v, pb.add(this.v, pb.vec3(0.0245786))), pb.vec3(0.000090537));\r\n this.$l.b = pb.add(\r\n pb.mul(this.v, pb.add(pb.mul(this.v, 0.983729), pb.vec3(0.432951))),\r\n pb.vec3(0.238081)\r\n );\r\n this.$return(pb.div(this.a, this.b));\r\n });\r\n pb.main(function () {\r\n this.$l.vSample = pb.textureSample(this.tex, this.$inputs.uv);\r\n this.$l.ACESInputMat = pb.mat3(\r\n 0.59719,\r\n 0.076,\r\n 0.0284,\r\n 0.35458,\r\n 0.90834,\r\n 0.13383,\r\n 0.04823,\r\n 0.01566,\r\n 0.83777\r\n );\r\n this.$l.ACESOutputMat = pb.mat3(\r\n 1.60475,\r\n -0.10208,\r\n -0.00327,\r\n -0.53108,\r\n 1.10813,\r\n -0.07276,\r\n -0.07367,\r\n -0.00605,\r\n 1.07602\r\n );\r\n this.$l.color = pb.mul(this.vSample.rgb, this.exposure);\r\n this.color = pb.mul(this.ACESInputMat, this.color);\r\n this.color = this.RRTAndODTFit(this.color);\r\n this.color = pb.mul(this.ACESOutputMat, this.color);\r\n this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(1));\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.color = linearToGamma(this, this.color);\r\n });\r\n // Dither before the 8-bit write. This pass ends the HDR chain, so it is where a\r\n // shallow gradient gets quantized -- and a bloom halo is the shallowest gradient the\r\n // renderer produces: it can fall by less than 1/255 over several pixels, which\r\n // rounding turns into wide flat bands. Offsetting each pixel by well under one code\r\n // value before rounding trades those bands for noise below the visible threshold.\r\n //\r\n // The offset is a triangular PDF (sum of two uniforms), which is what audio and video\r\n // dithering use: unlike a single uniform it leaves no residual correlation between the\r\n // quantization error and the signal, so the bands do not merely move.\r\n this.$if(pb.notEqual(this.dither, 0), function () {\r\n // Interleaved gradient noise, the same helper the SSR and eye passes use. Two\r\n // decorrelated samples (the second offset by a half-period) sum to the triangular\r\n // distribution; (n1 + n2 - 1) then spans [-1, 1], scaled here to +-1 code value.\r\n this.$l.n1 = SSR_interleavedGradientNoise(this, this.$builtins.fragCoord.xy, 0);\r\n this.$l.n2 = SSR_interleavedGradientNoise(\r\n this,\r\n pb.add(this.$builtins.fragCoord.xy, pb.vec2(37, 17)),\r\n 0\r\n );\r\n this.color = pb.add(this.color, pb.vec3(pb.div(pb.sub(pb.add(this.n1, this.n2), 1), 255)));\r\n this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(1));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.color, 1);\r\n });\r\n }\r\n })!;\r\n Tonemap._programTonemap.name = '@Tonemap';\r\n Tonemap._bindgroupTonemap = device.createBindGroup(Tonemap._programTonemap.bindGroupLayouts[0]);\r\n }\r\n }\r\n}\r\n"],"names":["Tonemap","AbstractPostEffect","ACES_INPUT_SCALE","_programTonemap","_bindgroupTonemap","_exposure","_dither","_layer","PostEffectLayer","end","dither","val","exposure","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","_prepare","_tonemap","sRGBOutput","setValue","needFlip","setTexture","fetchSampler","setProgram","setBindGroup","drawFullscreenQuad","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srgbOut","float","tex","tex2D","outColor","func","vec3","$l","a","sub","v","b","$return","div","vSample","textureSample","ACESInputMat","mat3","ACESOutputMat","color","rgb","RRTAndODTFit","clamp","linearToGamma","n1","SSR_interleavedGradientNoise","fragCoord","n2","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { OIT } from './oit.js';
1
2
  import { drawFullscreenQuad } from './fullscreenquad.js';
2
3
  import { ShaderHelper } from '../material/shader/helper.js';
3
4
  import '../material/lambert.js';
@@ -6,10 +7,13 @@ import '../material/unlit.js';
6
7
  import '../material/particle.js';
7
8
  import '../material/subsurfaceprofile.js';
8
9
  import '../material/skin.js';
10
+ import '../material/eye.js';
9
11
  import '@zephyr3d/device';
10
12
  import '../values.js';
11
- import { Disposable, DEPTH_FARTHEST } from '@zephyr3d/base';
13
+ import { DEPTH_FARTHEST } from '@zephyr3d/base';
12
14
  import '../material/meshmaterial.js';
15
+ import '../material/hair.js';
16
+ import '../material/hairstrand.js';
13
17
  import '../material/grassmaterial.js';
14
18
  import '../material/terrain-cm.js';
15
19
  import '../material/pbrmr.js';
@@ -20,14 +24,14 @@ import '../material/sprite.js';
20
24
  import '../material/sprite_std.js';
21
25
  import '../utility/blueprint/material/texture.js';
22
26
 
23
- /**
24
- * per-pixel linked list OIT renderer using ABuffer.
25
- *
26
- * @remarks
27
- * The ABuffer OIT renderer only supports WebGPU device.
28
- *
29
- * @public
30
- */ class ABufferOIT extends Disposable {
27
+ /**
28
+ * per-pixel linked list OIT renderer using ABuffer.
29
+ *
30
+ * @remarks
31
+ * The ABuffer OIT renderer only supports WebGPU device.
32
+ *
33
+ * @public
34
+ */ class ABufferOIT extends OIT {
31
35
  /** Type name of ABufferOIT */ static type = 'ab';
32
36
  static usePremultipliedAlpha = true;
33
37
  static MAX_FRAGMENT_LAYERS = 75;
@@ -49,10 +53,10 @@ import '../utility/blueprint/material/texture.js';
49
53
  _currentPass;
50
54
  _savedScissor;
51
55
  _singleColorFramebuffer;
52
- /**
53
- * Creates an instance of ABufferOIT class
54
- *
55
- * @param numLayers - How many transparent layers, default is 16
56
+ /**
57
+ * Creates an instance of ABufferOIT class
58
+ *
59
+ * @param numLayers - How many transparent layers, default is 16
56
60
  */ constructor(numLayers = 16){
57
61
  super();
58
62
  this._nodeBuffer = null;
@@ -72,28 +76,28 @@ import '../utility/blueprint/material/texture.js';
72
76
  this._currentPass = 0;
73
77
  this._singleColorFramebuffer = null;
74
78
  }
75
- /**
76
- * {@inheritDoc OIT.getType}
79
+ /**
80
+ * {@inheritDoc OIT.getType}
77
81
  */ getType() {
78
82
  return ABufferOIT.type;
79
83
  }
80
- /**
81
- * {@inheritDoc OIT.supportDevice}
84
+ /**
85
+ * {@inheritDoc OIT.supportDevice}
82
86
  */ supportDevice(deviceType) {
83
87
  return deviceType === 'webgpu';
84
88
  }
85
- /**
86
- * {@inheritDoc OIT.wantsPremultipliedAlpha}
89
+ /**
90
+ * {@inheritDoc OIT.wantsPremultipliedAlpha}
87
91
  */ wantsPremultipliedAlpha() {
88
92
  return ABufferOIT.usePremultipliedAlpha;
89
93
  }
90
- /**
91
- * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
94
+ /**
95
+ * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
92
96
  */ wantsAdditiveLightPassAlpha() {
93
97
  return true;
94
98
  }
95
- /**
96
- * {@inheritDoc OIT.begin}
99
+ /**
100
+ * {@inheritDoc OIT.begin}
97
101
  */ begin(ctx) {
98
102
  const device = ctx.device;
99
103
  this._savedScissor = device.getScissor();
@@ -102,6 +106,8 @@ import '../utility/blueprint/material/texture.js';
102
106
  const screenWidth = device.screenXToDevice(viewport.width);
103
107
  const screenHeight = device.screenYToDevice(Math.max(viewport.height, 1));
104
108
  if (screenWidth !== this._screenSize[0] || screenHeight !== this._screenSize[1]) {
109
+ // Mark uniform changed
110
+ this.uniformChanged();
105
111
  // Resize buffers if viewport was changed
106
112
  this._screenSize[0] = screenWidth;
107
113
  this._screenSize[1] = screenHeight;
@@ -152,14 +158,14 @@ import '../utility/blueprint/material/texture.js';
152
158
  }
153
159
  return this._scissorSlices;
154
160
  }
155
- /**
156
- * {@inheritDoc OIT.end}
161
+ /**
162
+ * {@inheritDoc OIT.end}
157
163
  */ end(ctx) {
158
164
  // Restore scissor rect
159
165
  ctx.device.setScissor(this._savedScissor);
160
166
  }
161
- /**
162
- * {@inheritDoc OIT.setupFragmentOutput}
167
+ /**
168
+ * {@inheritDoc OIT.setupFragmentOutput}
163
169
  */ setupFragmentOutput(scope) {
164
170
  const pb = scope.$builder;
165
171
  scope.Z_AB_scissorOffset = pb.uint().uniformBuffer(2);
@@ -170,8 +176,8 @@ import '../utility/blueprint/material/texture.js';
170
176
  scope.Z_AB_depthTexture = pb.tex2D().uniform(2).noSampler();
171
177
  scope.$outputs.outColor = pb.vec4();
172
178
  }
173
- /**
174
- * {@inheritDoc OIT.beginPass}
179
+ /**
180
+ * {@inheritDoc OIT.beginPass}
175
181
  */ beginPass(ctx, pass) {
176
182
  this._currentPass = pass;
177
183
  const device = ctx.device;
@@ -216,8 +222,8 @@ import '../utility/blueprint/material/texture.js';
216
222
  }
217
223
  return true;
218
224
  }
219
- /**
220
- * {@inheritDoc OIT.endPass}
225
+ /**
226
+ * {@inheritDoc OIT.endPass}
221
227
  */ endPass(ctx, pass) {
222
228
  const device = ctx.device;
223
229
  ABufferOIT.getCompositeProgram(device);
@@ -256,13 +262,13 @@ import '../utility/blueprint/material/texture.js';
256
262
  }
257
263
  }
258
264
  }
259
- /**
260
- * {@inheritDoc OIT.calculateHash}
265
+ /**
266
+ * {@inheritDoc OIT.calculateHash}
261
267
  */ calculateHash() {
262
268
  return this._hash;
263
269
  }
264
- /**
265
- * {@inheritDoc OIT.applyUniforms}
270
+ /**
271
+ * {@inheritDoc OIT.applyUniforms}
266
272
  */ applyUniforms(ctx, bindGroup) {
267
273
  bindGroup.setBuffer('Z_AB_nodeBuffer', this._nodeBuffer);
268
274
  bindGroup.setBuffer('Z_AB_scissorOffset', this._scissorOffsetBuffer, 0, this._currentPass * ABufferOIT._ubAlignment, ABufferOIT._ubAlignment);
@@ -270,8 +276,8 @@ import '../utility/blueprint/material/texture.js';
270
276
  bindGroup.setValue('Z_AB_screenSize', this._screenSize[0]);
271
277
  bindGroup.setTexture('Z_AB_depthTexture', ctx.linearDepthTexture);
272
278
  }
273
- /**
274
- * {@inheritDoc OIT.outputFragmentColor}
279
+ /**
280
+ * {@inheritDoc OIT.outputFragmentColor}
275
281
  */ outputFragmentColor(scope, color) {
276
282
  const pb = scope.$builder;
277
283
  // linear depth of current fragment
@@ -295,8 +301,8 @@ import '../utility/blueprint/material/texture.js';
295
301
  });
296
302
  return true;
297
303
  }
298
- /**
299
- * {@inheritDoc OIT.setRenderStates}
304
+ /**
305
+ * {@inheritDoc OIT.setRenderStates}
300
306
  */ setRenderStates(rs) {
301
307
  const stencilStates = rs.useStencilState();
302
308
  stencilStates.enable(true);