@zephyr3d/scene 0.9.21 → 0.9.23

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 (238) hide show
  1. package/dist/animation/joint_dynamics/collision.js +1 -7
  2. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  3. package/dist/animation/joint_dynamics/constraints.js +2 -17
  4. package/dist/animation/joint_dynamics/constraints.js.map +1 -1
  5. package/dist/animation/joint_dynamics/controller.js +2 -20
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
  8. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  9. package/dist/animation/joint_dynamics/solver.js +14 -60
  10. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  11. package/dist/animation/joint_dynamics/types.js +3 -3
  12. package/dist/animation/joint_dynamics/types.js.map +1 -1
  13. package/dist/app/app.js +23 -0
  14. package/dist/app/app.js.map +1 -1
  15. package/dist/app/scriptregistry.js +16 -53
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +2 -0
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +22 -0
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/blitter/bilateralblur.js +3 -1
  22. package/dist/blitter/bilateralblur.js.map +1 -1
  23. package/dist/blitter/blitter.js +3 -3
  24. package/dist/blitter/blitter.js.map +1 -1
  25. package/dist/camera/camera.js +398 -45
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/camera/perspectivecamera.js +69 -2
  28. package/dist/camera/perspectivecamera.js.map +1 -1
  29. package/dist/index.d.ts +9100 -8712
  30. package/dist/index.js +9 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/material/blinn.js +1 -1
  33. package/dist/material/blinn.js.map +1 -1
  34. package/dist/material/lambert.js +3 -3
  35. package/dist/material/lambert.js.map +1 -1
  36. package/dist/material/material.js +8 -5
  37. package/dist/material/material.js.map +1 -1
  38. package/dist/material/meshmaterial.js +17 -10
  39. package/dist/material/meshmaterial.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  41. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  43. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
  45. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
  47. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  48. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
  49. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  50. package/dist/material/mixins/lit.js +33 -11
  51. package/dist/material/mixins/lit.js.map +1 -1
  52. package/dist/material/mixins/pbr/brdf.js +44 -12
  53. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  54. package/dist/material/mixins/pbr/common.js +149 -14
  55. package/dist/material/mixins/pbr/common.js.map +1 -1
  56. package/dist/material/mtoon.js +7 -4
  57. package/dist/material/mtoon.js.map +1 -1
  58. package/dist/material/pbrblueprint.js +5 -1
  59. package/dist/material/pbrblueprint.js.map +1 -1
  60. package/dist/material/pbrmr.js +1 -1
  61. package/dist/material/pbrmr.js.map +1 -1
  62. package/dist/material/pbrsg.js +1 -1
  63. package/dist/material/pbrsg.js.map +1 -1
  64. package/dist/material/shader/helper.js +186 -11
  65. package/dist/material/shader/helper.js.map +1 -1
  66. package/dist/material/skin.js +2 -2
  67. package/dist/material/skin.js.map +1 -1
  68. package/dist/material/terrain-cm.js +5 -5
  69. package/dist/material/terrain-cm.js.map +1 -1
  70. package/dist/material/water.js +6 -4
  71. package/dist/material/water.js.map +1 -1
  72. package/dist/posteffect/bloom.js +54 -4
  73. package/dist/posteffect/bloom.js.map +1 -1
  74. package/dist/posteffect/compositor.js +41 -0
  75. package/dist/posteffect/compositor.js.map +1 -1
  76. package/dist/posteffect/posteffect.js +51 -0
  77. package/dist/posteffect/posteffect.js.map +1 -1
  78. package/dist/posteffect/sao.js +7 -6
  79. package/dist/posteffect/sao.js.map +1 -1
  80. package/dist/posteffect/skinsss.js +3 -3
  81. package/dist/posteffect/skinsss.js.map +1 -1
  82. package/dist/posteffect/ssgi.js +1196 -0
  83. package/dist/posteffect/ssgi.js.map +1 -0
  84. package/dist/posteffect/ssr.js +83 -45
  85. package/dist/posteffect/ssr.js.map +1 -1
  86. package/dist/posteffect/sss.js +137 -49
  87. package/dist/posteffect/sss.js.map +1 -1
  88. package/dist/posteffect/taa.js +5 -4
  89. package/dist/posteffect/taa.js.map +1 -1
  90. package/dist/posteffect/tonemap.js +15 -3
  91. package/dist/posteffect/tonemap.js.map +1 -1
  92. package/dist/render/abuffer_oit.js +2 -2
  93. package/dist/render/abuffer_oit.js.map +1 -1
  94. package/dist/render/cluster_light.js +12 -6
  95. package/dist/render/cluster_light.js.map +1 -1
  96. package/dist/render/drawable_mixin.js +8 -5
  97. package/dist/render/drawable_mixin.js.map +1 -1
  98. package/dist/render/dualdepthpeeling_oit.js +10 -5
  99. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  100. package/dist/render/envlight.js +298 -5
  101. package/dist/render/envlight.js.map +1 -1
  102. package/dist/render/gpu_picking.js +7 -5
  103. package/dist/render/gpu_picking.js.map +1 -1
  104. package/dist/render/hzb.js +28 -19
  105. package/dist/render/hzb.js.map +1 -1
  106. package/dist/render/lightpass.js +18 -4
  107. package/dist/render/lightpass.js.map +1 -1
  108. package/dist/render/render_queue.js +37 -4
  109. package/dist/render/render_queue.js.map +1 -1
  110. package/dist/render/renderer.js +8 -3
  111. package/dist/render/renderer.js.map +1 -1
  112. package/dist/render/rendergraph/blackboard.js +20 -48
  113. package/dist/render/rendergraph/blackboard.js.map +1 -1
  114. package/dist/render/rendergraph/device_pool_allocator.js +18 -58
  115. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  116. package/dist/render/rendergraph/executor.js +89 -115
  117. package/dist/render/rendergraph/executor.js.map +1 -1
  118. package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
  119. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  120. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  121. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  122. package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
  123. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
  124. package/dist/render/rendergraph/history_resource_manager.js +74 -140
  125. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  126. package/dist/render/rendergraph/history_resources.js +7 -5
  127. package/dist/render/rendergraph/history_resources.js.map +1 -1
  128. package/dist/render/rendergraph/render_context.js +19 -0
  129. package/dist/render/rendergraph/render_context.js.map +1 -0
  130. package/dist/render/rendergraph/render_pipeline.js +315 -0
  131. package/dist/render/rendergraph/render_pipeline.js.map +1 -0
  132. package/dist/render/rendergraph/rendergraph.js +158 -141
  133. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  134. package/dist/render/rendergraph/scene_render_context.js +267 -0
  135. package/dist/render/rendergraph/scene_render_context.js.map +1 -0
  136. package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
  137. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
  138. package/dist/render/rendergraph/types.js +19 -31
  139. package/dist/render/rendergraph/types.js.map +1 -1
  140. package/dist/render/renderpass.js +3 -3
  141. package/dist/render/renderpass.js.map +1 -1
  142. package/dist/render/shadow_mask_pass.js +10 -6
  143. package/dist/render/shadow_mask_pass.js.map +1 -1
  144. package/dist/render/sky.js +197 -35
  145. package/dist/render/sky.js.map +1 -1
  146. package/dist/render/weightedblended_oit.js +4 -3
  147. package/dist/render/weightedblended_oit.js.map +1 -1
  148. package/dist/scene/basesprite.js +2 -0
  149. package/dist/scene/basesprite.js.map +1 -1
  150. package/dist/scene/batchgroup.js +10 -0
  151. package/dist/scene/batchgroup.js.map +1 -1
  152. package/dist/scene/environment.js +61 -2
  153. package/dist/scene/environment.js.map +1 -1
  154. package/dist/scene/light.js +178 -10
  155. package/dist/scene/light.js.map +1 -1
  156. package/dist/scene/meshdrawable.js +89 -2
  157. package/dist/scene/meshdrawable.js.map +1 -1
  158. package/dist/scene/msdftext.js +2 -0
  159. package/dist/scene/msdftext.js.map +1 -1
  160. package/dist/scene/msdftextsprite.js +2 -0
  161. package/dist/scene/msdftextsprite.js.map +1 -1
  162. package/dist/scene/particlesys.js +2 -0
  163. package/dist/scene/particlesys.js.map +1 -1
  164. package/dist/scene/scene.js +34 -1
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/terrain-cm/grass.js +2 -1
  167. package/dist/scene/terrain-cm/grass.js.map +1 -1
  168. package/dist/scene/terrain-cm/terrain-cm.js +2 -0
  169. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  170. package/dist/scene/water.js +2 -0
  171. package/dist/scene/water.js.map +1 -1
  172. package/dist/shaders/atmosphere.js +5 -4
  173. package/dist/shaders/atmosphere.js.map +1 -1
  174. package/dist/shaders/fog.js +10 -3
  175. package/dist/shaders/fog.js.map +1 -1
  176. package/dist/shaders/shadow.js +96 -29
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shaders/ssgi.js +63 -0
  179. package/dist/shaders/ssgi.js.map +1 -0
  180. package/dist/shaders/ssgi_reprojection.js +118 -0
  181. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  182. package/dist/shaders/ssr.js +322 -154
  183. package/dist/shaders/ssr.js.map +1 -1
  184. package/dist/shadow/esm.js +13 -8
  185. package/dist/shadow/esm.js.map +1 -1
  186. package/dist/shadow/pcf_opt.js +15 -12
  187. package/dist/shadow/pcf_opt.js.map +1 -1
  188. package/dist/shadow/pcf_pd.js +15 -12
  189. package/dist/shadow/pcf_pd.js.map +1 -1
  190. package/dist/shadow/pcss.js +17 -11
  191. package/dist/shadow/pcss.js.map +1 -1
  192. package/dist/shadow/shadow_impl.js +20 -2
  193. package/dist/shadow/shadow_impl.js.map +1 -1
  194. package/dist/shadow/shadowmapper.js +10 -3
  195. package/dist/shadow/shadowmapper.js.map +1 -1
  196. package/dist/shadow/ssm.js +16 -13
  197. package/dist/shadow/ssm.js.map +1 -1
  198. package/dist/shadow/vsm.js +10 -8
  199. package/dist/shadow/vsm.js.map +1 -1
  200. package/dist/utility/physical.js +74 -0
  201. package/dist/utility/physical.js.map +1 -0
  202. package/dist/utility/rendermipmap.js +2 -2
  203. package/dist/utility/rendermipmap.js.map +1 -1
  204. package/dist/utility/serialization/manager.js +3 -1
  205. package/dist/utility/serialization/manager.js.map +1 -1
  206. package/dist/utility/serialization/scene/animation.js +3 -1
  207. package/dist/utility/serialization/scene/animation.js.map +1 -1
  208. package/dist/utility/serialization/scene/batch.js +3 -1
  209. package/dist/utility/serialization/scene/batch.js.map +1 -1
  210. package/dist/utility/serialization/scene/camera.js +598 -2
  211. package/dist/utility/serialization/scene/camera.js.map +1 -1
  212. package/dist/utility/serialization/scene/light.js +180 -9
  213. package/dist/utility/serialization/scene/light.js.map +1 -1
  214. package/dist/utility/serialization/scene/material.js +43 -3
  215. package/dist/utility/serialization/scene/material.js.map +1 -1
  216. package/dist/utility/serialization/scene/mesh.js +3 -1
  217. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  218. package/dist/utility/serialization/scene/node.js +3 -1
  219. package/dist/utility/serialization/scene/node.js.map +1 -1
  220. package/dist/utility/serialization/scene/particle.js +3 -1
  221. package/dist/utility/serialization/scene/particle.js.map +1 -1
  222. package/dist/utility/serialization/scene/primitive.js +2 -0
  223. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  224. package/dist/utility/serialization/scene/scene.js +70 -0
  225. package/dist/utility/serialization/scene/scene.js.map +1 -1
  226. package/dist/utility/serialization/scene/sprite.js +3 -1
  227. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  228. package/dist/utility/serialization/scene/terrain.js +3 -1
  229. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  230. package/dist/utility/serialization/scene/text.js +3 -0
  231. package/dist/utility/serialization/scene/text.js.map +1 -1
  232. package/dist/utility/serialization/scene/water.js +3 -1
  233. package/dist/utility/serialization/scene/water.js.map +1 -1
  234. package/dist/values.js +2 -3
  235. package/dist/values.js.map +1 -1
  236. package/package.json +3 -3
  237. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  238. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler, getSamplerOptions } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get Charlie-filtered sheen radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Sheen roughness\r\n *\r\n * @returns The sheen radiance for the fragment\r\n */\r\n abstract getSheenRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports sheen reflective light\r\n */\r\n abstract hasSheenRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP = 'zIBLSheenRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(\r\n radianceMap?: TextureCube,\r\n irradianceSH?: GPUDataBuffer,\r\n irradianceSHFB?: FrameBuffer,\r\n sheenRadianceMap?: TextureCube\r\n ) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._sheenRadianceMap = new DRef(sheenRadianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The Charlie-filtered sheen radiance map */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n // Prefiltered radiance cube: mipmap chain indexed by roughness\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.sheenRadianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n // SH coefficients are read at texel centers; nearest sampling is exact\r\n tex.withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.sheenRadianceMap) {\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP, this.sheenRadianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n return pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return !!this._sheenRadianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","radianceMap","irradianceSH","irradianceSHFB","sheenRadianceMap","_radianceMap","DRef","_sheenRadianceMap","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","shaderKind","getGlobalScope","texCube","uniform","withSampler","getSamplerOptions","float","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec3","vec4","uniformBuffer","updateBindGroup","bg","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getSheenRadiance","getIrradiance","normal","that","func","$return","v","y","z","x","sub","$l","window","c","vec2","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","Z_sh_eval","hasRadiance","hasSheenRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","Vector4","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor","mix"],"mappings":"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"}
