@zephyr3d/scene 0.8.2 → 0.9.0

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 (241) hide show
  1. package/dist/animation/animationset.js +473 -60
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
  4. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
  5. package/dist/animation/fixed_geometry_cache_track.js +138 -0
  6. package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
  7. package/dist/animation/geometry_cache_utils.js +120 -0
  8. package/dist/animation/geometry_cache_utils.js.map +1 -0
  9. package/dist/animation/ik_modifier.js +9 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +469 -0
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -0
  13. package/dist/animation/joint_dynamics/constraints.js +329 -0
  14. package/dist/animation/joint_dynamics/constraints.js.map +1 -0
  15. package/dist/animation/joint_dynamics/controller.js +699 -0
  16. package/dist/animation/joint_dynamics/controller.js.map +1 -0
  17. package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
  19. package/dist/animation/joint_dynamics/solver.js +794 -0
  20. package/dist/animation/joint_dynamics/solver.js.map +1 -0
  21. package/dist/animation/joint_dynamics/types.js +19 -0
  22. package/dist/animation/joint_dynamics/types.js.map +1 -0
  23. package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
  24. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
  25. package/dist/animation/joint_dynamics_modifier.js +51 -0
  26. package/dist/animation/joint_dynamics_modifier.js.map +1 -0
  27. package/dist/animation/pca_geometry_cache_track.js +222 -0
  28. package/dist/animation/pca_geometry_cache_track.js.map +1 -0
  29. package/dist/animation/skeleton.js +2011 -139
  30. package/dist/animation/skeleton.js.map +1 -1
  31. package/dist/animation/skeleton_modifier.js +3 -5
  32. package/dist/animation/skeleton_modifier.js.map +1 -1
  33. package/dist/animation/spring/multi_chain_spring_system.js +2 -0
  34. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  35. package/dist/animation/spring/spring_chain.js +3 -2
  36. package/dist/animation/spring/spring_chain.js.map +1 -1
  37. package/dist/animation/spring/spring_collider.js +35 -5
  38. package/dist/animation/spring/spring_collider.js.map +1 -1
  39. package/dist/animation/spring/spring_particle.js +1 -0
  40. package/dist/animation/spring/spring_particle.js.map +1 -1
  41. package/dist/animation/spring/spring_system.js +325 -28
  42. package/dist/animation/spring/spring_system.js.map +1 -1
  43. package/dist/animation/spring2/collision.js +469 -0
  44. package/dist/animation/spring2/collision.js.map +1 -0
  45. package/dist/animation/spring2/constraints.js +329 -0
  46. package/dist/animation/spring2/constraints.js.map +1 -0
  47. package/dist/animation/spring2/controller.js +434 -0
  48. package/dist/animation/spring2/controller.js.map +1 -0
  49. package/dist/animation/spring2/math.js +16 -0
  50. package/dist/animation/spring2/math.js.map +1 -0
  51. package/dist/animation/spring2/solver.js +624 -0
  52. package/dist/animation/spring2/solver.js.map +1 -0
  53. package/dist/animation/spring2/spring_system.js +118 -0
  54. package/dist/animation/spring2/spring_system.js.map +1 -0
  55. package/dist/animation/spring2/types.js +19 -0
  56. package/dist/animation/spring2/types.js.map +1 -0
  57. package/dist/animation/spring_modifier.js +17 -1
  58. package/dist/animation/spring_modifier.js.map +1 -1
  59. package/dist/app/engine.js +42 -15
  60. package/dist/app/engine.js.map +1 -1
  61. package/dist/app/runtimescript.js +132 -1
  62. package/dist/app/runtimescript.js.map +1 -1
  63. package/dist/app/screen.js +3 -3
  64. package/dist/app/screen.js.map +1 -1
  65. package/dist/app/scriptingsystem.js +69 -37
  66. package/dist/app/scriptingsystem.js.map +1 -1
  67. package/dist/app/scriptregistry.js +157 -146
  68. package/dist/app/scriptregistry.js.map +1 -1
  69. package/dist/asset/assetmanager.js +2 -1
  70. package/dist/asset/assetmanager.js.map +1 -1
  71. package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
  72. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
  73. package/dist/asset/model.js +192 -0
  74. package/dist/asset/model.js.map +1 -1
  75. package/dist/camera/base.js +26 -7
  76. package/dist/camera/base.js.map +1 -1
  77. package/dist/camera/camera.js +146 -24
  78. package/dist/camera/camera.js.map +1 -1
  79. package/dist/camera/fps.js +2 -2
  80. package/dist/camera/fps.js.map +1 -1
  81. package/dist/camera/orbit.js +2 -2
  82. package/dist/camera/orbit.js.map +1 -1
  83. package/dist/index.d.ts +11728 -8535
  84. package/dist/index.js +29 -8
  85. package/dist/index.js.map +1 -1
  86. package/dist/material/lambert.js +1 -1
  87. package/dist/material/lambert.js.map +1 -1
  88. package/dist/material/material.js +9 -3
  89. package/dist/material/material.js.map +1 -1
  90. package/dist/material/meshmaterial.js +54 -7
  91. package/dist/material/meshmaterial.js.map +1 -1
  92. package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
  93. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  94. package/dist/material/mixins/lightmodel/lambert.js +7 -2
  95. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  96. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
  97. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  98. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +222 -14
  99. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  100. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
  101. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  102. package/dist/material/mixins/lit.js +11 -8
  103. package/dist/material/mixins/lit.js.map +1 -1
  104. package/dist/material/mixins/pbr/common.js +72 -5
  105. package/dist/material/mixins/pbr/common.js.map +1 -1
  106. package/dist/material/pbrblueprint.js +148 -1
  107. package/dist/material/pbrblueprint.js.map +1 -1
  108. package/dist/material/pbrmr.js +125 -2
  109. package/dist/material/pbrmr.js.map +1 -1
  110. package/dist/material/shader/helper.js +10 -4
  111. package/dist/material/shader/helper.js.map +1 -1
  112. package/dist/material/water.js +2 -2
  113. package/dist/material/water.js.map +1 -1
  114. package/dist/posteffect/coloradjust.js +145 -0
  115. package/dist/posteffect/coloradjust.js.map +1 -0
  116. package/dist/posteffect/taa.js +68 -32
  117. package/dist/posteffect/taa.js.map +1 -1
  118. package/dist/render/cluster_light.js +17 -12
  119. package/dist/render/cluster_light.js.map +1 -1
  120. package/dist/render/deferredlightpass.js +510 -0
  121. package/dist/render/deferredlightpass.js.map +1 -0
  122. package/dist/render/deferredshadowlightpass.js +428 -0
  123. package/dist/render/deferredshadowlightpass.js.map +1 -0
  124. package/dist/render/drawable.js.map +1 -1
  125. package/dist/render/drawable_mixin.js +21 -12
  126. package/dist/render/drawable_mixin.js.map +1 -1
  127. package/dist/render/envlight.js +20 -22
  128. package/dist/render/envlight.js.map +1 -1
  129. package/dist/render/gbufferpass.js +50 -0
  130. package/dist/render/gbufferpass.js.map +1 -0
  131. package/dist/render/lightpass.js +1 -2
  132. package/dist/render/lightpass.js.map +1 -1
  133. package/dist/render/primitive.js +1 -1
  134. package/dist/render/primitive.js.map +1 -1
  135. package/dist/render/render_queue.js +3 -2
  136. package/dist/render/render_queue.js.map +1 -1
  137. package/dist/render/renderer.js +5 -358
  138. package/dist/render/renderer.js.map +1 -1
  139. package/dist/render/rendergraph/executor.js +15 -12
  140. package/dist/render/rendergraph/executor.js.map +1 -1
  141. package/dist/render/rendergraph/forward_plus_builder.js +144 -88
  142. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  143. package/dist/render/rendergraph/history_resource_manager.js +178 -0
  144. package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
  145. package/dist/render/rendergraph/rendergraph.js +12 -1
  146. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  147. package/dist/render/rendergraph/types.js +2 -2
  148. package/dist/render/rendergraph/types.js.map +1 -1
  149. package/dist/render/sky.js +26 -9
  150. package/dist/render/sky.js.map +1 -1
  151. package/dist/scene/basesprite.js +4 -3
  152. package/dist/scene/basesprite.js.map +1 -1
  153. package/dist/scene/batchgroup.js +4 -4
  154. package/dist/scene/environment.js +7 -4
  155. package/dist/scene/environment.js.map +1 -1
  156. package/dist/scene/light.js +184 -18
  157. package/dist/scene/light.js.map +1 -1
  158. package/dist/scene/mesh.js +30 -0
  159. package/dist/scene/mesh.js.map +1 -1
  160. package/dist/scene/particlesys.js +3 -2
  161. package/dist/scene/particlesys.js.map +1 -1
  162. package/dist/scene/raycast_visitor.js +29 -3
  163. package/dist/scene/raycast_visitor.js.map +1 -1
  164. package/dist/scene/scene.js +86 -19
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/scene_node.js +87 -31
  167. package/dist/scene/scene_node.js.map +1 -1
  168. package/dist/scene/script_attachment.js +59 -0
  169. package/dist/scene/script_attachment.js.map +1 -0
  170. package/dist/scene/terrain-cm/grass.js +3 -2
  171. package/dist/scene/terrain-cm/grass.js.map +1 -1
  172. package/dist/scene/terrain-cm/terrain-cm.js +4 -3
  173. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  174. package/dist/scene/water.js +3 -2
  175. package/dist/scene/water.js.map +1 -1
  176. package/dist/shaders/shadow.js +2 -2
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shadow/shadowmapper.js +74 -4
  179. package/dist/shadow/shadowmapper.js.map +1 -1
  180. package/dist/shapes/box.js +163 -0
  181. package/dist/shapes/box.js.map +1 -1
  182. package/dist/shapes/capsule.js +216 -0
  183. package/dist/shapes/capsule.js.map +1 -0
  184. package/dist/shapes/cylinder.js +91 -0
  185. package/dist/shapes/cylinder.js.map +1 -1
  186. package/dist/shapes/plane.js +32 -0
  187. package/dist/shapes/plane.js.map +1 -1
  188. package/dist/shapes/tetrahedron.js +211 -0
  189. package/dist/shapes/tetrahedron.js.map +1 -1
  190. package/dist/shapes/torus.js +173 -0
  191. package/dist/shapes/torus.js.map +1 -1
  192. package/dist/utility/blueprint/common/math.js +111 -1
  193. package/dist/utility/blueprint/common/math.js.map +1 -1
  194. package/dist/utility/blueprint/material/inputs.js +235 -1
  195. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  196. package/dist/utility/blueprint/material/ir.js +154 -10
  197. package/dist/utility/blueprint/material/ir.js.map +1 -1
  198. package/dist/utility/blueprint/material/texture.js +273 -19
  199. package/dist/utility/blueprint/material/texture.js.map +1 -1
  200. package/dist/utility/serialization/json.js +12 -2
  201. package/dist/utility/serialization/json.js.map +1 -1
  202. package/dist/utility/serialization/manager.js +30 -11
  203. package/dist/utility/serialization/manager.js.map +1 -1
  204. package/dist/utility/serialization/scene/animation.js +250 -7
  205. package/dist/utility/serialization/scene/animation.js.map +1 -1
  206. package/dist/utility/serialization/scene/batch.js +4 -2
  207. package/dist/utility/serialization/scene/batch.js.map +1 -1
  208. package/dist/utility/serialization/scene/camera.js +154 -2
  209. package/dist/utility/serialization/scene/camera.js.map +1 -1
  210. package/dist/utility/serialization/scene/cloth_script.js +834 -0
  211. package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
  212. package/dist/utility/serialization/scene/common.js +7 -0
  213. package/dist/utility/serialization/scene/common.js.map +1 -1
  214. package/dist/utility/serialization/scene/light.js +120 -4
  215. package/dist/utility/serialization/scene/light.js.map +1 -1
  216. package/dist/utility/serialization/scene/material.js +453 -1
  217. package/dist/utility/serialization/scene/material.js.map +1 -1
  218. package/dist/utility/serialization/scene/mesh.js +4 -2
  219. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  220. package/dist/utility/serialization/scene/node.js +298 -10
  221. package/dist/utility/serialization/scene/node.js.map +1 -1
  222. package/dist/utility/serialization/scene/particle.js +4 -2
  223. package/dist/utility/serialization/scene/particle.js.map +1 -1
  224. package/dist/utility/serialization/scene/primitive.js +100 -3
  225. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  226. package/dist/utility/serialization/scene/scene.js +130 -3
  227. package/dist/utility/serialization/scene/scene.js.map +1 -1
  228. package/dist/utility/serialization/scene/script.js +66 -0
  229. package/dist/utility/serialization/scene/script.js.map +1 -0
  230. package/dist/utility/serialization/scene/spring_script.js +596 -0
  231. package/dist/utility/serialization/scene/spring_script.js.map +1 -0
  232. package/dist/utility/serialization/scene/sprite.js +5 -3
  233. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  234. package/dist/utility/serialization/scene/terrain.js +4 -2
  235. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  236. package/dist/utility/serialization/scene/water.js +4 -2
  237. package/dist/utility/serialization/scene/water.js.map +1 -1
  238. package/dist/utility/serialization/types.js.map +1 -1
  239. package/dist/values.js +5 -1
  240. package/dist/values.js.map +1 -1
  241. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferredlightpass.js","sources":["../../src/render/deferredlightpass.ts"],"sourcesContent":["import type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getGGXLUT } from '../utility/textures/ggxlut';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { distributionGGX, fresnelSchlick, visGGX } from '../shaders/pbr';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_RECT, LIGHT_TYPE_SPOT, MAX_CLUSTERED_LIGHTS } from '../values';\r\n\r\n/**\r\n * Deferred lighting pass scaffold.\r\n *\r\n * Stage-1 implementation simply resolves GBuffer color to the lighting target.\r\n * Follow-up will evaluate clustered lights using compact material attributes.\r\n * @internal\r\n */\r\nexport class DeferredLightPass {\r\n private static _programs: Record<string, GPUProgram> = {};\r\n private static _bindGroups: Record<string, BindGroup> = {};\r\n\r\n render(\r\n ctx: DrawContext,\r\n gbufferColor: Texture2D,\r\n gbufferRoughness: Texture2D,\r\n gbufferNormal: Texture2D,\r\n gbufferExtra: Texture2D\r\n ) {\r\n if (!ctx.clusteredLight?.lightBuffer || !ctx.clusteredLight.lightIndexTexture || !ctx.linearDepthTexture) {\r\n return;\r\n }\r\n const device = ctx.device;\r\n const hasEnvLight = !!ctx.env?.light?.envLight;\r\n const hasEnvRadiance = !!ctx.env?.light?.envLight?.hasRadiance();\r\n const hasEnvIrradiance = !!ctx.env?.light?.envLight?.hasIrradiance();\r\n const envHash = ctx.env?.light?.envLight ? ctx.env.light.getHash() : 'none';\r\n const hash = `${device.type}:${envHash}:clustered:env:${hasEnvLight ? 1 : 0}:rad:${\r\n hasEnvRadiance ? 1 : 0\r\n }:irr:${hasEnvIrradiance ? 1 : 0}`;\r\n let program = DeferredLightPass._programs[hash];\r\n if (!program) {\r\n const isWebGL = device.type === 'webgl';\r\n const builtProgram = device.buildRenderProgram({\r\n label: 'DeferredLightPass',\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.gbufferColorTex = pb.tex2D().uniform(0);\r\n this.gbufferRoughnessTex = pb.tex2D().uniform(0);\r\n this.gbufferNormalTex = pb.tex2D().uniform(0);\r\n this.gbufferExtraTex = pb.tex2D().uniform(0);\r\n this.linearDepthTex = pb.tex2D().uniform(0);\r\n this.zGGXLut = pb.tex2D().uniform(0);\r\n this.lightIndexTex = (isWebGL ? pb.tex2D() : pb.utex2D()).uniform(0);\r\n this.zLightBuffer = pb.vec4[(MAX_CLUSTERED_LIGHTS + 1) * 4]().uniformBuffer(0);\r\n this.clusterParams = pb.vec4().uniform(0);\r\n this.countParams = pb.ivec4().uniform(0);\r\n this.lightIndexTexSize = pb.ivec2().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.cameraRight = pb.vec3().uniform(0);\r\n this.cameraUp = pb.vec3().uniform(0);\r\n this.cameraForward = pb.vec3().uniform(0);\r\n this.cameraProj = pb.vec2().uniform(0); // x: tanHalfFovy, y: aspect\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.sunDir = pb.vec3().uniform(0);\r\n this.sunColorIntensity = pb.vec4().uniform(0);\r\n this.showGBuffer = pb.int().uniform(0);\r\n this.gbufferViewMode = pb.int().uniform(0);\r\n this.showCluster = pb.int().uniform(0);\r\n this.showShadowTerm = pb.int().uniform(0);\r\n this.showSpecTerm = pb.int().uniform(0);\r\n if (hasEnvLight) {\r\n this.envLightStrength = pb.float().uniform(0);\r\n ctx.env!.light.envLight.initShaderBindings(pb);\r\n }\r\n this.$outputs.color = pb.vec4();\r\n pb.func('zGetClusterIndex', [pb.float('linearDepth')], function () {\r\n this.$l.zTile = pb.int(\r\n pb.max(\r\n pb.add(pb.mul(pb.log2(pb.max(this.linearDepth, 1e-4)), this.clusterParams.z), this.clusterParams.w),\r\n 0\r\n )\r\n );\r\n this.zTile = pb.min(this.zTile, pb.sub(this.countParams.z, 1));\r\n this.$l.f = pb.vec2(this.$builtins.fragCoord.x, pb.sub(this.clusterParams.y, pb.add(this.$builtins.fragCoord.y, 1)));\r\n this.$l.xyTile = pb.ivec2(pb.div(this.f, pb.div(this.clusterParams.xy, pb.vec2(this.countParams.xy))));\r\n this.xyTile = pb.clamp(this.xyTile, pb.ivec2(0), pb.sub(this.countParams.xy, 1));\r\n this.$return(\r\n pb.add(\r\n this.xyTile.x,\r\n pb.mul(this.xyTile.y, this.countParams.x),\r\n pb.mul(this.zTile, this.countParams.x, this.countParams.y)\r\n )\r\n );\r\n });\r\n pb.func('zGetLinearDepth', [], function () {\r\n this.$l.depthSample = pb.textureSample(this.linearDepthTex, this.$inputs.uv);\r\n if (isWebGL) {\r\n this.$return(decodeNormalizedFloatFromRGBA(this, this.depthSample));\r\n } else {\r\n this.$return(this.depthSample.r);\r\n }\r\n });\r\n pb.func('zDecodeWebGLLightIndex', [pb.float('packed'), pb.int('slot')], function () {\r\n this.$if(pb.equal(this.slot, 0), function () {\r\n this.$return(pb.int(pb.div(this.packed, 256)));\r\n });\r\n this.$return(pb.int(pb.mod(this.packed, 256)));\r\n });\r\n pb.func('zPointAtten', [pb.float('dist'), pb.float('range')], function () {\r\n this.$l.falloff = pb.max(0, pb.sub(1, pb.div(this.dist, pb.max(this.range, 1e-4))));\r\n this.$return(pb.mul(this.falloff, this.falloff));\r\n });\r\n pb.func(\r\n 'zSpotAtten',\r\n [pb.vec3('worldPos'), pb.vec4('posRange'), pb.vec4('dirCutoff'), pb.float('dist')],\r\n function () {\r\n this.$l.base = this.zPointAtten(this.dist, this.posRange.w);\r\n this.$l.spotFactor = pb.dot(pb.normalize(pb.sub(this.worldPos, this.posRange.xyz)), this.dirCutoff.xyz);\r\n this.spotFactor = pb.smoothStep(\r\n this.dirCutoff.w,\r\n pb.mix(this.dirCutoff.w, 1, 0.5),\r\n this.spotFactor\r\n );\r\n this.$return(pb.mul(this.base, this.spotFactor));\r\n }\r\n );\r\n pb.func(\r\n 'zAccumulatePunctualLight',\r\n [\r\n pb.vec3('baseColor'),\r\n pb.float('metallic'),\r\n pb.float('roughness'),\r\n pb.float('specularStrength'),\r\n pb.vec3('n'),\r\n pb.vec3('viewDir'),\r\n pb.float('NoV'),\r\n pb.vec3('f0'),\r\n pb.vec3('lightColor'),\r\n pb.vec3('L'),\r\n pb.float('atten'),\r\n pb.float('diffScale'),\r\n pb.float('specScale'),\r\n pb.float('sourceRadiusFactor'),\r\n pb.vec3('outDiffuse').inout(),\r\n pb.vec3('outSpecular').inout()\r\n ],\r\n function () {\r\n this.$l.pointNoL = pb.clamp(pb.dot(this.n, this.L), 0, 1);\r\n this.$if(pb.greaterThan(this.pointNoL, 1e-5), function () {\r\n this.$l.H = pb.normalize(pb.add(this.viewDir, this.L));\r\n this.$l.NoH = pb.clamp(pb.dot(this.n, this.H), 0, 1);\r\n this.$l.VoH = pb.clamp(pb.dot(this.viewDir, this.H), 0, 1);\r\n this.$l.F = fresnelSchlick(this, this.VoH, this.f0, pb.vec3(1));\r\n this.$l.specularRoughness = pb.clamp(\r\n pb.add(this.roughness, this.sourceRadiusFactor),\r\n 0,\r\n 1\r\n );\r\n this.$l.alphaRoughness = pb.mul(this.specularRoughness, this.specularRoughness);\r\n this.$l.D = distributionGGX(this, this.NoH, this.alphaRoughness);\r\n this.$l.V = visGGX(this, this.NoV, this.pointNoL, this.alphaRoughness);\r\n this.$l.punctualColor = pb.mul(this.lightColor, this.atten, this.pointNoL);\r\n this.$l.diffuseBRDF = pb.mul(\r\n pb.sub(pb.vec3(1), this.F),\r\n pb.div(pb.mul(this.baseColor, pb.sub(1, this.metallic)), Math.PI)\r\n );\r\n this.outDiffuse = pb.add(\r\n this.outDiffuse,\r\n pb.mul(this.punctualColor, pb.max(this.diffuseBRDF, pb.vec3(0)), this.diffScale)\r\n );\r\n this.outSpecular = pb.add(\r\n this.outSpecular,\r\n pb.mul(this.punctualColor, this.D, this.V, this.F, this.specScale)\r\n );\r\n });\r\n }\r\n );\r\n pb.func(\r\n 'zAccumulateRectLight',\r\n [\r\n pb.vec3('worldPos'),\r\n pb.vec3('baseColor'),\r\n pb.float('metallic'),\r\n pb.float('roughness'),\r\n pb.float('specularStrength'),\r\n pb.vec3('n'),\r\n pb.vec3('viewDir'),\r\n pb.float('NoV'),\r\n pb.vec3('f0'),\r\n pb.vec4('posRange'),\r\n pb.vec4('axisX'),\r\n pb.vec4('axisY'),\r\n pb.vec4('colorIntensity'),\r\n pb.vec3('outDiffuse').inout(),\r\n pb.vec3('outSpecular').inout()\r\n ],\r\n function () {\r\n this.$l.center = this.posRange.xyz;\r\n this.$l.range = this.posRange.w;\r\n this.$l.ax = this.axisX.xyz;\r\n this.$l.ay = this.axisY.xyz;\r\n this.$l.halfWidth = pb.length(this.ax);\r\n this.$l.halfHeight = pb.length(this.ay);\r\n this.$l.area = pb.mul(this.halfWidth, this.halfHeight, 4);\r\n this.$l.lightNormal = pb.neg(pb.normalize(pb.cross(this.ax, this.ay)));\r\n this.$if(pb.greaterThan(this.area, 0), function () {\r\n this.$l.baseRectColor = pb.mul(this.colorIntensity.rgb, this.colorIntensity.a, this.area, 0.25);\r\n this.$l.samplePos = pb.vec3();\r\n this.$l.Lvec = pb.vec3();\r\n this.$l.L = pb.vec3();\r\n this.$l.dist = pb.float();\r\n this.$l.invDist2 = pb.float();\r\n this.$l.NoL = pb.float();\r\n this.$l.NoL_light = pb.float();\r\n this.$l.falloff = pb.float();\r\n this.$l.lightSampleColor = pb.vec3();\r\n\r\n const sample = (u: number, v: number) => {\r\n this.samplePos = pb.add(\r\n this.center,\r\n pb.add(\r\n pb.mul(this.ax, pb.sub(pb.mul(u, 2), 1)),\r\n pb.mul(this.ay, pb.sub(pb.mul(v, 2), 1))\r\n )\r\n );\r\n this.Lvec = pb.sub(this.samplePos, this.worldPos);\r\n this.dist = pb.length(this.Lvec);\r\n this.invDist2 = pb.div(1, pb.max(pb.mul(this.dist, this.dist), 0.0001));\r\n this.L = pb.normalize(this.Lvec);\r\n this.NoL = pb.clamp(pb.dot(this.n, this.L), 0, 1);\r\n this.NoL_light = pb.clamp(pb.dot(this.lightNormal, pb.neg(this.L)), 0, 1);\r\n this.$if(pb.greaterThan(pb.mul(this.NoL, this.NoL_light), 1e-5), function () {\r\n this.falloff = pb.float(1);\r\n this.$if(pb.greaterThan(this.range, 0), function () {\r\n this.falloff = pb.max(0, pb.sub(1, pb.div(this.dist, this.range)));\r\n this.falloff = pb.mul(this.falloff, this.falloff);\r\n });\r\n this.lightSampleColor = pb.mul(this.baseRectColor, this.invDist2, this.NoL_light);\r\n this.zAccumulatePunctualLight(\r\n this.baseColor,\r\n this.metallic,\r\n this.roughness,\r\n this.specularStrength,\r\n this.n,\r\n this.viewDir,\r\n this.NoV,\r\n this.f0,\r\n this.lightSampleColor,\r\n this.L,\r\n this.falloff,\r\n 1,\r\n 1,\r\n 0,\r\n this.outDiffuse,\r\n this.outSpecular\r\n );\r\n });\r\n };\r\n\r\n sample(0.25, 0.25);\r\n sample(0.75, 0.25);\r\n sample(0.25, 0.75);\r\n sample(0.75, 0.75);\r\n });\r\n }\r\n );\r\n pb.main(function () {\r\n this.$l.base = pb.textureSample(this.gbufferColorTex, this.$inputs.uv);\r\n this.$l.rm = pb.textureSample(this.gbufferRoughnessTex, this.$inputs.uv);\r\n this.$l.extra = pb.textureSample(this.gbufferExtraTex, this.$inputs.uv);\r\n this.$l.litFlag = pb.float(pb.greaterThan(this.extra.a, 0.5));\r\n this.$l.n = pb.normalize(\r\n pb.sub(pb.mul(pb.textureSample(this.gbufferNormalTex, this.$inputs.uv).xyz, 2), pb.vec3(1))\r\n );\r\n this.$l.metallic = pb.clamp(this.rm.r, 0, 1);\r\n this.$l.occlusion = pb.clamp(this.rm.g, 0, 1);\r\n this.$l.specularStrength = pb.clamp(this.rm.b, 0, 1);\r\n this.$l.roughness = pb.clamp(this.rm.a, 0.045, 1);\r\n this.$l.ndc = pb.sub(pb.mul(this.$inputs.uv, 2), pb.vec2(1));\r\n this.$l.xScale = pb.mul(this.cameraProj.x, this.cameraProj.y);\r\n this.$l.yScale = this.cameraProj.x;\r\n this.$l.camRayDir = pb.normalize(\r\n pb.add(\r\n this.cameraForward,\r\n pb.mul(this.cameraRight, pb.mul(this.ndc.x, this.xScale)),\r\n pb.mul(this.cameraUp, pb.mul(this.ndc.y, this.yScale))\r\n )\r\n );\r\n this.$l.linearDepthNormalized = this.zGetLinearDepth();\r\n this.$l.linearDepth = pb.mul(\r\n pb.clamp(this.linearDepthNormalized, 0, 1),\r\n this.cameraNearFar.y\r\n );\r\n this.$l.rayScale = pb.max(pb.dot(this.camRayDir, this.cameraForward), 1e-4);\r\n this.$l.worldPos = pb.add(\r\n this.cameraPos,\r\n pb.mul(this.camRayDir, pb.div(this.linearDepth, this.rayScale))\r\n );\r\n this.$l.viewDir = pb.neg(this.camRayDir);\r\n this.$l.sunL = pb.normalize(this.sunDir);\r\n this.$l.sunColor = pb.mul(this.sunColorIntensity.rgb, this.sunColorIntensity.a);\r\n this.$l.NoL = pb.clamp(pb.dot(this.n, this.sunL), 0, 1);\r\n this.$l.NoV = pb.clamp(pb.dot(this.n, this.viewDir), 0, 1);\r\n this.$l.f0 = pb.mix(pb.mul(pb.vec3(0.04), this.specularStrength), this.base.rgb, this.metallic);\r\n this.$l.fresnelNoV = pb.add(\r\n this.f0,\r\n pb.mul(pb.sub(pb.vec3(1), this.f0), pb.pow(pb.sub(1, this.NoV), 5))\r\n );\r\n this.$l.kd = pb.mul(pb.sub(pb.vec3(1), this.fresnelNoV), pb.sub(1, this.metallic));\r\n this.$l.sunDiffuse = pb.vec3(0);\r\n this.$l.sunSpecular = pb.vec3(0);\r\n this.$if(pb.greaterThan(this.NoL, 1e-5), function () {\r\n this.$l.H = pb.normalize(pb.add(this.viewDir, this.sunL));\r\n this.$l.NoH = pb.clamp(pb.dot(this.n, this.H), 0, 1);\r\n this.$l.VoH = pb.clamp(pb.dot(this.viewDir, this.H), 0, 1);\r\n this.$l.F = fresnelSchlick(this, this.VoH, this.f0, pb.vec3(1));\r\n this.$l.alphaRoughness = pb.mul(this.roughness, this.roughness);\r\n this.$l.D = distributionGGX(this, this.NoH, this.alphaRoughness);\r\n this.$l.V = visGGX(this, this.NoV, this.NoL, this.alphaRoughness);\r\n this.$l.sunPunctualColor = pb.mul(this.sunColor, this.NoL);\r\n this.$l.diffuseBRDF = pb.mul(\r\n pb.sub(pb.vec3(1), this.F),\r\n pb.div(pb.mul(this.base.rgb, pb.sub(1, this.metallic)), Math.PI)\r\n );\r\n this.sunDiffuse = pb.mul(this.sunPunctualColor, pb.max(this.diffuseBRDF, pb.vec3(0)));\r\n this.sunSpecular = pb.mul(this.sunPunctualColor, this.D, this.V, this.F);\r\n });\r\n this.$l.diffuse = this.sunDiffuse;\r\n this.$l.specular = this.sunSpecular;\r\n this.$l.clusterLightCount = pb.int(0);\r\n this.$l.clusterIndex = this.zGetClusterIndex(this.linearDepth);\r\n if (isWebGL) {\r\n this.$l.texCoordX = pb.div(\r\n pb.add(pb.mod(pb.float(this.clusterIndex), pb.float(this.lightIndexTexSize.x)), 0.5),\r\n pb.float(this.lightIndexTexSize.x)\r\n );\r\n this.$l.texCoordY = pb.div(\r\n pb.add(pb.float(pb.div(this.clusterIndex, this.lightIndexTexSize.x)), 0.5),\r\n pb.float(this.lightIndexTexSize.y)\r\n );\r\n this.$l.samp = pb.textureSample(this.lightIndexTex, pb.vec2(this.texCoordX, this.texCoordY));\r\n this.$for(pb.int('i'), 0, 4, function () {\r\n this.$l.packed = this.samp.at(this.i);\r\n this.$for(pb.int('k'), 0, 2, function () {\r\n this.$l.lightIndex = this.zDecodeWebGLLightIndex(this.packed, this.k);\r\n this.$if(pb.greaterThan(this.lightIndex, 0), function () {\r\n this.clusterLightCount = pb.add(this.clusterLightCount, 1);\r\n this.$l.positionRange = this.zLightBuffer.at(pb.mul(this.lightIndex, 4));\r\n this.$l.directionCutoff = this.zLightBuffer.at(pb.add(pb.mul(this.lightIndex, 4), 1));\r\n this.$l.diffuseIntensity = this.zLightBuffer.at(pb.add(pb.mul(this.lightIndex, 4), 2));\r\n this.$l.extra = this.zLightBuffer.at(pb.add(pb.mul(this.lightIndex, 4), 3));\r\n this.$l.lightType = pb.int(this.extra.w);\r\n this.$if(\r\n pb.or(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n pb.equal(this.lightType, LIGHT_TYPE_SPOT)\r\n ),\r\n function () {\r\n this.$l.toLight = pb.sub(this.positionRange.xyz, this.worldPos);\r\n this.$l.dist = pb.length(this.toLight);\r\n this.$l.L = pb.div(this.toLight, pb.max(this.dist, 1e-4));\r\n this.$l.atten = this.zPointAtten(this.dist, this.positionRange.w);\r\n this.$if(pb.equal(this.lightType, LIGHT_TYPE_SPOT), function () {\r\n this.atten = this.zSpotAtten(\r\n this.worldPos,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.dist\r\n );\r\n });\r\n this.$if(pb.greaterThan(this.atten, 1e-5), function () {\r\n this.$l.lightColor = pb.mul(this.diffuseIntensity.rgb, this.diffuseIntensity.a);\r\n this.$l.diffScale = this.$choice(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n this.extra.x,\r\n pb.float(1)\r\n );\r\n this.$l.specScale = this.$choice(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n this.extra.y,\r\n pb.float(1)\r\n );\r\n this.$l.sourceRadiusFactor = this.$choice(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n pb.div(this.extra.z, pb.max(this.dist, 1e-4)),\r\n pb.float(0)\r\n );\r\n this.zAccumulatePunctualLight(\r\n this.base.rgb,\r\n this.metallic,\r\n this.roughness,\r\n this.specularStrength,\r\n this.n,\r\n this.viewDir,\r\n this.NoV,\r\n this.f0,\r\n this.lightColor,\r\n this.L,\r\n this.atten,\r\n this.diffScale,\r\n this.specScale,\r\n this.sourceRadiusFactor,\r\n this.diffuse,\r\n this.specular\r\n );\r\n });\r\n }\r\n );\r\n this.$if(pb.equal(this.lightType, LIGHT_TYPE_RECT), function () {\r\n this.zAccumulateRectLight(\r\n this.worldPos,\r\n this.base.rgb,\r\n this.metallic,\r\n this.roughness,\r\n this.specularStrength,\r\n this.n,\r\n this.viewDir,\r\n this.NoV,\r\n this.f0,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.extra,\r\n this.diffuseIntensity,\r\n this.diffuse,\r\n this.specular\r\n );\r\n });\r\n });\r\n });\r\n });\r\n } else {\r\n this.$l.texCoordX = pb.mod(this.clusterIndex, this.lightIndexTexSize.x);\r\n this.$l.texCoordY = pb.div(this.clusterIndex, this.lightIndexTexSize.x);\r\n this.$l.samp = pb.textureLoad(this.lightIndexTex, pb.ivec2(this.texCoordX, this.texCoordY), 0);\r\n this.$for(pb.uint('i'), 0, 4, function () {\r\n this.$for(pb.uint('k'), 0, 4, function () {\r\n this.$l.lightIndex = pb.compAnd(pb.sar(this.samp.at(this.i), pb.mul(this.k, 8)), 0xff);\r\n this.$if(pb.greaterThan(this.lightIndex, 0), function () {\r\n this.clusterLightCount = pb.add(this.clusterLightCount, 1);\r\n this.$l.positionRange = this.zLightBuffer.at(pb.mul(this.lightIndex, 4));\r\n this.$l.directionCutoff = this.zLightBuffer.at(pb.add(pb.mul(this.lightIndex, 4), 1));\r\n this.$l.diffuseIntensity = this.zLightBuffer.at(pb.add(pb.mul(this.lightIndex, 4), 2));\r\n this.$l.extra = this.zLightBuffer.at(pb.add(pb.mul(this.lightIndex, 4), 3));\r\n this.$l.lightType = pb.int(this.extra.w);\r\n this.$if(\r\n pb.or(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n pb.equal(this.lightType, LIGHT_TYPE_SPOT)\r\n ),\r\n function () {\r\n this.$l.toLight = pb.sub(this.positionRange.xyz, this.worldPos);\r\n this.$l.dist = pb.length(this.toLight);\r\n this.$l.L = pb.div(this.toLight, pb.max(this.dist, 1e-4));\r\n this.$l.atten = this.zPointAtten(this.dist, this.positionRange.w);\r\n this.$if(pb.equal(this.lightType, LIGHT_TYPE_SPOT), function () {\r\n this.atten = this.zSpotAtten(\r\n this.worldPos,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.dist\r\n );\r\n });\r\n this.$if(pb.greaterThan(this.atten, 1e-5), function () {\r\n this.$l.lightColor = pb.mul(this.diffuseIntensity.rgb, this.diffuseIntensity.a);\r\n this.$l.diffScale = this.$choice(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n this.extra.x,\r\n pb.float(1)\r\n );\r\n this.$l.specScale = this.$choice(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n this.extra.y,\r\n pb.float(1)\r\n );\r\n this.$l.sourceRadiusFactor = this.$choice(\r\n pb.equal(this.lightType, LIGHT_TYPE_POINT),\r\n pb.div(this.extra.z, pb.max(this.dist, 1e-4)),\r\n pb.float(0)\r\n );\r\n this.zAccumulatePunctualLight(\r\n this.base.rgb,\r\n this.metallic,\r\n this.roughness,\r\n this.specularStrength,\r\n this.n,\r\n this.viewDir,\r\n this.NoV,\r\n this.f0,\r\n this.lightColor,\r\n this.L,\r\n this.atten,\r\n this.diffScale,\r\n this.specScale,\r\n this.sourceRadiusFactor,\r\n this.diffuse,\r\n this.specular\r\n );\r\n });\r\n }\r\n );\r\n this.$if(pb.equal(this.lightType, LIGHT_TYPE_RECT), function () {\r\n this.zAccumulateRectLight(\r\n this.worldPos,\r\n this.base.rgb,\r\n this.metallic,\r\n this.roughness,\r\n this.specularStrength,\r\n this.n,\r\n this.viewDir,\r\n this.NoV,\r\n this.f0,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.extra,\r\n this.diffuseIntensity,\r\n this.diffuse,\r\n this.specular\r\n );\r\n });\r\n });\r\n });\r\n });\r\n }\r\n this.$l.finalColor = pb.add(pb.mul(pb.add(this.diffuse, this.specular), this.litFlag), this.extra.rgb);\r\n if (hasEnvIrradiance || hasEnvRadiance) {\r\n this.$l.ggxLutSample = pb.clamp(\r\n pb.textureSampleLevel(\r\n this.zGGXLut,\r\n pb.clamp(pb.vec2(this.NoV, this.roughness), pb.vec2(0), pb.vec2(1)),\r\n 0\r\n ),\r\n pb.vec4(0),\r\n pb.vec4(1)\r\n );\r\n this.$l.f_ab = this.ggxLutSample.rg;\r\n this.$l.FssEss = pb.add(pb.mul(this.fresnelNoV, this.f_ab.x), pb.vec3(this.f_ab.y));\r\n this.$l.Ems = pb.sub(1, pb.add(this.f_ab.x, this.f_ab.y));\r\n this.$l.F_avg = pb.add(this.f0, pb.div(pb.sub(pb.vec3(1), this.f0), 21));\r\n this.$l.FmsEms = pb.div(\r\n pb.mul(this.FssEss, this.F_avg, this.Ems),\r\n pb.max(pb.sub(pb.vec3(1), pb.mul(this.F_avg, this.Ems)), pb.vec3(1e-4))\r\n );\r\n }\r\n if (hasEnvIrradiance) {\r\n this.$l.envIrr = ctx.env!.light.envLight.getIrradiance(this, this.n).rgb;\r\n this.finalColor = pb.add(\r\n this.finalColor,\r\n pb.mul(\r\n pb.add(this.kd, this.FmsEms),\r\n this.base.rgb,\r\n this.envIrr,\r\n this.envLightStrength,\r\n this.occlusion,\r\n 1 / Math.PI\r\n )\r\n );\r\n }\r\n if (hasEnvRadiance) {\r\n this.$l.reflectVec = pb.reflect(pb.neg(this.viewDir), this.n);\r\n this.$l.envRad = ctx.env!.light.envLight.getRadiance(this, this.reflectVec, this.roughness)!.rgb;\r\n this.finalColor = pb.add(\r\n this.finalColor,\r\n pb.mul(\r\n this.envRad,\r\n this.FssEss,\r\n this.envLightStrength,\r\n this.occlusion\r\n )\r\n );\r\n }\r\n // Deferred direct shadowing is aligned in follow-up pass; keep a stable debug channel now.\r\n this.$l.shadowTerm = pb.float(1);\r\n this.$l.debugColor = pb.max(this.finalColor, pb.vec3(0));\r\n this.$if(pb.notEqual(this.showGBuffer, 0), function () {\r\n this.$if(pb.equal(this.gbufferViewMode, 1), function () {\r\n this.debugColor = pb.vec3(pb.clamp(this.linearDepthNormalized, 0, 1));\r\n }).$elseif(pb.equal(this.gbufferViewMode, 2), function () {\r\n this.debugColor = pb.vec3(this.metallic);\r\n }).$elseif(pb.equal(this.gbufferViewMode, 3), function () {\r\n this.debugColor = pb.vec3(this.roughness);\r\n }).$elseif(pb.equal(this.gbufferViewMode, 4), function () {\r\n this.$l.rawN = pb.sub(pb.mul(pb.textureSample(this.gbufferNormalTex, this.$inputs.uv).xyz, 2), pb.vec3(1));\r\n this.debugColor = pb.vec3(pb.clamp(pb.length(this.rawN), 0, 1));\r\n }).$else(function () {\r\n // composite\r\n this.$if(pb.lessThan(this.$inputs.uv.x, 0.5), function () {\r\n this.$if(pb.lessThan(this.$inputs.uv.y, 0.5), function () {\r\n this.debugColor = this.base.rgb;\r\n }).$else(function () {\r\n this.debugColor = this.rm.rgb;\r\n });\r\n }).$else(function () {\r\n this.$if(pb.lessThan(this.$inputs.uv.y, 0.5), function () {\r\n this.debugColor = pb.add(pb.mul(this.n, 0.5), pb.vec3(0.5));\r\n }).$else(function () {\r\n this.debugColor = pb.vec3(this.roughness);\r\n });\r\n });\r\n });\r\n }).$elseif(pb.notEqual(this.showCluster, 0), function () {\r\n this.$l.clusterT = pb.clamp(pb.div(pb.float(this.clusterLightCount), 16), 0, 1);\r\n this.debugColor = pb.vec3(this.clusterT, pb.mul(this.clusterT, this.clusterT), pb.sub(1, this.clusterT));\r\n }).$elseif(pb.notEqual(this.showShadowTerm, 0), function () {\r\n this.debugColor = pb.vec3(this.shadowTerm);\r\n }).$elseif(pb.notEqual(this.showSpecTerm, 0), function () {\r\n this.debugColor = pb.max(this.specular, pb.vec3(0));\r\n });\r\n this.$outputs.color = pb.vec4(this.debugColor, this.base.a);\r\n });\r\n }\r\n });\r\n if (!builtProgram) {\r\n return;\r\n }\r\n program = builtProgram;\r\n program.name = '@DeferredLightPass';\r\n DeferredLightPass._programs[hash] = program;\r\n }\r\n let bindGroup = DeferredLightPass._bindGroups[hash];\r\n if (!bindGroup) {\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n DeferredLightPass._bindGroups[hash] = bindGroup;\r\n }\r\n bindGroup.setTexture(\r\n 'gbufferColorTex',\r\n gbufferColor,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bindGroup.setTexture(\r\n 'gbufferRoughnessTex',\r\n gbufferRoughness,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bindGroup.setTexture(\r\n 'gbufferNormalTex',\r\n gbufferNormal,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bindGroup.setTexture('gbufferExtraTex', gbufferExtra, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('linearDepthTex', ctx.linearDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('zGGXLut', getGGXLUT(1024), fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('lightIndexTex', ctx.clusteredLight.lightIndexTexture);\r\n bindGroup.setBuffer('zLightBuffer', ctx.clusteredLight.lightBuffer);\r\n bindGroup.setValue('clusterParams', ctx.clusteredLight.clusterParam);\r\n bindGroup.setValue('countParams', ctx.clusteredLight.countParam);\r\n bindGroup.setValue(\r\n 'lightIndexTexSize',\r\n new Int32Array([ctx.clusteredLight.lightIndexTexture.width, ctx.clusteredLight.lightIndexTexture.height])\r\n );\r\n const sunDirSrc = ctx.sunLight ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1) : { x: 0, y: 0, z: 1 };\r\n const sunShadowed = !!(ctx.sunLight && ctx.shadowMapInfo?.has(ctx.sunLight));\r\n const sunColorIntensitySrc = ctx.sunLight\r\n ? sunShadowed\r\n ? { x: 0, y: 0, z: 0, w: 0 }\r\n : ctx.sunLight.diffuseAndIntensity\r\n : { x: 1, y: 1, z: 1, w: 0 };\r\n const cameraRight = ctx.camera.worldMatrix.getRow(0).xyz().inplaceNormalize();\r\n const cameraUp = ctx.camera.worldMatrix.getRow(1).xyz().inplaceNormalize();\r\n const cameraForward = ctx.camera.worldMatrix.getRow(2).xyz().inplaceNormalize().scaleBy(-1);\r\n const cameraPos = ctx.camera.getWorldPosition();\r\n bindGroup.setValue('sunDir', new Float32Array([sunDirSrc.x, sunDirSrc.y, sunDirSrc.z]));\r\n bindGroup.setValue(\r\n 'sunColorIntensity',\r\n new Float32Array([\r\n sunColorIntensitySrc.x,\r\n sunColorIntensitySrc.y,\r\n sunColorIntensitySrc.z,\r\n sunColorIntensitySrc.w\r\n ])\r\n );\r\n bindGroup.setValue('cameraRight', new Float32Array([cameraRight.x, cameraRight.y, cameraRight.z]));\r\n bindGroup.setValue('cameraUp', new Float32Array([cameraUp.x, cameraUp.y, cameraUp.z]));\r\n bindGroup.setValue('cameraForward', new Float32Array([cameraForward.x, cameraForward.y, cameraForward.z]));\r\n bindGroup.setValue('cameraPos', new Float32Array([cameraPos.x, cameraPos.y, cameraPos.z]));\r\n bindGroup.setValue('cameraProj', new Float32Array([ctx.camera.getTanHalfFovy(), ctx.camera.getAspect()]));\r\n bindGroup.setValue('cameraNearFar', new Float32Array([ctx.camera.getNearPlane(), ctx.camera.getFarPlane()]));\r\n let gbufferViewMode = 0;\r\n switch (ctx.camera.deferredGBufferView) {\r\n case 'depth':\r\n gbufferViewMode = 1;\r\n break;\r\n case 'metallic':\r\n gbufferViewMode = 2;\r\n break;\r\n case 'roughness':\r\n gbufferViewMode = 3;\r\n break;\r\n case 'normal-length':\r\n gbufferViewMode = 4;\r\n break;\r\n default:\r\n gbufferViewMode = 0;\r\n break;\r\n }\r\n bindGroup.setValue('showGBuffer', ctx.camera.deferredShowGBuffer ? 1 : 0);\r\n bindGroup.setValue('gbufferViewMode', gbufferViewMode);\r\n bindGroup.setValue('showCluster', ctx.camera.deferredShowCluster ? 1 : 0);\r\n bindGroup.setValue('showShadowTerm', ctx.camera.deferredShowShadowTerm ? 1 : 0);\r\n bindGroup.setValue('showSpecTerm', ctx.camera.deferredShowSpecTerm ? 1 : 0);\r\n if (ctx.env?.light?.envLight) {\r\n bindGroup.setValue('envLightStrength', ctx.env.light.strength ?? 0);\r\n ctx.env.light.envLight.updateBindGroup(bindGroup);\r\n }\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad();\r\n }\r\n}\r\n"],"names":["DeferredLightPass","_programs","_bindGroups","render","ctx","gbufferColor","gbufferRoughness","gbufferNormal","gbufferExtra","clusteredLight","lightBuffer","lightIndexTexture","linearDepthTexture","device","hasEnvLight","env","light","envLight","hasEnvRadiance","hasRadiance","hasEnvIrradiance","hasIrradiance","envHash","getHash","hash","type","program","isWebGL","builtProgram","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","y","neg","fragment","gbufferColorTex","tex2D","uniform","gbufferRoughnessTex","gbufferNormalTex","gbufferExtraTex","linearDepthTex","zGGXLut","lightIndexTex","utex2D","zLightBuffer","MAX_CLUSTERED_LIGHTS","uniformBuffer","clusterParams","countParams","ivec4","lightIndexTexSize","ivec2","cameraPos","vec3","cameraRight","cameraUp","cameraForward","cameraProj","cameraNearFar","sunDir","sunColorIntensity","showGBuffer","int","gbufferViewMode","showCluster","showShadowTerm","showSpecTerm","envLightStrength","float","initShaderBindings","color","func","$l","zTile","max","log2","linearDepth","z","w","min","sub","f","fragCoord","x","xyTile","div","clamp","$return","depthSample","textureSample","decodeNormalizedFloatFromRGBA","r","$if","equal","slot","packed","mod","falloff","dist","range","base","zPointAtten","posRange","spotFactor","dot","normalize","worldPos","xyz","dirCutoff","smoothStep","mix","inout","pointNoL","n","L","greaterThan","H","viewDir","NoH","VoH","F","fresnelSchlick","f0","specularRoughness","roughness","sourceRadiusFactor","alphaRoughness","D","distributionGGX","V","visGGX","NoV","punctualColor","lightColor","atten","diffuseBRDF","baseColor","metallic","Math","PI","outDiffuse","diffScale","outSpecular","specScale","center","ax","axisX","ay","axisY","halfWidth","length","halfHeight","area","lightNormal","cross","baseRectColor","colorIntensity","rgb","a","samplePos","Lvec","invDist2","NoL","NoL_light","lightSampleColor","sample","u","v","zAccumulatePunctualLight","specularStrength","rm","extra","litFlag","occlusion","g","b","ndc","xScale","yScale","camRayDir","linearDepthNormalized","zGetLinearDepth","rayScale","sunL","sunColor","fresnelNoV","pow","kd","sunDiffuse","sunSpecular","sunPunctualColor","diffuse","specular","clusterLightCount","clusterIndex","zGetClusterIndex","texCoordX","texCoordY","samp","$for","at","i","lightIndex","zDecodeWebGLLightIndex","k","positionRange","directionCutoff","diffuseIntensity","lightType","or","LIGHT_TYPE_POINT","LIGHT_TYPE_SPOT","toLight","zSpotAtten","$choice","LIGHT_TYPE_RECT","zAccumulateRectLight","textureLoad","uint","compAnd","sar","finalColor","ggxLutSample","textureSampleLevel","f_ab","rg","FssEss","Ems","F_avg","FmsEms","envIrr","getIrradiance","reflectVec","reflect","envRad","getRadiance","shadowTerm","debugColor","notEqual","$elseif","rawN","$else","lessThan","clusterT","name","bindGroup","createBindGroup","bindGroupLayouts","setTexture","fetchSampler","getGGXLUT","setBuffer","setValue","clusterParam","countParam","Int32Array","width","height","sunDirSrc","sunLight","directionAndCutoff","scaleBy","sunShadowed","shadowMapInfo","has","sunColorIntensitySrc","diffuseAndIntensity","camera","worldMatrix","getRow","inplaceNormalize","getWorldPosition","Float32Array","getTanHalfFovy","getAspect","getNearPlane","getFarPlane","deferredGBufferView","deferredShowGBuffer","deferredShowCluster","deferredShowShadowTerm","deferredShowSpecTerm","strength","updateBindGroup","setProgram","setBindGroup","drawFullscreenQuad"],"mappings":"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"}
@@ -0,0 +1,428 @@
1
+ import { Vector2, Vector4 } from '@zephyr3d/base';
2
+ import { drawFullscreenQuad } from './fullscreenquad.js';
3
+ import { fetchSampler } from '../utility/misc.js';
4
+ import { ShaderHelper } from '../material/shader/helper.js';
5
+ import { decodeNormalizedFloatFromRGBA } from '../shaders/misc.js';
6
+ import { fresnelSchlick, distributionGGX, visGGX } from '../shaders/pbr.js';
7
+ import { RENDER_PASS_TYPE_LIGHT, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, LIGHT_TYPE_RECT } from '../values.js';
8
+
9
+ /**
10
+ * Deferred single shadowed-light accumulation pass.
11
+ *
12
+ * Renders one fullscreen additive pass per shadow-casting light and reuses the
13
+ * existing shadow map sampling pipeline via ShaderHelper/ShadowMapper.
14
+ * @internal
15
+ */ class DeferredShadowLightPass {
16
+ static _programs = {};
17
+ static _bindGroups = {};
18
+ static _additiveRenderStates = null;
19
+ static _multiplyRenderStates = null;
20
+ static getProgramHash(deviceType, shaderHash, debugShadowTermOnly, hasSceneColor, hasHiZ, hasLinearDepth) {
21
+ return `${deviceType}:${shaderHash}:deferred-shadow:${debugShadowTermOnly ? 1 : 0}:scene:${hasSceneColor ? 1 : 0}:hiz:${hasHiZ ? 1 : 0}:depth:${hasLinearDepth ? 1 : 0}`;
22
+ }
23
+ static hasTextureUniform(bindGroup, program, name) {
24
+ const bindGroupLayout = bindGroup.getLayout?.() ?? program.bindGroupLayouts[0];
25
+ return !!bindGroupLayout?.entries?.some((entry)=>entry.name === name && (entry.texture || entry.storageTexture || entry.externalTexture));
26
+ }
27
+ static bindOptionalSceneTextures(bindGroup, program, ctx) {
28
+ if (ctx.linearDepthTexture && this.hasTextureUniform(bindGroup, program, 'Z_UniformLinearDepth')) {
29
+ bindGroup.setTexture('Z_UniformLinearDepth', ctx.linearDepthTexture, fetchSampler('clamp_nearest_nomip'));
30
+ bindGroup.setValue('Z_UniformLinearDepthSize', new Vector2(ctx.linearDepthTexture.width, ctx.linearDepthTexture.height));
31
+ }
32
+ if (ctx.sceneColorTexture && this.hasTextureUniform(bindGroup, program, 'Z_UniformSceneColor')) {
33
+ bindGroup.setTexture('Z_UniformSceneColor', ctx.sceneColorTexture, fetchSampler('clamp_nearest_nomip'));
34
+ bindGroup.setValue('Z_UniformSceneColorSize', new Vector2(ctx.sceneColorTexture.width, ctx.sceneColorTexture.height));
35
+ }
36
+ if (ctx.HiZTexture && this.hasTextureUniform(bindGroup, program, 'Z_UniformHiZDepth')) {
37
+ bindGroup.setTexture('Z_UniformHiZDepth', ctx.HiZTexture, fetchSampler('clamp_nearest'));
38
+ bindGroup.setValue('Z_UniformHiZDepthInfo', new Vector4(ctx.HiZTexture.width, ctx.HiZTexture.height, ctx.HiZTexture.mipLevelCount, 0));
39
+ }
40
+ }
41
+ static getCameraUniforms(ctx) {
42
+ const cameraPos = ctx.camera.getWorldPosition();
43
+ return {
44
+ position: new Vector4(cameraPos.x, cameraPos.y, cameraPos.z, 0),
45
+ renderSize: new Vector2(ctx.renderWidth, ctx.renderHeight),
46
+ viewProjectionMatrix: ctx.camera.viewProjectionMatrix,
47
+ unjitteredVPMatrix: ctx.camera.viewProjectionMatrix,
48
+ jitteredInvVPMatrix: ctx.camera.invViewProjectionMatrix,
49
+ jitterValue: ctx.camera.jitterValue,
50
+ invViewProjectionMatrix: ctx.camera.invViewProjectionMatrix,
51
+ projectionMatrix: ctx.camera.getProjectionMatrix(),
52
+ invProjectionMatrix: ctx.camera.getInvProjectionMatrix(),
53
+ viewMatrix: ctx.camera.viewMatrix,
54
+ worldMatrix: ctx.camera.worldMatrix,
55
+ params: new Vector4(ctx.camera.getNearPlane(), ctx.camera.getFarPlane(), ctx.flip ? -1 : 1, 0),
56
+ roughnessFactor: ctx.camera.SSR ? ctx.camera.ssrRoughnessFactor : 1,
57
+ shadowDebugCascades: ctx.camera.shadowDebugCascades ? 1 : 0,
58
+ frameDeltaTime: ctx.device.frameInfo.elapsedFrame * 0.001,
59
+ elapsedTime: ctx.device.frameInfo.elapsedOverall * 0.001,
60
+ framestamp: ctx.device.frameInfo.frameCounter
61
+ };
62
+ }
63
+ render(ctx, light, gbufferColor, gbufferRoughness, gbufferNormal, gbufferExtra, debugShadowTermOnly = false) {
64
+ if (!ctx.shadowMapInfo?.has(light) || !ctx.linearDepthTexture) {
65
+ return;
66
+ }
67
+ const shadowMapParams = ctx.shadowMapInfo.get(light);
68
+ const device = ctx.device;
69
+ const prevLight = ctx.currentShadowLight ?? null;
70
+ const prevRenderPass = ctx.renderPass;
71
+ ctx.currentShadowLight = light;
72
+ ctx.renderPass = {
73
+ type: RENDER_PASS_TYPE_LIGHT
74
+ };
75
+ const hash = DeferredShadowLightPass.getProgramHash(device.type, shadowMapParams.shaderHash, debugShadowTermOnly, !!ctx.sceneColorTexture, !!ctx.HiZTexture, !!ctx.linearDepthTexture);
76
+ let program = DeferredShadowLightPass._programs[hash];
77
+ if (!program) {
78
+ const isWebGL = device.type === 'webgl';
79
+ const builtProgram = device.buildRenderProgram({
80
+ label: 'DeferredShadowLightPass',
81
+ vertex (pb) {
82
+ this.$inputs.pos = pb.vec2().attrib('position');
83
+ pb.main(function() {
84
+ this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);
85
+ if (device.type === 'webgpu') {
86
+ this.$builtins.position.y = pb.neg(this.$builtins.position.y);
87
+ }
88
+ });
89
+ },
90
+ fragment (pb) {
91
+ ShaderHelper.prepareFragmentShader(pb, ctx);
92
+ this.gbufferColorTex = pb.tex2D().uniform(0);
93
+ this.gbufferRoughnessTex = pb.tex2D().uniform(0);
94
+ this.gbufferNormalTex = pb.tex2D().uniform(0);
95
+ this.gbufferExtraTex = pb.tex2D().uniform(0);
96
+ this.linearDepthTex = pb.tex2D().uniform(0);
97
+ this.cameraPos = pb.vec3().uniform(0);
98
+ this.cameraRight = pb.vec3().uniform(0);
99
+ this.cameraUp = pb.vec3().uniform(0);
100
+ this.cameraForward = pb.vec3().uniform(0);
101
+ this.cameraViewProjection = pb.mat4().uniform(0);
102
+ this.cameraProj = pb.vec2().uniform(0); // x: tanHalfFovy, y: aspect
103
+ this.cameraNearFar = pb.vec2().uniform(0);
104
+ this.debugShadowTermOnly = pb.int().uniform(0);
105
+ this.$outputs.color = pb.vec4();
106
+ pb.func('zGetLinearDepth', [], function() {
107
+ this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), ShaderHelper.getRenderSize(this));
108
+ this.$l.depthSample = pb.textureSample(this.linearDepthTex, this.uv);
109
+ if (isWebGL) {
110
+ this.$return(decodeNormalizedFloatFromRGBA(this, this.depthSample));
111
+ } else {
112
+ this.$return(this.depthSample.r);
113
+ }
114
+ });
115
+ pb.func('zPointAtten', [
116
+ pb.float('dist'),
117
+ pb.float('range')
118
+ ], function() {
119
+ this.$l.falloff = pb.max(0, pb.sub(1, pb.div(this.dist, pb.max(this.range, 1e-4))));
120
+ this.$return(pb.mul(this.falloff, this.falloff));
121
+ });
122
+ pb.func('zSpotAtten', [
123
+ pb.vec3('worldPos'),
124
+ pb.vec4('posRange'),
125
+ pb.vec4('dirCutoff'),
126
+ pb.float('dist')
127
+ ], function() {
128
+ this.$l.base = this.zPointAtten(this.dist, this.posRange.w);
129
+ this.$l.spotFactor = pb.dot(pb.normalize(pb.sub(this.worldPos, this.posRange.xyz)), this.dirCutoff.xyz);
130
+ this.spotFactor = pb.smoothStep(this.dirCutoff.w, pb.mix(this.dirCutoff.w, 1, 0.5), this.spotFactor);
131
+ this.$return(pb.mul(this.base, this.spotFactor));
132
+ });
133
+ pb.func('zAccumulatePunctualShadowedLight', [
134
+ pb.vec3('baseColor'),
135
+ pb.float('metallic'),
136
+ pb.float('roughness'),
137
+ pb.float('specularStrength'),
138
+ pb.vec3('n'),
139
+ pb.vec3('viewDir'),
140
+ pb.float('NoV'),
141
+ pb.vec3('f0'),
142
+ pb.vec3('lightColor'),
143
+ pb.vec3('L'),
144
+ pb.float('atten'),
145
+ pb.float('shadow'),
146
+ pb.float('litMask'),
147
+ pb.float('diffScale'),
148
+ pb.float('specScale'),
149
+ pb.vec3('outLight').inout(),
150
+ pb.float('outShadow').inout()
151
+ ], function() {
152
+ this.$l.NoL = pb.clamp(pb.dot(this.n, this.L), 0, 1);
153
+ this.$if(pb.greaterThan(this.NoL, 1e-5), function() {
154
+ this.$l.H = pb.normalize(pb.add(this.viewDir, this.L));
155
+ this.$l.NoH = pb.clamp(pb.dot(this.n, this.H), 0, 1);
156
+ this.$l.VoH = pb.clamp(pb.dot(this.viewDir, this.H), 0, 1);
157
+ this.$l.F = fresnelSchlick(this, this.VoH, this.f0, pb.vec3(1));
158
+ this.$l.alphaRoughness = pb.mul(this.roughness, this.roughness);
159
+ this.$l.D = distributionGGX(this, this.NoH, this.alphaRoughness);
160
+ this.$l.V = visGGX(this, this.NoV, this.NoL, this.alphaRoughness);
161
+ this.$l.diffuseBRDF = pb.mul(pb.sub(pb.vec3(1), this.F), pb.div(pb.mul(this.baseColor, pb.sub(1, this.metallic)), Math.PI));
162
+ this.$l.unshadowedColor = pb.mul(this.lightColor, this.atten, this.NoL);
163
+ this.$l.punctualColor = pb.mul(this.unshadowedColor, this.shadow, this.litMask);
164
+ this.$l.diffuse = pb.mul(this.punctualColor, pb.max(this.diffuseBRDF, pb.vec3(0)), this.diffScale);
165
+ this.$l.specular = pb.mul(this.punctualColor, this.D, this.V, this.F, this.specScale);
166
+ this.outLight = pb.add(this.outLight, pb.max(pb.add(this.diffuse, this.specular), pb.vec3(0)));
167
+ this.outShadow = pb.add(this.outShadow, pb.mul(this.shadow, this.litMask));
168
+ });
169
+ });
170
+ pb.func('zSampleLinearDepthAtUV', [
171
+ pb.vec2('uv')
172
+ ], function() {
173
+ if (isWebGL) {
174
+ this.$l.depthSample = pb.textureSample(this.linearDepthTex, this.uv);
175
+ this.$return(decodeNormalizedFloatFromRGBA(this, this.depthSample));
176
+ } else {
177
+ this.$l.texSize = pb.ivec2(ShaderHelper.getRenderSize(this));
178
+ this.$l.pixelCoord = pb.clamp(pb.ivec2(pb.mul(this.uv, pb.vec2(this.texSize))), pb.ivec2(0), pb.sub(this.texSize, pb.ivec2(1)));
179
+ this.$l.depthSample = pb.textureLoad(this.linearDepthTex, this.pixelCoord, 0);
180
+ this.$return(this.depthSample.r);
181
+ }
182
+ });
183
+ pb.func('zContactShadow', [
184
+ pb.vec3('worldPos'),
185
+ pb.vec3('L'),
186
+ pb.int('lightType'),
187
+ pb.vec4('posRange')
188
+ ], function() {
189
+ this.$l.steps = pb.int(8);
190
+ this.$l.maxDistance = this.$choice(pb.equal(this.lightType, LIGHT_TYPE_POINT), pb.clamp(pb.mul(this.posRange.w, 0.2), 0.2, 3), this.$choice(pb.equal(this.lightType, LIGHT_TYPE_SPOT), pb.clamp(pb.mul(this.posRange.w, 0.25), 0.25, 3.5), pb.float(1.5)));
191
+ this.$l.stepLen = pb.div(this.maxDistance, pb.float(this.steps));
192
+ this.$l.occlusion = pb.float(0);
193
+ this.$for(pb.int('i'), 1, pb.add(this.steps, 1), function() {
194
+ this.$l.samplePos = pb.add(this.worldPos, pb.mul(this.L, pb.mul(pb.float(this.i), this.stepLen)));
195
+ this.$l.clip = pb.mul(this.cameraViewProjection, pb.vec4(this.samplePos, 1));
196
+ this.$if(pb.lessThanEqual(this.clip.w, 1e-6), function() {
197
+ this.$continue();
198
+ });
199
+ this.$l.ndc = pb.div(this.clip.xy, this.clip.w);
200
+ this.$l.uv = pb.add(pb.mul(this.ndc, 0.5), pb.vec2(0.5));
201
+ this.$if(pb.or(pb.lessThan(this.uv.x, 0), pb.greaterThan(this.uv.x, 1), pb.lessThan(this.uv.y, 0), pb.greaterThan(this.uv.y, 1)), function() {
202
+ this.$continue();
203
+ });
204
+ this.$l.sceneDepth = pb.mul(this.zSampleLinearDepthAtUV(this.uv), this.cameraNearFar.y);
205
+ this.$l.sampleDepth = pb.dot(pb.sub(this.samplePos, this.cameraPos), this.cameraForward);
206
+ this.$if(pb.greaterThan(pb.sub(this.sampleDepth, this.sceneDepth), 0.02), function() {
207
+ this.occlusion = pb.add(this.occlusion, 1);
208
+ });
209
+ });
210
+ this.$l.visibility = pb.sub(1, pb.mul(pb.div(this.occlusion, pb.float(this.steps)), 0.65));
211
+ this.$return(pb.clamp(this.visibility, 0, 1));
212
+ });
213
+ pb.func('zAccumulateRectShadowedLight', [
214
+ pb.vec3('worldPos'),
215
+ pb.vec3('baseColor'),
216
+ pb.float('metallic'),
217
+ pb.float('roughness'),
218
+ pb.float('specularStrength'),
219
+ pb.vec3('n'),
220
+ pb.vec3('viewDir'),
221
+ pb.float('NoV'),
222
+ pb.vec3('f0'),
223
+ pb.vec4('posRange'),
224
+ pb.vec4('axisX'),
225
+ pb.vec4('axisY'),
226
+ pb.vec4('colorIntensity'),
227
+ pb.float('validMask'),
228
+ pb.vec3('outLight').inout(),
229
+ pb.float('outShadow').inout()
230
+ ], function() {
231
+ this.$l.center = this.posRange.xyz;
232
+ this.$l.range = this.posRange.w;
233
+ this.$l.ax = this.axisX.xyz;
234
+ this.$l.ay = this.axisY.xyz;
235
+ this.$l.halfWidth = pb.length(this.ax);
236
+ this.$l.halfHeight = pb.length(this.ay);
237
+ this.$l.area = pb.mul(this.halfWidth, this.halfHeight, 4);
238
+ this.$l.lightNormal = pb.neg(pb.normalize(pb.cross(this.ax, this.ay)));
239
+ this.$if(pb.greaterThan(this.area, 0), function() {
240
+ this.$l.baseRectColor = pb.mul(this.colorIntensity.rgb, this.colorIntensity.a, this.area, 0.25);
241
+ this.$l.samplePos = pb.vec3();
242
+ this.$l.Lvec = pb.vec3();
243
+ this.$l.L = pb.vec3();
244
+ this.$l.dist = pb.float();
245
+ this.$l.invDist2 = pb.float();
246
+ this.$l.NoL_light = pb.float();
247
+ this.$l.falloff = pb.float();
248
+ this.$l.lightSampleColor = pb.vec3();
249
+ this.$l.sampleShadow = pb.float();
250
+ this.$l.contactShadow = pb.float();
251
+ this.$l.sampleLitMask = pb.float();
252
+ this.$l.sampleNoL = pb.float();
253
+ const sample = (u, v)=>{
254
+ this.samplePos = pb.add(this.center, pb.add(pb.mul(this.ax, pb.sub(pb.mul(u, 2), 1)), pb.mul(this.ay, pb.sub(pb.mul(v, 2), 1))));
255
+ this.Lvec = pb.sub(this.samplePos, this.worldPos);
256
+ this.dist = pb.length(this.Lvec);
257
+ this.invDist2 = pb.div(1, pb.max(pb.mul(this.dist, this.dist), 0.0001));
258
+ this.L = pb.normalize(this.Lvec);
259
+ this.sampleNoL = pb.clamp(pb.dot(this.n, this.L), 0, 1);
260
+ this.NoL_light = pb.clamp(pb.dot(this.lightNormal, pb.neg(this.L)), 0, 1);
261
+ // Keep PCF/PCF-PD shadow sampling in uniform control flow.
262
+ this.sampleShadow = ShaderHelper.calculateShadow(this, this.worldPos, pb.max(this.sampleNoL, 1e-5), ctx);
263
+ this.sampleShadow = pb.mix(1, this.sampleShadow, this.validMask);
264
+ this.contactShadow = this.zContactShadow(this.worldPos, this.L, LIGHT_TYPE_RECT, this.posRange);
265
+ this.sampleShadow = pb.mul(this.sampleShadow, this.contactShadow);
266
+ this.$if(pb.greaterThan(this.NoL_light, 1e-5), function() {
267
+ this.falloff = pb.float(1);
268
+ this.$if(pb.greaterThan(this.range, 0), function() {
269
+ this.falloff = pb.max(0, pb.sub(1, pb.div(this.dist, this.range)));
270
+ this.falloff = pb.mul(this.falloff, this.falloff);
271
+ });
272
+ this.lightSampleColor = pb.mul(this.baseRectColor, this.invDist2, this.NoL_light);
273
+ this.sampleLitMask = this.validMask;
274
+ this.zAccumulatePunctualShadowedLight(this.baseColor, this.metallic, this.roughness, this.specularStrength, this.n, this.viewDir, this.NoV, this.f0, this.lightSampleColor, this.L, this.falloff, this.sampleShadow, this.sampleLitMask, 1, 1, this.outLight, this.outShadow);
275
+ });
276
+ };
277
+ sample(0.25, 0.25);
278
+ sample(0.75, 0.25);
279
+ sample(0.25, 0.75);
280
+ sample(0.75, 0.75);
281
+ this.outShadow = pb.mul(this.outShadow, 0.25);
282
+ });
283
+ });
284
+ pb.main(function() {
285
+ this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), ShaderHelper.getRenderSize(this));
286
+ this.$l.base = pb.textureSample(this.gbufferColorTex, this.uv);
287
+ this.$l.rm = pb.textureSample(this.gbufferRoughnessTex, this.uv);
288
+ this.$l.extraData = pb.textureSample(this.gbufferExtraTex, this.uv);
289
+ this.$l.litFlag = pb.float(pb.greaterThan(this.extraData.a, 0.5));
290
+ this.$l.n = pb.normalize(pb.sub(pb.mul(pb.textureSample(this.gbufferNormalTex, this.uv).xyz, 2), pb.vec3(1)));
291
+ this.$l.metallic = pb.clamp(this.rm.r, 0, 1);
292
+ this.$l.specularStrength = pb.clamp(this.rm.b, 0, 1);
293
+ this.$l.roughness = pb.clamp(this.rm.a, 0.045, 1);
294
+ this.$l.ndc = pb.sub(pb.mul(this.uv, 2), pb.vec2(1));
295
+ this.$l.xScale = pb.mul(this.cameraProj.x, this.cameraProj.y);
296
+ this.$l.yScale = this.cameraProj.x;
297
+ this.$l.camRayDir = pb.normalize(pb.add(this.cameraForward, pb.mul(this.cameraRight, pb.mul(this.ndc.x, this.xScale)), pb.mul(this.cameraUp, pb.mul(this.ndc.y, this.yScale))));
298
+ this.$l.linearDepthNormalized = this.zGetLinearDepth();
299
+ this.$l.linearDepth = pb.mul(pb.clamp(this.linearDepthNormalized, 0, 1), this.cameraNearFar.y);
300
+ this.$l.validMask = pb.float(pb.lessThan(this.linearDepthNormalized, 1));
301
+ this.$l.rayScale = pb.max(pb.dot(this.camRayDir, this.cameraForward), 1e-4);
302
+ this.$l.worldPos = pb.add(this.cameraPos, pb.mul(this.camRayDir, pb.div(this.linearDepth, this.rayScale)));
303
+ this.$l.viewDir = pb.neg(this.camRayDir);
304
+ this.$l.lightType = pb.int(this.light.extraParams.w);
305
+ this.$l.posRange = this.light.positionAndRange;
306
+ this.$l.dirCutoff = this.light.directionAndCutoff;
307
+ this.$l.lightColor = pb.mul(this.light.diffuseAndIntensity.rgb, this.light.diffuseAndIntensity.a);
308
+ this.$l.extra = this.light.extraParams;
309
+ this.$l.L = pb.vec3(0, 0, 1);
310
+ this.$l.atten = pb.float(1);
311
+ this.$l.outLight = pb.vec3(0);
312
+ this.$l.shadowTerm = pb.float(1);
313
+ this.$if(pb.or(pb.equal(this.lightType, LIGHT_TYPE_POINT), pb.equal(this.lightType, LIGHT_TYPE_SPOT)), function() {
314
+ this.$l.toLight = pb.sub(this.posRange.xyz, this.worldPos);
315
+ this.$l.dist = pb.length(this.toLight);
316
+ this.L = pb.div(this.toLight, pb.max(this.dist, 1e-4));
317
+ this.atten = this.zPointAtten(this.dist, this.posRange.w);
318
+ this.$if(pb.equal(this.lightType, LIGHT_TYPE_SPOT), function() {
319
+ this.atten = this.zSpotAtten(this.worldPos, this.posRange, this.dirCutoff, this.dist);
320
+ });
321
+ }).$else(function() {
322
+ // Directional and rect-light directional path.
323
+ this.L = pb.normalize(pb.neg(this.dirCutoff.xyz));
324
+ this.atten = 1;
325
+ });
326
+ this.$l.NoV = pb.clamp(pb.dot(this.n, this.viewDir), 0, 1);
327
+ this.$l.f0 = pb.mix(pb.mul(pb.vec3(0.04), this.specularStrength), this.base.rgb, this.metallic);
328
+ this.$if(pb.equal(this.lightType, LIGHT_TYPE_RECT), function() {
329
+ this.shadowTerm = pb.float(0);
330
+ this.zAccumulateRectShadowedLight(this.worldPos, this.base.rgb, this.metallic, this.roughness, this.specularStrength, this.n, this.viewDir, this.NoV, this.f0, this.posRange, this.dirCutoff, this.extra, this.light.diffuseAndIntensity, pb.mul(this.validMask, this.litFlag), this.outLight, this.shadowTerm);
331
+ }).$else(function() {
332
+ this.$l.NoL = pb.clamp(pb.dot(this.n, this.L), 0, 1);
333
+ this.$l.litMask = pb.mul(this.validMask, pb.float(pb.greaterThan(this.NoL, 1e-5)), this.litFlag);
334
+ // Keep shadow sampling in uniform control flow for WebGPU derivatives (dpdx/ddy in PCF).
335
+ this.$l.shadow = ShaderHelper.calculateShadow(this, this.worldPos, pb.max(this.NoL, 1e-5), ctx);
336
+ this.shadow = pb.mix(1, this.shadow, this.validMask);
337
+ this.$l.contactShadow = this.zContactShadow(this.worldPos, this.L, this.lightType, this.posRange);
338
+ this.shadow = pb.mul(this.shadow, this.contactShadow);
339
+ this.shadowTerm = pb.mul(this.shadow, this.litMask);
340
+ this.zAccumulatePunctualShadowedLight(this.base.rgb, this.metallic, this.roughness, this.specularStrength, this.n, this.viewDir, this.NoV, this.f0, this.lightColor, this.L, this.atten, this.shadow, this.litMask, this.$choice(pb.equal(this.lightType, LIGHT_TYPE_POINT), this.extra.x, pb.float(1)), this.$choice(pb.equal(this.lightType, LIGHT_TYPE_POINT), this.extra.y, pb.float(1)), this.outLight, this.shadowTerm);
341
+ });
342
+ this.$if(pb.notEqual(this.debugShadowTermOnly, 0), function() {
343
+ this.$outputs.color = pb.vec4(pb.vec3(this.shadowTerm), 1);
344
+ }).$else(function() {
345
+ this.$outputs.color = pb.vec4(this.outLight, 0);
346
+ });
347
+ });
348
+ }
349
+ });
350
+ if (!builtProgram) {
351
+ ctx.currentShadowLight = prevLight;
352
+ ctx.renderPass = prevRenderPass;
353
+ return;
354
+ }
355
+ program = builtProgram;
356
+ program.name = '@DeferredShadowLightPass';
357
+ DeferredShadowLightPass._programs[hash] = program;
358
+ }
359
+ let bindGroup = DeferredShadowLightPass._bindGroups[hash];
360
+ if (!bindGroup) {
361
+ bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);
362
+ DeferredShadowLightPass._bindGroups[hash] = bindGroup;
363
+ }
364
+ bindGroup.setTexture('gbufferColorTex', gbufferColor, fetchSampler('clamp_nearest_nomip'));
365
+ bindGroup.setTexture('gbufferRoughnessTex', gbufferRoughness, fetchSampler('clamp_nearest_nomip'));
366
+ bindGroup.setTexture('gbufferNormalTex', gbufferNormal, fetchSampler('clamp_nearest_nomip'));
367
+ bindGroup.setTexture('gbufferExtraTex', gbufferExtra, fetchSampler('clamp_nearest_nomip'));
368
+ bindGroup.setTexture('linearDepthTex', ctx.linearDepthTexture, fetchSampler('clamp_nearest_nomip'));
369
+ DeferredShadowLightPass.bindOptionalSceneTextures(bindGroup, program, ctx);
370
+ const cameraRight = ctx.camera.worldMatrix.getRow(0).xyz().inplaceNormalize();
371
+ const cameraUp = ctx.camera.worldMatrix.getRow(1).xyz().inplaceNormalize();
372
+ const cameraForward = ctx.camera.worldMatrix.getRow(2).xyz().inplaceNormalize().scaleBy(-1);
373
+ const cameraPos = ctx.camera.getWorldPosition();
374
+ bindGroup.setValue('cameraRight', new Float32Array([
375
+ cameraRight.x,
376
+ cameraRight.y,
377
+ cameraRight.z
378
+ ]));
379
+ bindGroup.setValue('cameraUp', new Float32Array([
380
+ cameraUp.x,
381
+ cameraUp.y,
382
+ cameraUp.z
383
+ ]));
384
+ bindGroup.setValue('cameraForward', new Float32Array([
385
+ cameraForward.x,
386
+ cameraForward.y,
387
+ cameraForward.z
388
+ ]));
389
+ bindGroup.setValue('cameraViewProjection', ctx.camera.viewProjectionMatrix);
390
+ bindGroup.setValue('cameraPos', new Float32Array([
391
+ cameraPos.x,
392
+ cameraPos.y,
393
+ cameraPos.z
394
+ ]));
395
+ bindGroup.setValue('cameraProj', new Float32Array([
396
+ ctx.camera.getTanHalfFovy(),
397
+ ctx.camera.getAspect()
398
+ ]));
399
+ bindGroup.setValue('cameraNearFar', new Float32Array([
400
+ ctx.camera.getNearPlane(),
401
+ ctx.camera.getFarPlane()
402
+ ]));
403
+ bindGroup.setValue('debugShadowTermOnly', debugShadowTermOnly ? 1 : 0);
404
+ bindGroup.setValue('camera', DeferredShadowLightPass.getCameraUniforms(ctx));
405
+ ShaderHelper.setLightUniformsShadow(bindGroup, ctx, light);
406
+ if (!DeferredShadowLightPass._additiveRenderStates) {
407
+ DeferredShadowLightPass._additiveRenderStates = device.createRenderStateSet();
408
+ DeferredShadowLightPass._additiveRenderStates.useDepthState().enableTest(false).enableWrite(false);
409
+ DeferredShadowLightPass._additiveRenderStates.useRasterizerState().setCullMode('none');
410
+ DeferredShadowLightPass._additiveRenderStates.useBlendingState().enable(true).setBlendEquation('add', 'add').setBlendFuncRGB('one', 'one').setBlendFuncAlpha('zero', 'one');
411
+ }
412
+ if (!DeferredShadowLightPass._multiplyRenderStates) {
413
+ DeferredShadowLightPass._multiplyRenderStates = device.createRenderStateSet();
414
+ DeferredShadowLightPass._multiplyRenderStates.useDepthState().enableTest(false).enableWrite(false);
415
+ DeferredShadowLightPass._multiplyRenderStates.useRasterizerState().setCullMode('none');
416
+ DeferredShadowLightPass._multiplyRenderStates.useBlendingState().enable(true).setBlendEquation('add', 'add').setBlendFuncRGB('zero', 'src-color').setBlendFuncAlpha('zero', 'one');
417
+ }
418
+ const renderStates = debugShadowTermOnly ? DeferredShadowLightPass._multiplyRenderStates : DeferredShadowLightPass._additiveRenderStates;
419
+ device.setProgram(program);
420
+ device.setBindGroup(0, bindGroup);
421
+ drawFullscreenQuad(renderStates);
422
+ ctx.currentShadowLight = prevLight;
423
+ ctx.renderPass = prevRenderPass;
424
+ }
425
+ }
426
+
427
+ export { DeferredShadowLightPass };
428
+ //# sourceMappingURL=deferredshadowlightpass.js.map