1
+ {"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Matrix4x4, REVERSE_Z, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler, getSamplerOptions } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { DrawContext } from './drawable';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\n\r\n/**\r\n * Depth-proportional term of the SSGI history rejection tolerance.\r\n *\r\n * The surface history stores `linearDepth * cameraFar` in an `rgba16f` alpha\r\n * channel, so its quantization error grows with depth: fp16 carries ~11 bits of\r\n * mantissa, giving a relative error near 4.9e-4 (~0.49 world units at a depth of\r\n * 1000). A purely absolute tolerance is therefore unusable in the distance -- at\r\n * `ssgiDepthReject`'s 0.5 default, storage quantization alone consumes the whole\r\n * budget and the test degenerates into dithered noise. This factor keeps roughly\r\n * 4x headroom over that error while staying far below the depth step of a real\r\n * disocclusion.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_DEPTH_TOLERANCE_RELATIVE = 2e-3;\r\n\r\n/**\r\n * Multiple of the scaled tolerance at which history is dropped outright.\r\n *\r\n * Inside this gate the depth term contributes a smooth `exp(-d/tol)` weight\r\n * rather than a boolean, so confidence decays continuously instead of flipping.\r\n * At 3x the weight is already down to ~0.05, making the cutoff visually\r\n * continuous -- which is what keeps a rejection boundary from reading as a\r\n * staircase after nearest-neighbour sampling quantizes it to texel steps.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_DEPTH_GATE_SCALE = 3;\r\n\r\n/**\r\n * Clamp distance, in texels, at which history repair reaches its widest radius.\r\n *\r\n * The clamp distance says how far the reprojection had to travel to get back on\r\n * screen, which is a direct measure of how unrelated to this pixel the surviving\r\n * history is. It scales the repair radius rather than gating repair off: the\r\n * lighting pass only ever sees the previous frame, so a pixel rotating in from\r\n * off screen has no fresh data anywhere and both alternatives to spreading the\r\n * taps look worse than the blur does.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_REPAIR_WIDE_CLAMP_TEXELS = 8;\r\n\r\n/**\r\n * Repair tap radius in texels, from an interior hole to a camera-edge one.\r\n *\r\n * The radius is what trades structure against smoothness. At one texel the taps\r\n * of neighbouring pixels barely overlap, so detail survives -- correct for a hole\r\n * in the middle of the screen, where the reprojection landed near its true\r\n * position. Wide taps instead overlap heavily between neighbours, which turns the\r\n * one strip of history that survives at a screen edge into a smooth low-frequency\r\n * estimate of the surface's irradiance rather than a per-column copy of single\r\n * texels, and copying single texels is what draws streaks along the direction of\r\n * travel.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_REPAIR_MIN_RADIUS_TEXELS = 1;\r\nconst SSGI_REPAIR_MAX_RADIUS_TEXELS = 16;\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup, ctx?: DrawContext): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get Charlie-filtered sheen radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Sheen roughness\r\n *\r\n * @returns The sheen radiance for the fragment\r\n */\r\n abstract getSheenRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports sheen reflective light\r\n */\r\n abstract hasSheenRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP = 'zIBLSheenRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_IRRADIANCE = 'zSSGIPreviousIrradiance';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_SURFACE = 'zSSGIPreviousSurface';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_CURRENT_DEPTH = 'zSSGICurrentDepth';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_MOTION = 'zSSGICurrentMotion';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_TARGET_SIZE = 'zSSGITargetSize';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_REPROJECTION = 'zSSGIReprojection';\r\n /**\r\n * Transforms a current-frame view-space position into previous-frame clip\r\n * space, so the reprojected depth can be compared against the surface history\r\n * in the frame that history was written in. @internal\r\n */\r\n public static readonly UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP = 'zSSGIViewToPrevClip';\r\n /** Unprojects a screen-space sample back into current view space. @internal */\r\n public static readonly UNIFORM_NAME_SSGI_INV_PROJECTION = 'zSSGIInvProjection';\r\n /** Scratch for the view -> previous clip composition. @internal */\r\n private static readonly _viewToPrevClip = new Matrix4x4();\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(\r\n radianceMap?: TextureCube,\r\n irradianceSH?: GPUDataBuffer,\r\n irradianceSHFB?: FrameBuffer,\r\n sheenRadianceMap?: TextureCube\r\n ) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._sheenRadianceMap = new DRef(sheenRadianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The Charlie-filtered sheen radiance map */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n // Prefiltered radiance cube: mipmap chain indexed by roughness\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.sheenRadianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n // SH coefficients are read at texel centers; nearest sampling is exact\r\n tex.withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n if (EnvShIBL.hasSSGIHistory(ctx)) {\r\n const irradianceSampler =\r\n pb.getDevice().type === 'webgl' ? 'clamp_nearest_nomip' : 'clamp_linear_nomip';\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions(irradianceSampler));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n if (ctx?.motionVectorTexture) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_MOTION] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n }\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE] = pb.vec2().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP] = pb.mat4().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION] = pb.mat4().uniform(0);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.sheenRadianceMap) {\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP, this.sheenRadianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n if (EnvShIBL.hasSSGIHistory(ctx)) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE,\r\n ctx!.SSGIIrradianceHistoryTexture!,\r\n fetchSampler(ctx!.device.type === 'webgl' ? 'clamp_nearest_nomip' : 'clamp_linear_nomip')\r\n );\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_SURFACE,\r\n ctx!.SSGISurfaceHistoryTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH,\r\n ctx!.linearDepthTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n if (ctx!.motionVectorTexture) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_MOTION,\r\n ctx!.motionVectorTexture,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n }\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE, new Vector2(ctx!.renderWidth, ctx!.renderHeight));\r\n bg.setValue(\r\n EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION,\r\n new Vector4(\r\n ctx!.camera.ssgiDepthReject,\r\n ctx!.camera.ssgiNormalReject,\r\n ctx!.camera.getFarPlane(),\r\n ctx!.camera.getNearPlane()\r\n )\r\n );\r\n // View -> world -> previous clip. `prevVPMatrix` is null on the first frame\r\n // after a history reset; falling back to the current VP makes the expected\r\n // previous depth equal the current one, so the depth term is a no-op until\r\n // a real previous frame exists.\r\n const prevVP = ctx!.camera.prevVPMatrix ?? ctx!.camera.viewProjectionMatrix;\r\n Matrix4x4.multiply(prevVP as Matrix4x4, ctx!.camera.worldMatrix as Matrix4x4, EnvShIBL._viewToPrevClip);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP, EnvShIBL._viewToPrevClip);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION, ctx!.camera.getInvProjectionMatrix());\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n const iblIrradiance = pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n if (!EnvShIBL.hasSSGIHistory(ctx)) {\r\n return iblIrradiance;\r\n }\r\n const useMotionReprojection = !!ctx?.motionVectorTexture;\r\n pb.func('Z_ssgi_reprojectIrradiance', [pb.vec3('currentNormal'), pb.vec3('ibl')], function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE]);\r\n if (useMotionReprojection) {\r\n this.$l.motion = pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_SSGI_MOTION], this.uv, 0).xy;\r\n this.$l.previousUV = pb.sub(this.uv, this.motion);\r\n this.$l.motionValid = pb.not(pb.any(pb.greaterThanEqual(pb.abs(this.motion), pb.vec2(5e4))));\r\n } else {\r\n this.$l.previousUV = this.uv;\r\n this.$l.motionValid = pb.bool(true);\r\n }\r\n this.$l.params = this[EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION];\r\n this.$l.fallback = pb.mul(this.ibl, this.light.envLightStrength);\r\n this.$l.normalizedCurrentNormal = pb.normalize(this.currentNormal);\r\n this.$l.depthTolerance = pb.max(this.params.x, 1e-4);\r\n this.$l.texelSize = pb.div(pb.vec2(1), this[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE]);\r\n this.$l.halfTexel = pb.mul(this.texelSize, 0.5);\r\n this.$l.maxUV = pb.sub(pb.vec2(1), this.halfTexel);\r\n this.$l.previousUVInBounds = pb.and(\r\n this.motionValid,\r\n pb.all(pb.greaterThanEqual(this.previousUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousUV, pb.vec2(1)))\r\n );\r\n this.$l.previousSampleUV = pb.clamp(this.previousUV, this.halfTexel, this.maxUV);\r\n this.$l.previousSurface = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE],\r\n this.previousSampleUV,\r\n 0\r\n );\r\n this.$l.previousNormal = pb.normalize(pb.sub(pb.mul(this.previousSurface.rgb, 2), pb.vec3(1)));\r\n this.$l.currentDepthSample = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH],\r\n this.uv,\r\n 0\r\n );\r\n this.$l.currentDepth = pb.mul(\r\n pb.getDevice().type === 'webgl'\r\n ? decodeNormalizedFloatFromRGBA(this, this.currentDepthSample)\r\n : this.currentDepthSample.r,\r\n this.params.z\r\n );\r\n // The surface history holds a Z measured in the *previous* frame's view\r\n // space, so the current Z cannot be compared against it directly: under\r\n // camera rotation a static, correctly reprojected point has\r\n // `dz ~ r * sin(theta) * dphi`, which crosses any fixed threshold at the\r\n // screen edges and drops history in the exact staircase pattern that\r\n // nearest-neighbour sampling of the reprojected UV produces. Rebuild the\r\n // current view-space position and push it through `view -> previous clip`\r\n // instead; `clip.w` is `-view.z`, i.e. the same positive view-space\r\n // distance the history stores.\r\n this.$l.ndc = pb.sub(pb.mul(this.uv, 2), pb.vec2(1));\r\n this.$l.nearPlaneRay = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION],\r\n pb.vec4(this.ndc, REVERSE_Z ? 1 : -1, 1)\r\n );\r\n // Perspective unprojection of the near-plane NDC depth (GL -1, reverse\r\n // ZO 1) lands on the near plane, where view z is exactly -near; scaling\r\n // that ray by depth/near walks it out to the sample without a\r\n // non-linear depth round trip.\r\n this.$l.viewPos = pb.mul(\r\n pb.div(this.nearPlaneRay.xyz, this.nearPlaneRay.w),\r\n pb.div(this.currentDepth, pb.max(this.params.w, 1e-6))\r\n );\r\n this.$l.expectedPreviousDepth = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP],\r\n pb.vec4(this.viewPos, 1)\r\n ).w;\r\n this.$l.depthDelta = pb.abs(pb.sub(this.previousSurface.a, this.expectedPreviousDepth));\r\n // fp16 storage error scales with depth, so the tolerance has to as well.\r\n this.$l.scaledDepthTolerance = pb.add(\r\n this.depthTolerance,\r\n pb.mul(this.currentDepth, SSGI_DEPTH_TOLERANCE_RELATIVE)\r\n );\r\n this.$l.depthWeight = pb.exp(pb.neg(pb.div(this.depthDelta, this.scaledDepthTolerance)));\r\n this.$l.depthValid = pb.lessThanEqual(\r\n this.depthDelta,\r\n pb.mul(this.scaledDepthTolerance, SSGI_DEPTH_GATE_SCALE)\r\n );\r\n this.$l.normalValid = pb.greaterThanEqual(\r\n pb.dot(this.normalizedCurrentNormal, this.previousNormal),\r\n this.params.y\r\n );\r\n this.$l.previousIrradiance = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE],\r\n this.previousSampleUV,\r\n 0\r\n );\r\n this.$l.previousAlpha = pb.clamp(this.previousIrradiance.a, 0, 1);\r\n this.$l.exactHistoryValid = pb.and(\r\n this.previousUVInBounds,\r\n this.depthValid,\r\n this.normalValid,\r\n pb.greaterThan(this.previousAlpha, 1e-4)\r\n );\r\n this.$if(this.exactHistoryValid, function () {\r\n // Weighting confidence by the depth term keeps the gate boundary a ramp\r\n // rather than a step, so residual reprojection error on moving geometry\r\n // and grazing surfaces fades out instead of outlining itself.\r\n this.$l.exactConfidence = pb.mul(this.previousAlpha, this.depthWeight);\r\n this.$if(pb.greaterThan(this.exactConfidence, 1e-4), function () {\r\n this.$return(pb.mix(this.fallback, this.previousIrradiance.rgb, this.exactConfidence));\r\n });\r\n });\r\n\r\n // Repair disoccluded and off-screen history from nearby samples before\r\n // falling back to IBL. Sampling around the clamped reprojected position\r\n // fills camera-edge holes, while current UV provides a conservative\r\n // screen-stationary candidate for invalid motion vectors.\r\n this.$l.repairCenter = this.$choice(\r\n this.motionValid,\r\n this.previousSampleUV,\r\n pb.clamp(this.uv, this.halfTexel, this.maxUV)\r\n );\r\n // How far the reprojection had to be clamped to land back on screen. For a\r\n // hole in the interior this is zero and the taps really are neighbours of\r\n // the reprojected point, but for geometry rotating in from off screen the\r\n // clamp can travel hundreds of pixels -- and the depth and normal terms\r\n // cannot catch that, because the edge texel it lands on is usually the same\r\n // continuous surface (same normal, similar depth) merely sampled somewhere\r\n // spatially unrelated. Its irradiance therefore belongs to a different part\r\n // of the surface, so reading it as a point sample smears into streaks along\r\n // the direction of travel. Drive the tap radius with it instead, trading\r\n // that structure for a blur.\r\n this.$l.repairClampTexels = pb.div(\r\n pb.length(pb.sub(this.previousSampleUV, this.previousUV)),\r\n pb.max(pb.min(this.texelSize.x, this.texelSize.y), 1e-8)\r\n );\r\n // Widen the taps as the clamp travel grows. Only meaningful while the motion\r\n // vector is usable: without one the centre is already the current UV by\r\n // construction, so there is no travel to react to.\r\n this.$l.repairRadius = pb.mix(\r\n pb.float(SSGI_REPAIR_MIN_RADIUS_TEXELS),\r\n pb.float(SSGI_REPAIR_MAX_RADIUS_TEXELS),\r\n this.$choice(\r\n this.motionValid,\r\n pb.smoothStep(0, SSGI_REPAIR_WIDE_CLAMP_TEXELS, this.repairClampTexels),\r\n pb.float(0)\r\n )\r\n );\r\n // Taps this far apart straddle real depth variation across the surface, so a\r\n // gate tuned for immediate neighbours would reject most of them and bring\r\n // the dark band back. Loosen it with the radius and lean on the normal term,\r\n // which stays strict, to keep the average on one surface.\r\n this.$l.repairDepthTolerance = pb.mul(\r\n this.scaledDepthTolerance,\r\n SSGI_DEPTH_GATE_SCALE,\r\n pb.add(1, this.repairRadius)\r\n );\r\n this.$l.repairSum = pb.vec3(0);\r\n this.$l.repairWeight = pb.float(0);\r\n // A full ring rather than a cross: at the wide end four taps are not an\r\n // average but four distant point copies, and their axis alignment paints\r\n // directional artifacts of its own.\r\n const repairSamples = [\r\n { currentUV: false, x: 0, y: 0, kernel: 1 },\r\n { currentUV: false, x: -1, y: 0, kernel: 0.7 },\r\n { currentUV: false, x: 1, y: 0, kernel: 0.7 },\r\n { currentUV: false, x: 0, y: -1, kernel: 0.7 },\r\n { currentUV: false, x: 0, y: 1, kernel: 0.7 },\r\n { currentUV: false, x: -0.7071, y: -0.7071, kernel: 0.5 },\r\n { currentUV: false, x: 0.7071, y: -0.7071, kernel: 0.5 },\r\n { currentUV: false, x: -0.7071, y: 0.7071, kernel: 0.5 },\r\n { currentUV: false, x: 0.7071, y: 0.7071, kernel: 0.5 },\r\n { currentUV: true, x: 0, y: 0, kernel: 0.5 }\r\n ];\r\n for (let i = 0; i < repairSamples.length; i++) {\r\n const sample = repairSamples[i];\r\n const baseUV = sample.currentUV ? this.uv : this.repairCenter;\r\n this.$l[`repairUV${i}`] = pb.add(\r\n baseUV,\r\n pb.mul(this.texelSize, pb.vec2(sample.x, sample.y), this.repairRadius)\r\n );\r\n this.$l[`repairUVValid${i}`] = pb.and(\r\n pb.all(pb.greaterThanEqual(this[`repairUV${i}`], this.halfTexel)),\r\n pb.all(pb.lessThanEqual(this[`repairUV${i}`], this.maxUV))\r\n );\r\n this.$l[`repairSurface${i}`] = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE],\r\n pb.clamp(this[`repairUV${i}`], this.halfTexel, this.maxUV),\r\n 0\r\n );\r\n this.$l[`repairNormal${i}`] = pb.normalize(\r\n pb.sub(pb.mul(this[`repairSurface${i}`].rgb, 2), pb.vec3(1))\r\n );\r\n // Compared against the reprojected depth, not the current one: the taps\r\n // are samples of the previous frame's surface, so they live in the same\r\n // space as `expectedPreviousDepth`.\r\n this.$l[`repairDepthDelta${i}`] = pb.abs(\r\n pb.sub(this[`repairSurface${i}`].a, this.expectedPreviousDepth)\r\n );\r\n this.$l[`repairNormalDot${i}`] = pb.dot(this.normalizedCurrentNormal, this[`repairNormal${i}`]);\r\n this.$l[`repairSurfaceValid${i}`] = pb.and(\r\n this[`repairUVValid${i}`],\r\n pb.lessThanEqual(this[`repairDepthDelta${i}`], this.repairDepthTolerance),\r\n pb.greaterThanEqual(this[`repairNormalDot${i}`], this.params.y)\r\n );\r\n this.$l[`repairIrradiance${i}`] = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE],\r\n pb.clamp(this[`repairUV${i}`], this.halfTexel, this.maxUV),\r\n 0\r\n );\r\n // Same widening as the hard gate above: a falloff tuned for immediate\r\n // neighbours decays to nothing across a wide tap and starves the average.\r\n this.$l[`repairDepthWeight${i}`] = pb.exp(\r\n pb.neg(pb.div(this[`repairDepthDelta${i}`], this.repairDepthTolerance))\r\n );\r\n this.$l[`repairNormalWeight${i}`] = pb.pow(pb.max(0, this[`repairNormalDot${i}`]), 8);\r\n this.$l[`repairSampleWeight${i}`] = pb.mul(\r\n pb.float(this[`repairSurfaceValid${i}`]),\r\n pb.clamp(this[`repairIrradiance${i}`].a, 0, 1),\r\n this[`repairDepthWeight${i}`],\r\n this[`repairNormalWeight${i}`],\r\n // The screen-stationary tap only exists to cover unusable motion\r\n // vectors; while motion is valid it is a history read at the wrong world\r\n // point, which survives the depth term on any flat surface and leaves a\r\n // stationary ghost.\r\n sample.currentUV ? pb.float(pb.not(this.motionValid)) : pb.float(1),\r\n sample.kernel\r\n );\r\n this.repairSum = pb.add(\r\n this.repairSum,\r\n pb.mul(this[`repairIrradiance${i}`].rgb, this[`repairSampleWeight${i}`])\r\n );\r\n this.repairWeight = pb.add(this.repairWeight, this[`repairSampleWeight${i}`]);\r\n }\r\n this.$if(pb.greaterThan(this.repairWeight, 1e-4), function () {\r\n this.$l.repairedIrradiance = pb.div(this.repairSum, this.repairWeight);\r\n // Repaired samples are intentionally capped below full confidence so\r\n // newly traced irradiance replaces the extrapolation on following frames.\r\n this.$l.repairConfidence = pb.mul(pb.clamp(this.repairWeight, 0, 1), 0.85);\r\n this.$return(pb.mix(this.fallback, this.repairedIrradiance, this.repairConfidence));\r\n });\r\n this.$return(this.fallback);\r\n });\r\n return scope.Z_ssgi_reprojectIrradiance(normal, iblIrradiance) as PBShaderExp;\r\n }\r\n\r\n /** Whether all textures required by the lighting reprojection are scoped. @internal */\r\n static hasSSGIHistory(ctx?: DrawContext) {\r\n return !!(\r\n ctx?.SSGI &&\r\n ctx.SSGIIrradianceHistoryTexture &&\r\n ctx.SSGISurfaceHistoryTexture &&\r\n (ctx.device.type !== 'webgpu' || ctx.motionVectorTexture) &&\r\n ctx.linearDepthTexture\r\n );\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return !!this._sheenRadianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["SSGI_DEPTH_TOLERANCE_RELATIVE","SSGI_DEPTH_GATE_SCALE","SSGI_REPAIR_WIDE_CLAMP_TEXELS","SSGI_REPAIR_MIN_RADIUS_TEXELS","SSGI_REPAIR_MAX_RADIUS_TEXELS","EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","UNIFORM_NAME_SSGI_IRRADIANCE","UNIFORM_NAME_SSGI_SURFACE","UNIFORM_NAME_SSGI_CURRENT_DEPTH","UNIFORM_NAME_SSGI_MOTION","UNIFORM_NAME_SSGI_TARGET_SIZE","UNIFORM_NAME_SSGI_REPROJECTION","UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP","UNIFORM_NAME_SSGI_INV_PROJECTION","_viewToPrevClip","Matrix4x4","radianceMap","irradianceSH","irradianceSHFB","sheenRadianceMap","_radianceMap","DRef","_sheenRadianceMap","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","ctx","shaderKind","getGlobalScope","texCube","uniform","withSampler","getSamplerOptions","float","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec3","vec4","uniformBuffer","hasSSGIHistory","irradianceSampler","type","motionVectorTexture","vec2","mat4","updateBindGroup","bg","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","SSGIIrradianceHistoryTexture","device","SSGISurfaceHistoryTexture","linearDepthTexture","Vector2","renderWidth","renderHeight","Vector4","camera","ssgiDepthReject","ssgiNormalReject","getFarPlane","getNearPlane","prevVP","prevVPMatrix","viewProjectionMatrix","multiply","worldMatrix","getInvProjectionMatrix","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getSheenRadiance","getIrradiance","normal","that","func","$return","v","y","z","x","sub","$l","window","c","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","iblIrradiance","Z_sh_eval","useMotionReprojection","uv","div","$builtins","fragCoord","xy","motion","previousUV","motionValid","not","any","greaterThanEqual","abs","bool","params","fallback","ibl","light","envLightStrength","normalizedCurrentNormal","normalize","currentNormal","depthTolerance","max","texelSize","halfTexel","maxUV","previousUVInBounds","and","all","lessThanEqual","previousSampleUV","clamp","previousSurface","previousNormal","currentDepthSample","currentDepth","decodeNormalizedFloatFromRGBA","r","ndc","nearPlaneRay","REVERSE_Z","viewPos","w","expectedPreviousDepth","depthDelta","a","scaledDepthTolerance","depthWeight","exp","neg","depthValid","normalValid","dot","previousIrradiance","previousAlpha","exactHistoryValid","greaterThan","$if","exactConfidence","mix","repairCenter","$choice","repairClampTexels","length","min","repairRadius","smoothStep","repairDepthTolerance","repairSum","repairWeight","repairSamples","currentUV","kernel","i","sample","baseUV","pow","repairedIrradiance","repairConfidence","Z_ssgi_reprojectIrradiance","SSGI","hasRadiance","hasSheenRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';
1
+ import { Matrix4x4, Vector3, Vector4, DEPTH_CLEAR_VALUE } from '@zephyr3d/base';
2
2
  import { Camera } from '../camera/camera.js';
3
3
  import { ObjectColorPass } from './objectcolorpass.js';
4
4
 
@@ -51,7 +51,7 @@ function decodeNormalizedFloat(rgba) {
51
51
  const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;
52
52
  ctx.device.setFramebuffer(fb);
53
53
  _objectColorPass.clearColor = Vector4.zero();
54
- _objectColorPass.clearDepth = 1;
54
+ _objectColorPass.clearDepth = DEPTH_CLEAR_VALUE;
55
55
  const rq = _objectColorPass.cullScene(ctx, pickCamera);
56
56
  _objectColorPass.render(ctx, pickCamera, null, rq);
57
57
  rq.dispose();
@@ -61,6 +61,8 @@ function decodeNormalizedFloat(rgba) {
61
61
  const colorPixels = new Uint8Array(4);
62
62
  const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);
63
63
  const device = ctx.device;
64
+ // RenderGraph releases the frame RenderQueue before the asynchronous GPU readback completes.
65
+ const getDrawableByColor = renderQueue.createObjectColorLookupSnapshot();
64
66
  let fence;
65
67
  if (ctx.device.type === 'webgl') {
66
68
  fence = Promise.all([
@@ -74,7 +76,7 @@ function decodeNormalizedFloat(rgba) {
74
76
  ]);
75
77
  }
76
78
  fence.then(()=>{
77
- const drawable = renderQueue.getDrawableByColor(colorPixels);
79
+ const drawable = getDrawableByColor(colorPixels);
78
80
  let d = isWebGL1 ? decodeNormalizedFloat(distancePixels) * far : distancePixels[0];
79
81
  const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);
80
82
  if (isWebGL1) {
@@ -89,9 +91,9 @@ function decodeNormalizedFloat(rgba) {
89
91
  drawable,
90
92
  target: drawable.getPickTarget()
91
93
  } : null);
92
- device.pool.releaseFrameBuffer(fb);
93
94
  }).catch((_err)=>{
94
- camera.getPickResultResolveFunc()?.(null);
95
+ pickResolveFunc(null);
96
+ }).finally(()=>{
95
97
  device.pool.releaseFrameBuffer(fb);
96
98
  });
97
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gpu_picking.js","sources":["../../src/render/gpu_picking.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport { type PickResult, Camera } from '../camera';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\n\r\nconst _pickCamera = new Camera(null);\r\nconst _objectColorPass = new ObjectColorPass();\r\n\r\nfunction decodeNormalizedFloat(rgba: Uint8Array<ArrayBuffer>): number {\r\n const a = rgba[0] / 255;\r\n const b = rgba[1] / 255;\r\n const c = rgba[2] / 255;\r\n const d = rgba[3] / 255;\r\n return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;\r\n}\r\n\r\n/**\r\n * Perform GPU-based object picking by rendering object IDs to a 1x1 framebuffer.\r\n * @internal\r\n */\r\nexport function renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: Nullable<PickResult>) => void,\r\n renderQueue: RenderQueue\r\n): void {\r\n const camera = ctx.camera;\r\n const isWebGL1 = ctx.device.type === 'webgl';\r\n ctx.renderPass = _objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n isWebGL1 ? ['rgba8unorm', 'rgba8unorm'] : ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n const pickCamera = _pickCamera;\r\n camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;\r\n const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;\r\n ctx.device.setFramebuffer(fb);\r\n _objectColorPass.clearColor = Vector4.zero();\r\n _objectColorPass.clearDepth = 1;\r\n const rq = _objectColorPass.cullScene(ctx, pickCamera);\r\n _objectColorPass.render(ctx, pickCamera, null, rq);\r\n rq.dispose();\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);\r\n const device = ctx.device;\r\n let fence: Promise<void[]>;\r\n if (ctx.device.type === 'webgl') {\r\n fence = Promise.all([\r\n ctx.device.runNextFrameAsync(() => colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),\r\n ctx.device.runNextFrameAsync(() => distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))\r\n ]);\r\n } else {\r\n fence = Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ]);\r\n }\r\n fence\r\n .then(() => {\r\n const drawable = renderQueue.getDrawableByColor(colorPixels);\r\n let d = isWebGL1\r\n ? decodeNormalizedFloat(distancePixels as Uint8Array<ArrayBuffer>) * far\r\n : distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n if (isWebGL1) {\r\n intersectedPoint.x = cameraPos!.x + ray!.direction.x * d;\r\n intersectedPoint.y = cameraPos!.y + ray!.direction.y * d;\r\n intersectedPoint.z = cameraPos!.z + ray!.direction.z * d;\r\n d = Vector3.distance(intersectedPoint, cameraPos!);\r\n }\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n device.pool.releaseFrameBuffer(fb);\r\n })\r\n .catch((_err) => {\r\n camera.getPickResultResolveFunc()?.(null);\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n}\r\n"],"names":["_pickCamera","Camera","_objectColorPass","ObjectColorPass","decodeNormalizedFloat","rgba","a","b","c","d","renderObjectColors","ctx","pickResolveFunc","renderQueue","camera","isWebGL1","device","type","renderPass","pushDeviceStates","fb","pool","fetchTemporalFramebuffer","depthFormat","setViewport","viewport","vp","getViewport","windowX","getPickPosX","width","windowY","height","getPickPosY","windowW","windowH","pickCamera","worldMatrix","decompose","scale","rotation","position","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","cameraPos","Vector3","ray","constructRay","setFramebuffer","clearColor","Vector4","zero","clearDepth","rq","cullScene","render","dispose","popDeviceStates","colorTex","getColorAttachments","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","fence","Promise","all","runNextFrameAsync","readPixels","then","drawable","getDrawableByColor","intersectedPoint","x","direction","y","z","distance","target","getPickTarget","releaseFrameBuffer","catch","_err","getPickResultResolveFunc"],"mappings":"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"}
1
+ {"version":3,"file":"gpu_picking.js","sources":["../../src/render/gpu_picking.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport { type PickResult, Camera } from '../camera';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\n\r\nconst _pickCamera = new Camera(null);\r\nconst _objectColorPass = new ObjectColorPass();\r\n\r\nfunction decodeNormalizedFloat(rgba: Uint8Array<ArrayBuffer>): number {\r\n const a = rgba[0] / 255;\r\n const b = rgba[1] / 255;\r\n const c = rgba[2] / 255;\r\n const d = rgba[3] / 255;\r\n return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;\r\n}\r\n\r\n/**\r\n * Perform GPU-based object picking by rendering object IDs to a 1x1 framebuffer.\r\n * @internal\r\n */\r\nexport function renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: Nullable<PickResult>) => void,\r\n renderQueue: RenderQueue\r\n): void {\r\n const camera = ctx.camera;\r\n const isWebGL1 = ctx.device.type === 'webgl';\r\n ctx.renderPass = _objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n isWebGL1 ? ['rgba8unorm', 'rgba8unorm'] : ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n const pickCamera = _pickCamera;\r\n camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;\r\n const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;\r\n ctx.device.setFramebuffer(fb);\r\n _objectColorPass.clearColor = Vector4.zero();\r\n _objectColorPass.clearDepth = DEPTH_CLEAR_VALUE;\r\n const rq = _objectColorPass.cullScene(ctx, pickCamera);\r\n _objectColorPass.render(ctx, pickCamera, null, rq);\r\n rq.dispose();\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);\r\n const device = ctx.device;\r\n // RenderGraph releases the frame RenderQueue before the asynchronous GPU readback completes.\r\n const getDrawableByColor = renderQueue.createObjectColorLookupSnapshot();\r\n let fence: Promise<void[]>;\r\n if (ctx.device.type === 'webgl') {\r\n fence = Promise.all([\r\n ctx.device.runNextFrameAsync(() => colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),\r\n ctx.device.runNextFrameAsync(() => distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))\r\n ]);\r\n } else {\r\n fence = Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ]);\r\n }\r\n fence\r\n .then(() => {\r\n const drawable = getDrawableByColor(colorPixels);\r\n let d = isWebGL1\r\n ? decodeNormalizedFloat(distancePixels as Uint8Array<ArrayBuffer>) * far\r\n : distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n if (isWebGL1) {\r\n intersectedPoint.x = cameraPos!.x + ray!.direction.x * d;\r\n intersectedPoint.y = cameraPos!.y + ray!.direction.y * d;\r\n intersectedPoint.z = cameraPos!.z + ray!.direction.z * d;\r\n d = Vector3.distance(intersectedPoint, cameraPos!);\r\n }\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n })\r\n .catch((_err) => {\r\n pickResolveFunc(null);\r\n })\r\n .finally(() => {\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n}\r\n"],"names":["_pickCamera","Camera","_objectColorPass","ObjectColorPass","decodeNormalizedFloat","rgba","a","b","c","d","renderObjectColors","ctx","pickResolveFunc","renderQueue","camera","isWebGL1","device","type","renderPass","pushDeviceStates","fb","pool","fetchTemporalFramebuffer","depthFormat","setViewport","viewport","vp","getViewport","windowX","getPickPosX","width","windowY","height","getPickPosY","windowW","windowH","pickCamera","worldMatrix","decompose","scale","rotation","position","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","cameraPos","Vector3","ray","constructRay","setFramebuffer","clearColor","Vector4","zero","clearDepth","DEPTH_CLEAR_VALUE","rq","cullScene","render","dispose","popDeviceStates","colorTex","getColorAttachments","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","getDrawableByColor","createObjectColorLookupSnapshot","fence","Promise","all","runNextFrameAsync","readPixels","then","drawable","intersectedPoint","x","direction","y","z","distance","target","getPickTarget","catch","_err","finally","releaseFrameBuffer"],"mappings":";;;;AAOA,MAAMA,WAAAA,GAAc,IAAIC,MAAO,CAAA,IAAA,CAAA;AAC/B,MAAMC,mBAAmB,IAAIC,eAAAA,EAAAA;AAE7B,SAASC,sBAAsBC,IAA6B,EAAA;AAC1D,IAAA,MAAMC,CAAID,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,MAAME,CAAIF,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,MAAMG,CAAIH,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,MAAMI,CAAIJ,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,IAAA,OAAOC,CAAK,IAAA,GAAM,GAAA,GAAA,GAAM,GAAE,CAAA,GAAKC,CAAK,IAAA,GAAM,GAAA,GAAE,CAAKC,GAAAA,CAAAA,GAAI,GAAMC,GAAAA,CAAAA;AAC7D;AAEA;;;AAGC,IACM,SAASC,kBAAAA,CACdC,GAAgB,EAChBC,eAAuD,EACvDC,WAAwB,EAAA;IAExB,MAAMC,MAAAA,GAASH,IAAIG,MAAM;AACzB,IAAA,MAAMC,QAAWJ,GAAAA,GAAAA,CAAIK,MAAM,CAACC,IAAI,KAAK,OAAA;AACrCN,IAAAA,GAAAA,CAAIO,UAAU,GAAGhB,gBAAAA;IACjBS,GAAIK,CAAAA,MAAM,CAACG,gBAAgB,EAAA;IAC3B,MAAMC,EAAAA,GAAKT,GAAIK,CAAAA,MAAM,CAACK,IAAI,CAACC,wBAAwB,CACjD,KAAA,EACA,CACA,EAAA,CAAA,EACAP,QAAW,GAAA;AAAC,QAAA,YAAA;AAAc,QAAA;KAAa,GAAG;AAAC,QAAA,YAAA;AAAc,QAAA;KAAU,EACnEJ,GAAAA,CAAIY,WAAW,EACf,KAAA,CAAA;AAEFZ,IAAAA,GAAAA,CAAIK,MAAM,CAACQ,WAAW,CAACV,OAAOW,QAAQ,CAAA;AACtC,IAAA,MAAMC,EAAKf,GAAAA,GAAAA,CAAIK,MAAM,CAACW,WAAW,EAAA;AACjC,IAAA,MAAMC,OAAUd,GAAAA,MAAAA,CAAOe,WAAW,EAAA,GAAKH,GAAGI,KAAK;AAC/C,IAAA,MAAMC,OAAU,GAACL,CAAAA,EAAAA,CAAGM,MAAM,GAAGlB,MAAOmB,CAAAA,WAAW,EAAK,GAAA,CAAA,IAAKP,EAAAA,CAAGM,MAAM;IAClE,MAAME,OAAAA,GAAU,CAAIR,GAAAA,EAAAA,CAAGI,KAAK;IAC5B,MAAMK,OAAAA,GAAU,CAAIT,GAAAA,EAAAA,CAAGM,MAAM;AAC7B,IAAA,MAAMI,UAAapC,GAAAA,WAAAA;IACnBc,MAAOuB,CAAAA,WAAW,CAACC,SAAS,CAACF,UAAAA,CAAWG,KAAK,EAAEH,UAAWI,CAAAA,QAAQ,EAAEJ,UAAAA,CAAWK,QAAQ,CAAA;AACvF,IAAA,IAAIC,IAAO5B,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGC,YAAY,EAAA;AACpD,IAAA,IAAIC,KAAQ/B,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGG,aAAa,EAAA;AACtD,IAAA,IAAIC,MAASjC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGK,cAAc,EAAA;AACxD,IAAA,IAAIC,GAAMnC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGO,WAAW,EAAA;AAClD,IAAA,MAAMC,IAAOrC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGS,YAAY,EAAA;AACtD,IAAA,MAAMC,GAAMvC,GAAAA,MAAAA,CAAO6B,mBAAmB,EAAA,CAAGW,WAAW,EAAA;AACpD,IAAA,MAAMxB,QAAQe,KAAQH,GAAAA,IAAAA;AACtB,IAAA,MAAMV,SAASiB,GAAMF,GAAAA,MAAAA;AACrBL,IAAAA,IAAAA,IAAQZ,KAAQF,GAAAA,OAAAA;AAChBmB,IAAAA,MAAAA,IAAUf,MAASD,GAAAA,OAAAA;AACnBc,IAAAA,KAAAA,GAAQH,OAAOZ,KAAQI,GAAAA,OAAAA;AACvBe,IAAAA,GAAAA,GAAMF,SAASf,MAASG,GAAAA,OAAAA;IACxBC,UAAWmB,CAAAA,mBAAmB,CAC5BzC,MAAO0C,CAAAA,aAAa,KAChBC,SAAUC,CAAAA,OAAO,CAAChB,IAAMG,EAAAA,KAAAA,EAAOE,QAAQE,GAAKE,EAAAA,IAAAA,EAAME,OAClDI,SAAUE,CAAAA,KAAK,CAACjB,IAAMG,EAAAA,KAAAA,EAAOE,MAAQE,EAAAA,GAAAA,EAAKE,IAAME,EAAAA,GAAAA,CAAAA,CAAAA;AAEtD,IAAA,MAAMO,YAAY7C,QAAW,GAAA,IAAI8C,OAAQzB,CAAAA,UAAAA,CAAWK,QAAQ,CAAI,GAAA,IAAA;IAChE,MAAMqB,GAAAA,GAAM/C,QAAWD,GAAAA,MAAAA,CAAOiD,YAAY,CAACjD,OAAOe,WAAW,EAAA,EAAIf,MAAOmB,CAAAA,WAAW,EAAM,CAAA,GAAA,IAAA;IACzFtB,GAAIK,CAAAA,MAAM,CAACgD,cAAc,CAAC5C,EAAAA,CAAAA;IAC1BlB,gBAAiB+D,CAAAA,UAAU,GAAGC,OAAAA,CAAQC,IAAI,EAAA;AAC1CjE,IAAAA,gBAAAA,CAAiBkE,UAAU,GAAGC,iBAAAA;AAC9B,IAAA,MAAMC,EAAKpE,GAAAA,gBAAAA,CAAiBqE,SAAS,CAAC5D,GAAKyB,EAAAA,UAAAA,CAAAA;AAC3ClC,IAAAA,gBAAAA,CAAiBsE,MAAM,CAAC7D,GAAKyB,EAAAA,UAAAA,EAAY,IAAMkC,EAAAA,EAAAA,CAAAA;AAC/CA,IAAAA,EAAAA,CAAGG,OAAO,EAAA;IACV9D,GAAIK,CAAAA,MAAM,CAAC0D,eAAe,EAAA;AAC1B,IAAA,MAAMC,QAAWvD,GAAAA,EAAAA,CAAGwD,mBAAmB,EAAE,CAAC,CAAE,CAAA;AAC5C,IAAA,MAAMC,WAAczD,GAAAA,EAAAA,CAAGwD,mBAAmB,EAAE,CAAC,CAAE,CAAA;IAC/C,MAAME,WAAAA,GAAc,IAAIC,UAAW,CAAA,CAAA,CAAA;AACnC,IAAA,MAAMC,iBAAiBjE,QAAW,GAAA,IAAIgE,UAAW,CAAA,CAAA,CAAA,GAAK,IAAIE,YAAa,CAAA,CAAA,CAAA;IACvE,MAAMjE,MAAAA,GAASL,IAAIK,MAAM;;IAEzB,MAAMkE,kBAAAA,GAAqBrE,YAAYsE,+BAA+B,EAAA;IACtE,IAAIC,KAAAA;AACJ,IAAA,IAAIzE,GAAIK,CAAAA,MAAM,CAACC,IAAI,KAAK,OAAS,EAAA;QAC/BmE,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAAC;AAClB3E,YAAAA,GAAAA,CAAIK,MAAM,CAACuE,iBAAiB,CAAC,IAAMZ,QAAAA,CAASa,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGV,EAAAA,WAAAA,CAAAA,CAAAA;AACzEnE,YAAAA,GAAAA,CAAIK,MAAM,CAACuE,iBAAiB,CAAC,IAAMV,WAAAA,CAAYW,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGR,EAAAA,cAAAA,CAAAA;AAC7E,SAAA,CAAA;KACI,MAAA;QACLI,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAAC;AAClBX,YAAAA,QAAAA,CAASa,UAAU,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGV,EAAAA,WAAAA,CAAAA;AACtCD,YAAAA,WAAAA,CAAYW,UAAU,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGR,EAAAA,cAAAA;AAC1C,SAAA,CAAA;AACH;AACAI,IAAAA,KAAAA,CACGK,IAAI,CAAC,IAAA;AACJ,QAAA,MAAMC,WAAWR,kBAAmBJ,CAAAA,WAAAA,CAAAA;AACpC,QAAA,IAAIrE,IAAIM,QACJX,GAAAA,qBAAAA,CAAsB4E,kBAA6C3B,GACnE2B,GAAAA,cAAc,CAAC,CAAE,CAAA;AACrB,QAAA,MAAMW,gBAAmB,GAAA,IAAI9B,OAAQmB,CAAAA,cAAc,CAAC,CAAA,CAAE,EAAEA,cAAc,CAAC,CAAA,CAAE,EAAEA,cAAc,CAAC,CAAE,CAAA,CAAA;AAC5F,QAAA,IAAIjE,QAAU,EAAA;YACZ4E,gBAAiBC,CAAAA,CAAC,GAAGhC,SAAWgC,CAAAA,CAAC,GAAG9B,GAAK+B,CAAAA,SAAS,CAACD,CAAC,GAAGnF,CAAAA;YACvDkF,gBAAiBG,CAAAA,CAAC,GAAGlC,SAAWkC,CAAAA,CAAC,GAAGhC,GAAK+B,CAAAA,SAAS,CAACC,CAAC,GAAGrF,CAAAA;YACvDkF,gBAAiBI,CAAAA,CAAC,GAAGnC,SAAWmC,CAAAA,CAAC,GAAGjC,GAAK+B,CAAAA,SAAS,CAACE,CAAC,GAAGtF,CAAAA;YACvDA,CAAIoD,GAAAA,OAAAA,CAAQmC,QAAQ,CAACL,gBAAkB/B,EAAAA,SAAAA,CAAAA;AACzC;AACAhD,QAAAA,eAAAA,CACE8E,QACI,GAAA;YACEM,QAAUvF,EAAAA,CAAAA;AACVkF,YAAAA,gBAAAA;AACAD,YAAAA,QAAAA;AACAO,YAAAA,MAAAA,EAAQP,SAASQ,aAAa;SAEhC,GAAA,IAAA,CAAA;KAGPC,CAAAA,CAAAA,KAAK,CAAC,CAACC,IAAAA,GAAAA;QACNxF,eAAgB,CAAA,IAAA,CAAA;AAClB,KAAA,CAAA,CACCyF,OAAO,CAAC,IAAA;QACPrF,MAAOK,CAAAA,IAAI,CAACiF,kBAAkB,CAAClF,EAAAA,CAAAA;AACjC,KAAA,CAAA;AACJ;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { drawFullscreenQuad } from './fullscreenquad.js';
2
- import '@zephyr3d/base';
2
+ import { DEPTH_FARTHEST, DEPTH_REDUCE_FARTHER } from '@zephyr3d/base';
3
3
  import './primitive.js';
4
4
  import '@zephyr3d/device';
5
5
  import { getDevice } from '../app/api.js';
@@ -7,13 +7,13 @@ import { CopyBlitter } from '../blitter/copy.js';
7
7
  import { fetchSampler } from '../utility/misc.js';
8
8
 
9
9
  let hzbProgram = null;
10
- let hzbBindGroup = null;
10
+ let hzbBindGroupCache = new WeakMap();
11
11
  let blitter = null;
12
12
  const srcSize = new Int32Array(2);
13
13
  class HiZInitBlitter extends CopyBlitter {
14
14
  /** @override */ filter(scope, type, srcTex, srcUV, srcLayer, sampleType) {
15
15
  const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);
16
- return scope.$builder.vec4(depth.xx, 0, 1);
16
+ return scope.$builder.vec4(depth.x, 0, 0, 1);
17
17
  }
18
18
  }
19
19
  /*
@@ -199,7 +199,7 @@ float3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {
199
199
  this.$inputs.pos = pb.vec2().attrib('position');
200
200
  this.$outputs.uv = pb.vec2();
201
201
  pb.main(function() {
202
- this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);
202
+ this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);
203
203
  this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
204
204
  if (device.type === 'webgpu') {
205
205
  this.$builtins.position.y = pb.neg(this.$builtins.position.y);
@@ -220,32 +220,42 @@ float3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {
220
220
  for(let i = 0; i < 4; i++){
221
221
  this.$l[`d${i}`] = pb.textureLoad(this.srcTex, pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord), device.type === 'webgpu' ? 0 : this.srcMipLevel);
222
222
  }
223
- this.$l.minDepth = pb.min(pb.min(this.d0.r, this.d1.r), pb.min(this.d2.r, this.d3.r));
224
- this.$l.maxDepth = pb.max(pb.max(this.d0.g, this.d1.g), pb.max(this.d2.g, this.d3.g));
225
- this.$outputs.color = pb.vec4(this.minDepth, this.maxDepth, 0, 1);
223
+ // Furthest-depth reduction (max under standard Z, min under reverse Z).
224
+ this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r), pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r));
225
+ this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);
226
226
  });
227
227
  }
228
228
  });
229
229
  program.name = '@HZB_Builder';
230
230
  return program;
231
231
  }
232
+ function getHiZBindGroup(tex, mip) {
233
+ let info = hzbBindGroupCache.get(tex);
234
+ if (!info) {
235
+ info = [];
236
+ hzbBindGroupCache.set(tex, info);
237
+ }
238
+ if (!info[mip]) {
239
+ info[mip] = tex.device.createBindGroup(hzbProgram.bindGroupLayouts[0]);
240
+ srcSize[0] = Math.max(tex.width >> mip, 1);
241
+ srcSize[1] = Math.max(tex.height >> mip, 1);
242
+ info[mip].setValue('srcSize', srcSize);
243
+ if (tex.device.type === 'webgpu') {
244
+ info[mip].setTextureView('srcTex', tex, mip, 0, 1, fetchSampler('clamp_nearest'));
245
+ } else {
246
+ info[mip].setTexture('srcTex', tex, fetchSampler('clamp_nearest'));
247
+ info[mip].setValue('srcMipLevel', mip);
248
+ }
249
+ }
250
+ return info[mip];
251
+ }
232
252
  function buildHiZLevel(device, miplevel, srcTexture, dstTexture) {
233
- const sampler = fetchSampler('clamp_nearest');
234
253
  const framebuffer = device.pool.fetchTemporalFramebuffer(false, 0, 0, [
235
254
  dstTexture
236
255
  ], null, false, 1, true, miplevel + 1);
237
256
  framebuffer.setColorAttachmentGenerateMipmaps(0, false);
238
- srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);
239
- srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);
240
- hzbBindGroup.setValue('srcSize', srcSize);
241
- if (device.type === 'webgpu') {
242
- hzbBindGroup.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);
243
- } else {
244
- hzbBindGroup.setTexture('srcTex', srcTexture, sampler);
245
- hzbBindGroup.setValue('srcMipLevel', miplevel);
246
- }
247
257
  device.setProgram(hzbProgram);
248
- device.setBindGroup(0, hzbBindGroup);
258
+ device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel));
249
259
  device.setFramebuffer(framebuffer);
250
260
  drawFullscreenQuad();
251
261
  if (srcTexture !== dstTexture) {
@@ -257,7 +267,6 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
257
267
  const device = getDevice();
258
268
  if (!hzbProgram) {
259
269
  hzbProgram = buildHZBProgram(device);
260
- hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);
261
270
  blitter = new HiZInitBlitter();
262
271
  }
263
272
  blitter.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));
@@ -1 +1 @@
1
- {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter, type BlitType } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroup: Nullable<BindGroup> = null;\r\nlet blitter: Nullable<HiZInitBlitter> = null;\r\nconst srcSize = new Int32Array(2);\r\n\r\nclass HiZInitBlitter extends CopyBlitter {\r\n /** @override */\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n return scope.$builder.vec4(depth.xx, 0, 1);\r\n }\r\n}\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\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, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\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.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n );\r\n }\r\n this.$l.minDepth = pb.min(pb.min(this.d0.r, this.d1.r), pb.min(this.d2.r, this.d3.r));\r\n this.$l.maxDepth = pb.max(pb.max(this.d0.g, this.d1.g), pb.max(this.d2.g, this.d3.g));\r\n this.$outputs.color = pb.vec4(this.minDepth, this.maxDepth, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n) {\r\n const sampler = fetchSampler('clamp_nearest');\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n hzbBindGroup!.setValue('srcSize', srcSize);\r\n if (device.type === 'webgpu') {\r\n hzbBindGroup!.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n hzbBindGroup!.setTexture('srcTex', srcTexture, sampler);\r\n hzbBindGroup!.setValue('srcMipLevel', miplevel);\r\n }\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, hzbBindGroup!);\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);\r\n blitter = new HiZInitBlitter();\r\n }\r\n blitter!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroup","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","xx","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","minDepth","min","d0","r","d1","d2","d3","maxDepth","max","g","name","buildHiZLevel","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","Math","width","height","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","createBindGroup","bindGroupLayouts","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}
1
+ {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BaseTexture,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter, type BlitType } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, DEPTH_REDUCE_FARTHER } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroupCache: WeakMap<BaseTexture, BindGroup[]> = new WeakMap();\r\nlet blitter: Nullable<HiZInitBlitter> = null;\r\nconst srcSize = new Int32Array(2);\r\n\r\nclass HiZInitBlitter extends CopyBlitter {\r\n /** @override */\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n return scope.$builder.vec4(depth.x, 0, 0, 1);\r\n }\r\n}\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\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 if (device.type === 'webgpu') {\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.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n );\r\n }\r\n // Furthest-depth reduction (max under standard Z, min under reverse Z).\r\n this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](\r\n pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r),\r\n pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r)\r\n );\r\n this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction getHiZBindGroup(tex: BaseTexture, mip: number) {\r\n let info = hzbBindGroupCache.get(tex);\r\n if (!info) {\r\n info = [];\r\n hzbBindGroupCache.set(tex, info);\r\n }\r\n if (!info[mip]) {\r\n info[mip] = tex.device.createBindGroup(hzbProgram!.bindGroupLayouts[0]);\r\n srcSize[0] = Math.max(tex.width >> mip, 1);\r\n srcSize[1] = Math.max(tex.height >> mip, 1);\r\n info[mip].setValue('srcSize', srcSize);\r\n if (tex.device.type === 'webgpu') {\r\n info[mip].setTextureView('srcTex', tex, mip, 0, 1, fetchSampler('clamp_nearest'));\r\n } else {\r\n info[mip].setTexture('srcTex', tex, fetchSampler('clamp_nearest'));\r\n info[mip].setValue('srcMipLevel', mip);\r\n }\r\n }\r\n return info[mip];\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n) {\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel));\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n blitter = new HiZInitBlitter();\r\n }\r\n blitter!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroupCache","WeakMap","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","x","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","maxDepth","DEPTH_REDUCE_FARTHER","d0","r","d1","d2","d3","name","getHiZBindGroup","tex","mip","info","get","set","createBindGroup","bindGroupLayouts","Math","max","width","height","setValue","setTextureView","fetchSampler","setTexture","buildHiZLevel","miplevel","srcTexture","dstTexture","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}