@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.
- package/dist/animation/joint_dynamics/collision.js +1 -7
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +2 -17
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +2 -20
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +14 -60
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +3 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/app/app.js +23 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/scriptregistry.js +16 -53
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +22 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +3 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +3 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/camera/camera.js +398 -45
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +69 -2
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9100 -8712
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +3 -3
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +8 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +17 -10
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -11
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js +44 -12
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +149 -14
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +7 -4
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +5 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +186 -11
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +2 -2
- package/dist/material/skin.js.map +1 -1
- package/dist/material/terrain-cm.js +5 -5
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/water.js +6 -4
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +54 -4
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +41 -0
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/posteffect.js +51 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +7 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +3 -3
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +1196 -0
- package/dist/posteffect/ssgi.js.map +1 -0
- package/dist/posteffect/ssr.js +83 -45
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +137 -49
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +5 -4
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +15 -3
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +12 -6
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable_mixin.js +8 -5
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +10 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +298 -5
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gpu_picking.js +7 -5
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +28 -19
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +18 -4
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +37 -4
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +8 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +20 -48
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +18 -58
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +89 -115
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
- package/dist/render/rendergraph/history_resource_manager.js +74 -140
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +7 -5
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/render_context.js +19 -0
- package/dist/render/rendergraph/render_context.js.map +1 -0
- package/dist/render/rendergraph/render_pipeline.js +315 -0
- package/dist/render/rendergraph/render_pipeline.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +158 -141
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +267 -0
- package/dist/render/rendergraph/scene_render_context.js.map +1 -0
- package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
- package/dist/render/rendergraph/types.js +19 -31
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +3 -3
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +10 -6
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +197 -35
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +4 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +2 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +10 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +61 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +178 -10
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/meshdrawable.js +89 -2
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +2 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +2 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +2 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +34 -1
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +2 -1
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +2 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +2 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +5 -4
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +10 -3
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/shadow.js +96 -29
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +322 -154
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/esm.js +13 -8
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -12
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -12
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +17 -11
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +20 -2
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +10 -3
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +16 -13
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +10 -8
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/physical.js +74 -0
- package/dist/utility/physical.js.map +1 -0
- package/dist/utility/rendermipmap.js +2 -2
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +3 -1
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +3 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +598 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +180 -9
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +43 -3
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +3 -1
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +3 -1
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +3 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +2 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +70 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +3 -1
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +3 -1
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +3 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +2 -3
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
package/dist/shadow/ssm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssm.js","sources":["../../src/shadow/ssm.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport { computeShadowMapDepth } from '../shaders/shadow';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport class SSM extends ShadowImpl {\r\n static instance = new SSM();\r\n constructor() {\r\n super();\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n getType() {\r\n return 'hard' as const;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return 0;\r\n }\r\n getParams() {}\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return (\r\n this.useNativeShadowMap(shadowMapParams)\r\n ? shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()\r\n : shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0]\r\n ) as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler =\r\n shadowMapParams.shadowMap?.getDefaultSampler(this.useNativeShadowMap(shadowMapParams)) || null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return 1;\r\n }\r\n setDepthScale(_val: number) {}\r\n getShaderHash() {\r\n return '';\r\n }\r\n getShadowMapColorFormat(shadowMapParams: ShadowMapParams) {\r\n if (this.useNativeShadowMap(shadowMapParams)) {\r\n return null;\r\n } else {\r\n const device = getDevice();\r\n if (device.type === 'webgl') {\r\n return device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'rgba32f'\r\n : device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n } else {\r\n return 'r32f';\r\n }\r\n }\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return getDevice().type === 'webgl' ? 'd24s8' : 'd32f';\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.shadowCoord = pb.div(this.shadowVertex.xyz, this.shadowVertex.w);\r\n this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord.xyz, 0.5), 0.5);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n pb.lessThanEqual(this.shadowCoord.z, 1)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.shadow = pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.split,\r\n this.shadowCoord.z\r\n );\r\n } else {\r\n this.shadow = pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.shadowCoord.z\r\n );\r\n }\r\n } else {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$l.shadowTex = pb.textureArraySampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n 0\r\n );\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.shadow = pb.step(this.shadowCoord.z, this.shadowTex.x);\r\n }\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.$l.maxZ = pb.max(pb.max(pb.abs(this.dir.x), pb.abs(this.dir.y)), pb.abs(this.dir.z));\r\n this.$l.distance = ShaderHelper.linearDepthToNonLinear(this, this.maxZ, this.nearFar);\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n pb.div(this.maxZ, ShaderHelper.getLightPositionAndRangeForShadow(this).w),\r\n this.NdotL,\r\n true\r\n );\r\n this.$return(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.dir,\r\n pb.sub(this.distance, this.shadowBias)\r\n )\r\n );\r\n } else {\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.dir, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.distance = pb.sub(this.distance, this.shadowBias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n } else {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex.xyz, this.shadowVertex.w);\r\n this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord.xyz, 0.5), 0.5);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n pb.lessThanEqual(this.shadowCoord.z, 1)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n this.shadow = pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.shadowCoord.z\r\n );\r\n } else {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n this.$l.shadowTex = pb.textureSampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n 0\r\n );\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.shadow = pb.step(this.shadowCoord.z, this.shadowTex.x);\r\n }\r\n });\r\n this.$return(this.shadow);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return getDevice().type !== 'webgl';\r\n }\r\n}\r\n"],"names":["SSM","ShadowImpl","instance","resourceDirty","getType","getShadowMapBorder","_shadowMapParams","getParams","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","device","getDevice","type","getDeviceCaps","textureCaps","supportFloatColorBuffer","supportHalfFloatColorBuffer","getShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","floatDepthTexture","$l","shadowCoord","div","xyz","w","add","mul","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","z","shadow","$if","shadowBias","computeShadowBiasCSM","sub","isTexture2DArray","textureArraySampleCompareLevel","ShaderHelper","xy","textureSampleCompareLevel","shadowTex","textureArraySampleLevel","textureSampleLevel","decodeNormalizedFloatFromRGBA","step","$return","getGlobalScope","computeShadow","funcNameComputeShadow","lightType","LIGHT_TYPE_POINT","dir","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","maxZ","max","abs","distance","linearDepthToNonLinear","computeShadowBias","length","LIGHT_TYPE_SPOT","nonLinearDepthToLinearNormalized"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ssm.js","sources":["../../src/shadow/ssm.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n ndcToShadowCoord3,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport { REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class SSM extends ShadowImpl {\r\n static instance = new SSM();\r\n constructor() {\r\n super();\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n getType() {\r\n return 'hard' as const;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return 0;\r\n }\r\n getParams(out?: Vector4) {\r\n return out ?? Vector4.zero();\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return (\r\n this.useNativeShadowMap(shadowMapParams)\r\n ? shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()\r\n : shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0]\r\n ) as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler =\r\n shadowMapParams.shadowMap?.getDefaultSampler(this.useNativeShadowMap(shadowMapParams)) || null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return 1;\r\n }\r\n setDepthScale(_val: number) {}\r\n getShaderHash() {\r\n return '';\r\n }\r\n getShadowMapColorFormat(shadowMapParams: ShadowMapParams) {\r\n if (this.useNativeShadowMap(shadowMapParams)) {\r\n return null;\r\n } else {\r\n const device = getDevice();\r\n if (device.type === 'webgl') {\r\n return device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'rgba32f'\r\n : device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n } else {\r\n return 'r32f';\r\n }\r\n }\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return this.preferredShadowMapDepthFormat();\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.shadowCoord = pb.div(this.shadowVertex.xyz, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord3(this, this.shadowCoord.xyz);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.shadow = pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.split,\r\n this.shadowCoord.z\r\n );\r\n } else {\r\n this.shadow = pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.shadowCoord.z\r\n );\r\n }\r\n } else {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$l.shadowTex = pb.textureArraySampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n 0\r\n );\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.shadow = REVERSE_Z\r\n ? pb.step(this.shadowTex.x, this.shadowCoord.z)\r\n : pb.step(this.shadowCoord.z, this.shadowTex.x);\r\n }\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.$l.maxZ = pb.max(pb.max(pb.abs(this.dir.x), pb.abs(this.dir.y)), pb.abs(this.dir.z));\r\n this.$l.distance = ShaderHelper.linearDepthToNonLinear(this, this.maxZ, this.nearFar);\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n pb.div(this.maxZ, ShaderHelper.getLightPositionAndRangeForShadow(this).w),\r\n this.NdotL,\r\n true\r\n );\r\n this.$return(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.dir,\r\n applyShadowDepthBias(this, this.distance, this.shadowBias, true)\r\n )\r\n );\r\n } else {\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.dir, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.distance = pb.sub(this.distance, this.shadowBias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n } else {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex.xyz, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord3(this, this.shadowCoord.xyz);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n this.shadowCoord.z\r\n );\r\n } else {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = applyShadowDepthBias(\r\n this,\r\n this.shadowCoord.z,\r\n this.shadowBias,\r\n shadowMapParams.lightType !== LIGHT_TYPE_SPOT\r\n );\r\n this.$l.shadowTex = pb.textureSampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.shadowCoord.xy,\r\n 0\r\n );\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.shadow =\r\n REVERSE_Z && shadowMapParams.lightType !== LIGHT_TYPE_SPOT\r\n ? pb.step(this.shadowTex.x, this.shadowCoord.z)\r\n : pb.step(this.shadowCoord.z, this.shadowTex.x);\r\n }\r\n });\r\n this.$return(this.shadow);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return getDevice().type !== 'webgl';\r\n }\r\n}\r\n"],"names":["SSM","ShadowImpl","instance","resourceDirty","getType","getShadowMapBorder","_shadowMapParams","getParams","out","Vector4","zero","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","device","getDevice","type","getDeviceCaps","textureCaps","supportFloatColorBuffer","supportHalfFloatColorBuffer","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","floatDepthTexture","$l","shadowCoord","div","xyz","w","ndcToShadowCoord3","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","isTexture2DArray","textureArraySampleCompareLevel","ShaderHelper","xy","textureSampleCompareLevel","shadowTex","textureArraySampleLevel","textureSampleLevel","decodeNormalizedFloatFromRGBA","REVERSE_Z","step","$return","getGlobalScope","computeShadow","funcNameComputeShadow","lightType","LIGHT_TYPE_POINT","dir","sub","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","maxZ","max","abs","distance","linearDepthToNonLinear","computeShadowBias","length","LIGHT_TYPE_SPOT","nonLinearDepthToLinearNormalized"],"mappings":"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"}
|
package/dist/shadow/vsm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ShadowImpl } from './shadow_impl.js';
|
|
2
2
|
import { Blitter } from '../blitter/blitter.js';
|
|
3
3
|
import { decodeNormalizedFloatFromRGBA, decode2HalfFromRGBA, encode2HalfToRGBA } from '../shaders/misc.js';
|
|
4
|
-
import { computeShadowMapDepth, filterShadowVSM } from '../shaders/shadow.js';
|
|
4
|
+
import { computeShadowMapDepth, ndcToShadowCoord, shadowCoordDepthInRange, applyShadowDepthBias, filterShadowVSM } from '../shaders/shadow.js';
|
|
5
5
|
import { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values.js';
|
|
6
6
|
import { ShaderHelper } from '../material/shader/helper.js';
|
|
7
7
|
import { computeShadowBiasCSM, computeShadowBias } from './shader.js';
|
|
@@ -247,7 +247,9 @@ class VSMBlitter extends Blitter {
|
|
|
247
247
|
getShaderHash() {
|
|
248
248
|
return '';
|
|
249
249
|
}
|
|
250
|
-
getParams() {
|
|
250
|
+
getParams(out) {
|
|
251
|
+
return out ?? Vector4.zero();
|
|
252
|
+
}
|
|
251
253
|
getShadowMapColorFormat(_shadowMapParams) {
|
|
252
254
|
const device = getDevice();
|
|
253
255
|
return device.getDeviceCaps().textureCaps.supportFloatColorBuffer && device.getDeviceCaps().textureCaps.supportLinearFloatTexture ? 'rgba32f' : device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer && device.getDeviceCaps().textureCaps.supportLinearHalfFloatTexture ? 'rgba16f' : 'rgba8unorm';
|
|
@@ -269,12 +271,12 @@ class VSMBlitter extends Blitter {
|
|
|
269
271
|
pb.int('split')
|
|
270
272
|
], function() {
|
|
271
273
|
this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
|
|
272
|
-
this.$l.shadowCoord =
|
|
273
|
-
this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))),
|
|
274
|
+
this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
|
|
275
|
+
this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), shadowCoordDepthInRange(this, this.shadowCoord.z)));
|
|
274
276
|
this.$l.shadow = pb.float(1);
|
|
275
277
|
this.$if(this.inShadow, function() {
|
|
276
278
|
this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);
|
|
277
|
-
this.shadowCoord.z =
|
|
279
|
+
this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);
|
|
278
280
|
this.shadow = filterShadowVSM(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord, this.split);
|
|
279
281
|
});
|
|
280
282
|
this.$return(this.shadow);
|
|
@@ -296,8 +298,8 @@ class VSMBlitter extends Blitter {
|
|
|
296
298
|
this.$return(filterShadowVSM(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.coord));
|
|
297
299
|
} else {
|
|
298
300
|
this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
|
|
299
|
-
this.$l.shadowCoord =
|
|
300
|
-
this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))),
|
|
301
|
+
this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
|
|
302
|
+
this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), shadowCoordDepthInRange(this, this.shadowCoord.z)));
|
|
301
303
|
this.$l.shadow = pb.float(1);
|
|
302
304
|
this.$if(this.inShadow, function() {
|
|
303
305
|
if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {
|
|
@@ -307,7 +309,7 @@ class VSMBlitter extends Blitter {
|
|
|
307
309
|
} else {
|
|
308
310
|
this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.shadowCoord.z, this.NdotL, false);
|
|
309
311
|
}
|
|
310
|
-
this.shadowCoord.z =
|
|
312
|
+
this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, shadowMapParams.lightType !== LIGHT_TYPE_SPOT);
|
|
311
313
|
this.shadow = filterShadowVSM(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord);
|
|
312
314
|
});
|
|
313
315
|
this.$return(this.shadow);
|
package/dist/shadow/vsm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vsm.js","sources":["../../src/shadow/vsm.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n TextureFormat,\r\n PBShaderExp,\r\n PBInsideFunctionScope,\r\n PBGlobalScope,\r\n FrameBuffer\r\n} from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport type { BlitType } from '../blitter';\r\nimport { Blitter } from '../blitter';\r\nimport { computeShadowMapDepth, filterShadowVSM } from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { decode2HalfFromRGBA, decodeNormalizedFloatFromRGBA, encode2HalfToRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport { Vector4, type Nullable } from '@zephyr3d/base';\r\n\r\ntype VSMImplData = {\r\n blurFramebuffer: FrameBuffer;\r\n blurFramebuffer2: FrameBuffer;\r\n};\r\n\r\nclass VSMBlitter extends Blitter {\r\n protected _phase: 'horizonal' | 'vertical';\r\n protected _packFloat: boolean;\r\n protected _blurSize: number;\r\n protected _kernelSize: number;\r\n constructor(phase: 'horizonal' | 'vertical', kernelSize: number, blurSize: number, packFloat: boolean) {\r\n super();\r\n this._phase = phase;\r\n this._blurSize = blurSize;\r\n this._kernelSize = kernelSize;\r\n this._packFloat = packFloat;\r\n }\r\n get blurSize() {\r\n return this._blurSize;\r\n }\r\n set blurSize(val) {\r\n this._blurSize = val;\r\n }\r\n get kernelSize() {\r\n return this._kernelSize;\r\n }\r\n set kernelSize(val) {\r\n if (val !== this._kernelSize) {\r\n this._kernelSize = val;\r\n this.invalidateHash();\r\n }\r\n }\r\n get packFloat() {\r\n return this._packFloat;\r\n }\r\n set packFloat(b) {\r\n if (this._packFloat !== !!b) {\r\n this._packFloat = !!b;\r\n this.invalidateHash();\r\n }\r\n }\r\n setup(scope: PBGlobalScope, type: BlitType) {\r\n const pb = scope.$builder;\r\n if (pb.shaderKind === 'fragment') {\r\n scope.blurSize = pb.float().uniform(0);\r\n scope.blurMultiplyVec =\r\n type === 'cube'\r\n ? this._phase === 'horizonal'\r\n ? pb.vec3(1, 0, 0)\r\n : pb.vec3(0, 1, 0)\r\n : this._phase === 'horizonal'\r\n ? pb.vec2(1, 0)\r\n : pb.vec2(0, 1);\r\n scope.numBlurPixelsPerSide = pb.float((this._kernelSize + 1) / 2);\r\n scope.blurStep = pb.float(2 / (this._kernelSize - 1));\r\n }\r\n }\r\n setUniforms(bindGroup: BindGroup) {\r\n bindGroup.setValue('blurSize', this._blurSize);\r\n }\r\n readTexel(\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 pb = scope.$builder;\r\n const texel = super.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n if (this._packFloat) {\r\n if (this._phase === 'horizonal') {\r\n return pb.vec4(decodeNormalizedFloatFromRGBA(scope, texel));\r\n } else {\r\n return pb.vec4(decode2HalfFromRGBA(scope, texel), 0, 0);\r\n }\r\n } else {\r\n return texel;\r\n }\r\n }\r\n writeTexel(scope: PBInsideFunctionScope, type: BlitType, srcUV: PBShaderExp, texel: PBShaderExp) {\r\n const outTexel = super.writeTexel(scope, type, srcUV, texel);\r\n if (this._packFloat) {\r\n return encode2HalfToRGBA(scope, outTexel.x, outTexel.y);\r\n } else {\r\n return outTexel;\r\n }\r\n }\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: 'int' | 'float' | 'uint'\r\n ) {\r\n const that = this;\r\n const pb = scope.$builder;\r\n scope.d0 = that.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n if (that._packFloat) {\r\n scope.moment1 = scope.d0.x;\r\n scope.moment2 = that._phase === 'horizonal' ? pb.mul(scope.d0.x, scope.d0.x) : scope.d0.y;\r\n } else {\r\n scope.moment1 = that._phase === 'horizonal' ? pb.mul(scope.d0.x, scope.d0.z) : scope.d0.x;\r\n scope.moment2 = that._phase === 'horizonal' ? pb.mul(scope.d0.y, scope.d0.z) : scope.d0.y;\r\n scope.coverage = scope.d0.z;\r\n }\r\n scope.$for(pb.float('i'), 1, scope.numBlurPixelsPerSide, function () {\r\n this.$l.blurOffset = pb.mul(this.blurMultiplyVec, this.blurSize, this.blurStep, this.i);\r\n this.d1 = that.readTexel(this, type, srcTex, pb.sub(srcUV, this.blurOffset), srcLayer, sampleType);\r\n this.d2 = that.readTexel(this, type, srcTex, pb.add(srcUV, this.blurOffset), srcLayer, sampleType);\r\n if (that._packFloat) {\r\n this.moment1 = pb.add(this.moment1, this.d1.x);\r\n this.moment1 = pb.add(this.moment1, this.d2.x);\r\n if (that._phase === 'horizonal') {\r\n this.moment2 = pb.add(this.moment2, pb.mul(this.d1.x, this.d1.x));\r\n this.moment2 = pb.add(this.moment2, pb.mul(this.d2.x, this.d2.x));\r\n } else {\r\n this.moment2 = pb.add(this.moment2, this.d1.y);\r\n this.moment2 = pb.add(this.moment2, this.d2.y);\r\n }\r\n } else {\r\n this.moment1 = pb.add(\r\n this.moment1,\r\n that._phase === 'horizonal' ? pb.mul(this.d1.x, this.d1.z) : this.d1.x\r\n );\r\n this.moment1 = pb.add(\r\n this.moment1,\r\n that._phase === 'horizonal' ? pb.mul(this.d2.x, this.d2.z) : this.d2.x\r\n );\r\n this.moment2 = pb.add(\r\n this.moment2,\r\n that._phase === 'horizonal' ? pb.mul(this.d1.y, this.d1.z) : this.d1.y\r\n );\r\n this.moment2 = pb.add(\r\n this.moment2,\r\n that._phase === 'horizonal' ? pb.mul(this.d2.y, this.d2.z) : this.d2.y\r\n );\r\n this.coverage = pb.add(this.coverage, this.d1.z);\r\n this.coverage = pb.add(this.coverage, this.d2.z);\r\n }\r\n });\r\n scope.moment1 = pb.div(scope.moment1, that._kernelSize);\r\n scope.moment2 = pb.div(scope.moment2, that._kernelSize);\r\n if (that._packFloat) {\r\n return pb.vec4(scope.moment1, scope.moment2, 0, 1);\r\n } else {\r\n scope.coverage = pb.div(scope.coverage, that._kernelSize);\r\n return pb.vec4(scope.moment1, scope.moment2, scope.coverage, 1);\r\n }\r\n }\r\n protected calcHash() {\r\n return `${this._phase}-${this._kernelSize}-${Number(this._packFloat)}`;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class VSM extends ShadowImpl {\r\n /** @internal */\r\n protected _blur: boolean;\r\n /** @internal */\r\n protected _kernelSize: number;\r\n /** @internal */\r\n protected _blurSize: number;\r\n /** @internal */\r\n protected _blitterH: VSMBlitter;\r\n /** @internal */\r\n protected _blitterV: VSMBlitter;\r\n /** @internal */\r\n protected _mipmap: boolean;\r\n /** @internal */\r\n protected _darkness: number;\r\n constructor(kernelSize?: number, blurSize?: number, darkness?: number) {\r\n super();\r\n this._blur = true;\r\n this._kernelSize = kernelSize ?? 5;\r\n this._blurSize = blurSize ?? 1;\r\n this._darkness = darkness ?? 0;\r\n this._mipmap = true;\r\n this._blitterH = new VSMBlitter('horizonal', this._kernelSize, 1 / 1024, false);\r\n this._blitterV = new VSMBlitter('vertical', this._kernelSize, 1 / 1024, false);\r\n }\r\n resourceDirty() {\r\n return this._resourceDirty;\r\n }\r\n get blur() {\r\n return this._blur;\r\n }\r\n set blur(val) {\r\n if (this._blur !== !!val) {\r\n this._blur = !!val;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n get mipmap() {\r\n return this._mipmap;\r\n }\r\n set mipmap(b) {\r\n if (this._mipmap !== !!b) {\r\n this._mipmap = !!b;\r\n if (this._blur) {\r\n this._resourceDirty = true;\r\n }\r\n }\r\n }\r\n get kernelSize() {\r\n return this._kernelSize;\r\n }\r\n set kernelSize(val) {\r\n this._kernelSize = val;\r\n }\r\n get blurSize() {\r\n return this._blurSize;\r\n }\r\n set blurSize(val) {\r\n this._blurSize = val;\r\n }\r\n getDepthScale() {\r\n return this._darkness;\r\n }\r\n setDepthScale(val: number) {\r\n this._darkness = val;\r\n }\r\n getType() {\r\n return 'vsm' as const;\r\n }\r\n getShadowMapClearColor(_shadowMapParams: ShadowMapParams) {\r\n return new Vector4(0, 0, 0, 1);\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._blur ? Math.ceil(this._blurSize) + 1 : 0;\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n const implData = shadowMapParams.implData as VSMImplData;\r\n return (\r\n implData\r\n ? implData.blurFramebuffer2.getColorAttachments()[0]\r\n : shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0]\r\n ) as ShadowMapType;\r\n }\r\n /** @internal */\r\n fetchTemporalFramebuffer(\r\n autoRelease: boolean,\r\n lightType: number,\r\n numCascades: number,\r\n width: number,\r\n height: number,\r\n colorFormat: TextureFormat,\r\n depthFormat: Nullable<TextureFormat>,\r\n mipmapping?: boolean\r\n ) {\r\n const device = getDevice();\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [\r\n device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n colorFormat,\r\n width,\r\n height,\r\n numCascades,\r\n mipmapping\r\n )\r\n ]\r\n : lightType === LIGHT_TYPE_POINT\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, width, mipmapping)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, width, height, mipmapping)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, width, height, numCascades, false)\r\n : device.type !== 'webgl' && lightType === LIGHT_TYPE_POINT\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, width, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, width, height, false)\r\n : null;\r\n const fb = device.pool.createTemporalFramebuffer(autoRelease, colorAttachments!, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n const colorFormat = this.getShadowMapColorFormat(shadowMapParams)!;\r\n //const target = shadowMapParams.shadowMapFramebuffer.getColorAttachments()[0].target;\r\n const shadowMapWidth = shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0].width;\r\n const shadowMapHeight = shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0].height;\r\n if (this._blur) {\r\n shadowMapParams.implData = {\r\n blurFramebuffer: this.fetchTemporalFramebuffer(\r\n true,\r\n shadowMapParams.lightType,\r\n shadowMapParams.numShadowCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat,\r\n null,\r\n false\r\n ),\r\n blurFramebuffer2: this.fetchTemporalFramebuffer(\r\n true,\r\n shadowMapParams.lightType,\r\n shadowMapParams.numShadowCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat,\r\n null,\r\n this._mipmap\r\n )\r\n };\r\n }\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(false) ?? null;\r\n }\r\n postRenderShadowMap(shadowMapParams: ShadowMapParams) {\r\n if (this._blur) {\r\n const implData = shadowMapParams.implData as VSMImplData;\r\n this._blitterH.blurSize = this._blurSize / shadowMapParams.shadowMap!.width;\r\n this._blitterH.kernelSize = this._kernelSize;\r\n this._blitterH.packFloat = shadowMapParams.shadowMap!.format === 'rgba8unorm';\r\n this._blitterV.blurSize = this._blurSize / shadowMapParams.shadowMap!.height;\r\n this._blitterV.kernelSize = this._kernelSize;\r\n this._blitterV.packFloat = shadowMapParams.shadowMap!.format === 'rgba8unorm';\r\n this._blitterH.blit(\r\n shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0] as any,\r\n implData.blurFramebuffer\r\n );\r\n this._blitterV.blit(\r\n implData.blurFramebuffer.getColorAttachments()[0] as any,\r\n implData.blurFramebuffer2\r\n );\r\n }\r\n }\r\n getShaderHash() {\r\n return '';\r\n }\r\n getParams() {}\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams) {\r\n const device = getDevice();\r\n return device.getDeviceCaps().textureCaps.supportFloatColorBuffer &&\r\n device.getDeviceCaps().textureCaps.supportLinearFloatTexture\r\n ? 'rgba32f'\r\n : device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer &&\r\n device.getDeviceCaps().textureCaps.supportLinearHalfFloatTexture\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return 'd24s8' as const;\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const depth = computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n return shadowMapParams.shadowMap!.format === 'rgba8unorm'\r\n ? depth\r\n : pb.vec4(depth.x, pb.mul(depth.x, depth.x), 1, 1);\r\n }\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n pb.lessThanEqual(this.shadowCoord.z, 1)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n this.shadow = filterShadowVSM(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.split\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.coord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));\r\n this.$return(\r\n filterShadowVSM(this, shadowMapParams.lightType, shadowMapParams.shadowMap!.format, this.coord)\r\n );\r\n } else {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n pb.lessThanEqual(this.shadowCoord.z, 1)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n this.shadow = filterShadowVSM(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return false;\r\n }\r\n}\r\n"],"names":["VSMBlitter","Blitter","_phase","_packFloat","_blurSize","_kernelSize","phase","kernelSize","blurSize","packFloat","val","invalidateHash","b","setup","scope","type","pb","$builder","shaderKind","float","uniform","blurMultiplyVec","vec3","vec2","numBlurPixelsPerSide","blurStep","setUniforms","bindGroup","setValue","readTexel","srcTex","srcUV","srcLayer","sampleType","texel","vec4","decodeNormalizedFloatFromRGBA","decode2HalfFromRGBA","writeTexel","outTexel","encode2HalfToRGBA","x","y","filter","that","d0","moment1","moment2","mul","z","coverage","$for","$l","blurOffset","i","d1","sub","d2","add","div","calcHash","Number","VSM","ShadowImpl","darkness","_blur","_darkness","_mipmap","_blitterH","_blitterV","resourceDirty","_resourceDirty","blur","mipmap","getDepthScale","setDepthScale","getType","getShadowMapClearColor","_shadowMapParams","Vector4","getShadowMapBorder","Math","ceil","getShadowMap","shadowMapParams","implData","blurFramebuffer2","getColorAttachments","shadowMapFramebuffer","fetchTemporalFramebuffer","autoRelease","lightType","numCascades","width","height","colorFormat","depthFormat","mipmapping","device","getDevice","useTextureArray","colorAttachments","pool","fetchTemporalTexture2DArray","LIGHT_TYPE_POINT","fetchTemporalTextureCube","fetchTemporalTexture2D","depthAttachment","fb","createTemporalFramebuffer","releaseTexture","doUpdateResources","getShadowMapColorFormat","shadowMapWidth","shadowMapHeight","blurFramebuffer","numShadowCascades","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","format","blit","getShaderHash","getParams","getDeviceCaps","textureCaps","supportFloatColorBuffer","supportLinearFloatTexture","supportHalfFloatColorBuffer","supportLinearHalfFloatTexture","getShadowMapDepthFormat","computeShadowMapDepth","worldPos","depth","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","func","int","shadowCoord","w","inShadow","all","bvec2","bvec4","greaterThanEqual","lessThanEqual","shadow","$if","shadowBias","computeShadowBiasCSM","filterShadowVSM","$return","getGlobalScope","computeShadow","funcNameComputeShadow","dir","xyz","ShaderHelper","getLightPositionAndRangeForShadow","distance","length","computeShadowBias","coord","LIGHT_TYPE_SPOT","nearFar","getShadowCameraParams","xy","nonLinearDepthToLinearNormalized","useNativeShadowMap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vsm.js","sources":["../../src/shadow/vsm.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n TextureFormat,\r\n PBShaderExp,\r\n PBInsideFunctionScope,\r\n PBGlobalScope,\r\n FrameBuffer\r\n} from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport type { BlitType } from '../blitter';\r\nimport { Blitter } from '../blitter';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowVSM,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { decode2HalfFromRGBA, decodeNormalizedFloatFromRGBA, encode2HalfToRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport { Vector4, type Nullable } from '@zephyr3d/base';\r\n\r\ntype VSMImplData = {\r\n blurFramebuffer: FrameBuffer;\r\n blurFramebuffer2: FrameBuffer;\r\n};\r\n\r\nclass VSMBlitter extends Blitter {\r\n protected _phase: 'horizonal' | 'vertical';\r\n protected _packFloat: boolean;\r\n protected _blurSize: number;\r\n protected _kernelSize: number;\r\n constructor(phase: 'horizonal' | 'vertical', kernelSize: number, blurSize: number, packFloat: boolean) {\r\n super();\r\n this._phase = phase;\r\n this._blurSize = blurSize;\r\n this._kernelSize = kernelSize;\r\n this._packFloat = packFloat;\r\n }\r\n get blurSize() {\r\n return this._blurSize;\r\n }\r\n set blurSize(val) {\r\n this._blurSize = val;\r\n }\r\n get kernelSize() {\r\n return this._kernelSize;\r\n }\r\n set kernelSize(val) {\r\n if (val !== this._kernelSize) {\r\n this._kernelSize = val;\r\n this.invalidateHash();\r\n }\r\n }\r\n get packFloat() {\r\n return this._packFloat;\r\n }\r\n set packFloat(b) {\r\n if (this._packFloat !== !!b) {\r\n this._packFloat = !!b;\r\n this.invalidateHash();\r\n }\r\n }\r\n setup(scope: PBGlobalScope, type: BlitType) {\r\n const pb = scope.$builder;\r\n if (pb.shaderKind === 'fragment') {\r\n scope.blurSize = pb.float().uniform(0);\r\n scope.blurMultiplyVec =\r\n type === 'cube'\r\n ? this._phase === 'horizonal'\r\n ? pb.vec3(1, 0, 0)\r\n : pb.vec3(0, 1, 0)\r\n : this._phase === 'horizonal'\r\n ? pb.vec2(1, 0)\r\n : pb.vec2(0, 1);\r\n scope.numBlurPixelsPerSide = pb.float((this._kernelSize + 1) / 2);\r\n scope.blurStep = pb.float(2 / (this._kernelSize - 1));\r\n }\r\n }\r\n setUniforms(bindGroup: BindGroup) {\r\n bindGroup.setValue('blurSize', this._blurSize);\r\n }\r\n readTexel(\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 pb = scope.$builder;\r\n const texel = super.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n if (this._packFloat) {\r\n if (this._phase === 'horizonal') {\r\n return pb.vec4(decodeNormalizedFloatFromRGBA(scope, texel));\r\n } else {\r\n return pb.vec4(decode2HalfFromRGBA(scope, texel), 0, 0);\r\n }\r\n } else {\r\n return texel;\r\n }\r\n }\r\n writeTexel(scope: PBInsideFunctionScope, type: BlitType, srcUV: PBShaderExp, texel: PBShaderExp) {\r\n const outTexel = super.writeTexel(scope, type, srcUV, texel);\r\n if (this._packFloat) {\r\n return encode2HalfToRGBA(scope, outTexel.x, outTexel.y);\r\n } else {\r\n return outTexel;\r\n }\r\n }\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: 'int' | 'float' | 'uint'\r\n ) {\r\n const that = this;\r\n const pb = scope.$builder;\r\n scope.d0 = that.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n if (that._packFloat) {\r\n scope.moment1 = scope.d0.x;\r\n scope.moment2 = that._phase === 'horizonal' ? pb.mul(scope.d0.x, scope.d0.x) : scope.d0.y;\r\n } else {\r\n scope.moment1 = that._phase === 'horizonal' ? pb.mul(scope.d0.x, scope.d0.z) : scope.d0.x;\r\n scope.moment2 = that._phase === 'horizonal' ? pb.mul(scope.d0.y, scope.d0.z) : scope.d0.y;\r\n scope.coverage = scope.d0.z;\r\n }\r\n scope.$for(pb.float('i'), 1, scope.numBlurPixelsPerSide, function () {\r\n this.$l.blurOffset = pb.mul(this.blurMultiplyVec, this.blurSize, this.blurStep, this.i);\r\n this.d1 = that.readTexel(this, type, srcTex, pb.sub(srcUV, this.blurOffset), srcLayer, sampleType);\r\n this.d2 = that.readTexel(this, type, srcTex, pb.add(srcUV, this.blurOffset), srcLayer, sampleType);\r\n if (that._packFloat) {\r\n this.moment1 = pb.add(this.moment1, this.d1.x);\r\n this.moment1 = pb.add(this.moment1, this.d2.x);\r\n if (that._phase === 'horizonal') {\r\n this.moment2 = pb.add(this.moment2, pb.mul(this.d1.x, this.d1.x));\r\n this.moment2 = pb.add(this.moment2, pb.mul(this.d2.x, this.d2.x));\r\n } else {\r\n this.moment2 = pb.add(this.moment2, this.d1.y);\r\n this.moment2 = pb.add(this.moment2, this.d2.y);\r\n }\r\n } else {\r\n this.moment1 = pb.add(\r\n this.moment1,\r\n that._phase === 'horizonal' ? pb.mul(this.d1.x, this.d1.z) : this.d1.x\r\n );\r\n this.moment1 = pb.add(\r\n this.moment1,\r\n that._phase === 'horizonal' ? pb.mul(this.d2.x, this.d2.z) : this.d2.x\r\n );\r\n this.moment2 = pb.add(\r\n this.moment2,\r\n that._phase === 'horizonal' ? pb.mul(this.d1.y, this.d1.z) : this.d1.y\r\n );\r\n this.moment2 = pb.add(\r\n this.moment2,\r\n that._phase === 'horizonal' ? pb.mul(this.d2.y, this.d2.z) : this.d2.y\r\n );\r\n this.coverage = pb.add(this.coverage, this.d1.z);\r\n this.coverage = pb.add(this.coverage, this.d2.z);\r\n }\r\n });\r\n scope.moment1 = pb.div(scope.moment1, that._kernelSize);\r\n scope.moment2 = pb.div(scope.moment2, that._kernelSize);\r\n if (that._packFloat) {\r\n return pb.vec4(scope.moment1, scope.moment2, 0, 1);\r\n } else {\r\n scope.coverage = pb.div(scope.coverage, that._kernelSize);\r\n return pb.vec4(scope.moment1, scope.moment2, scope.coverage, 1);\r\n }\r\n }\r\n protected calcHash() {\r\n return `${this._phase}-${this._kernelSize}-${Number(this._packFloat)}`;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class VSM extends ShadowImpl {\r\n /** @internal */\r\n protected _blur: boolean;\r\n /** @internal */\r\n protected _kernelSize: number;\r\n /** @internal */\r\n protected _blurSize: number;\r\n /** @internal */\r\n protected _blitterH: VSMBlitter;\r\n /** @internal */\r\n protected _blitterV: VSMBlitter;\r\n /** @internal */\r\n protected _mipmap: boolean;\r\n /** @internal */\r\n protected _darkness: number;\r\n constructor(kernelSize?: number, blurSize?: number, darkness?: number) {\r\n super();\r\n this._blur = true;\r\n this._kernelSize = kernelSize ?? 5;\r\n this._blurSize = blurSize ?? 1;\r\n this._darkness = darkness ?? 0;\r\n this._mipmap = true;\r\n this._blitterH = new VSMBlitter('horizonal', this._kernelSize, 1 / 1024, false);\r\n this._blitterV = new VSMBlitter('vertical', this._kernelSize, 1 / 1024, false);\r\n }\r\n resourceDirty() {\r\n return this._resourceDirty;\r\n }\r\n get blur() {\r\n return this._blur;\r\n }\r\n set blur(val) {\r\n if (this._blur !== !!val) {\r\n this._blur = !!val;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n get mipmap() {\r\n return this._mipmap;\r\n }\r\n set mipmap(b) {\r\n if (this._mipmap !== !!b) {\r\n this._mipmap = !!b;\r\n if (this._blur) {\r\n this._resourceDirty = true;\r\n }\r\n }\r\n }\r\n get kernelSize() {\r\n return this._kernelSize;\r\n }\r\n set kernelSize(val) {\r\n this._kernelSize = val;\r\n }\r\n get blurSize() {\r\n return this._blurSize;\r\n }\r\n set blurSize(val) {\r\n this._blurSize = val;\r\n }\r\n getDepthScale() {\r\n return this._darkness;\r\n }\r\n setDepthScale(val: number) {\r\n this._darkness = val;\r\n }\r\n getType() {\r\n return 'vsm' as const;\r\n }\r\n getShadowMapClearColor(_shadowMapParams: ShadowMapParams) {\r\n return new Vector4(0, 0, 0, 1);\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._blur ? Math.ceil(this._blurSize) + 1 : 0;\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n const implData = shadowMapParams.implData as VSMImplData;\r\n return (\r\n implData\r\n ? implData.blurFramebuffer2.getColorAttachments()[0]\r\n : shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0]\r\n ) as ShadowMapType;\r\n }\r\n /** @internal */\r\n fetchTemporalFramebuffer(\r\n autoRelease: boolean,\r\n lightType: number,\r\n numCascades: number,\r\n width: number,\r\n height: number,\r\n colorFormat: TextureFormat,\r\n depthFormat: Nullable<TextureFormat>,\r\n mipmapping?: boolean\r\n ) {\r\n const device = getDevice();\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [\r\n device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n colorFormat,\r\n width,\r\n height,\r\n numCascades,\r\n mipmapping\r\n )\r\n ]\r\n : lightType === LIGHT_TYPE_POINT\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, width, mipmapping)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, width, height, mipmapping)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, width, height, numCascades, false)\r\n : device.type !== 'webgl' && lightType === LIGHT_TYPE_POINT\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, width, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, width, height, false)\r\n : null;\r\n const fb = device.pool.createTemporalFramebuffer(autoRelease, colorAttachments!, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n const colorFormat = this.getShadowMapColorFormat(shadowMapParams)!;\r\n //const target = shadowMapParams.shadowMapFramebuffer.getColorAttachments()[0].target;\r\n const shadowMapWidth = shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0].width;\r\n const shadowMapHeight = shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0].height;\r\n if (this._blur) {\r\n shadowMapParams.implData = {\r\n blurFramebuffer: this.fetchTemporalFramebuffer(\r\n true,\r\n shadowMapParams.lightType,\r\n shadowMapParams.numShadowCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat,\r\n null,\r\n false\r\n ),\r\n blurFramebuffer2: this.fetchTemporalFramebuffer(\r\n true,\r\n shadowMapParams.lightType,\r\n shadowMapParams.numShadowCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat,\r\n null,\r\n this._mipmap\r\n )\r\n };\r\n }\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(false) ?? null;\r\n }\r\n postRenderShadowMap(shadowMapParams: ShadowMapParams) {\r\n if (this._blur) {\r\n const implData = shadowMapParams.implData as VSMImplData;\r\n this._blitterH.blurSize = this._blurSize / shadowMapParams.shadowMap!.width;\r\n this._blitterH.kernelSize = this._kernelSize;\r\n this._blitterH.packFloat = shadowMapParams.shadowMap!.format === 'rgba8unorm';\r\n this._blitterV.blurSize = this._blurSize / shadowMapParams.shadowMap!.height;\r\n this._blitterV.kernelSize = this._kernelSize;\r\n this._blitterV.packFloat = shadowMapParams.shadowMap!.format === 'rgba8unorm';\r\n this._blitterH.blit(\r\n shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0] as any,\r\n implData.blurFramebuffer\r\n );\r\n this._blitterV.blit(\r\n implData.blurFramebuffer.getColorAttachments()[0] as any,\r\n implData.blurFramebuffer2\r\n );\r\n }\r\n }\r\n getShaderHash() {\r\n return '';\r\n }\r\n getParams(out?: Vector4) {\r\n return out ?? Vector4.zero();\r\n }\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams) {\r\n const device = getDevice();\r\n return device.getDeviceCaps().textureCaps.supportFloatColorBuffer &&\r\n device.getDeviceCaps().textureCaps.supportLinearFloatTexture\r\n ? 'rgba32f'\r\n : device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer &&\r\n device.getDeviceCaps().textureCaps.supportLinearHalfFloatTexture\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return 'd24s8' as const;\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const depth = computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n return shadowMapParams.shadowMap!.format === 'rgba8unorm'\r\n ? depth\r\n : pb.vec4(depth.x, pb.mul(depth.x, depth.x), 1, 1);\r\n }\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowVSM(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.split\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.coord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));\r\n this.$return(\r\n filterShadowVSM(this, shadowMapParams.lightType, shadowMapParams.shadowMap!.format, this.coord)\r\n );\r\n } else {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = applyShadowDepthBias(\r\n this,\r\n this.shadowCoord.z,\r\n this.shadowBias,\r\n shadowMapParams.lightType !== LIGHT_TYPE_SPOT\r\n );\r\n this.shadow = filterShadowVSM(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return false;\r\n }\r\n}\r\n"],"names":["VSMBlitter","Blitter","_phase","_packFloat","_blurSize","_kernelSize","phase","kernelSize","blurSize","packFloat","val","invalidateHash","b","setup","scope","type","pb","$builder","shaderKind","float","uniform","blurMultiplyVec","vec3","vec2","numBlurPixelsPerSide","blurStep","setUniforms","bindGroup","setValue","readTexel","srcTex","srcUV","srcLayer","sampleType","texel","vec4","decodeNormalizedFloatFromRGBA","decode2HalfFromRGBA","writeTexel","outTexel","encode2HalfToRGBA","x","y","filter","that","d0","moment1","moment2","mul","z","coverage","$for","$l","blurOffset","i","d1","sub","d2","add","div","calcHash","Number","VSM","ShadowImpl","darkness","_blur","_darkness","_mipmap","_blitterH","_blitterV","resourceDirty","_resourceDirty","blur","mipmap","getDepthScale","setDepthScale","getType","getShadowMapClearColor","_shadowMapParams","Vector4","getShadowMapBorder","Math","ceil","getShadowMap","shadowMapParams","implData","blurFramebuffer2","getColorAttachments","shadowMapFramebuffer","fetchTemporalFramebuffer","autoRelease","lightType","numCascades","width","height","colorFormat","depthFormat","mipmapping","device","getDevice","useTextureArray","colorAttachments","pool","fetchTemporalTexture2DArray","LIGHT_TYPE_POINT","fetchTemporalTextureCube","fetchTemporalTexture2D","depthAttachment","fb","createTemporalFramebuffer","releaseTexture","doUpdateResources","getShadowMapColorFormat","shadowMapWidth","shadowMapHeight","blurFramebuffer","numShadowCascades","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","format","blit","getShaderHash","getParams","out","zero","getDeviceCaps","textureCaps","supportFloatColorBuffer","supportLinearFloatTexture","supportHalfFloatColorBuffer","supportLinearHalfFloatTexture","getShadowMapDepthFormat","computeShadowMapDepth","worldPos","depth","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","func","int","shadowCoord","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","lessThanEqual","shadowCoordDepthInRange","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowVSM","$return","getGlobalScope","computeShadow","funcNameComputeShadow","dir","xyz","ShaderHelper","getLightPositionAndRangeForShadow","distance","length","computeShadowBias","coord","LIGHT_TYPE_SPOT","nearFar","getShadowCameraParams","xy","nonLinearDepthToLinearNormalized","useNativeShadowMap"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene lighting unit model.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* `legacy` keeps the original unitless model: light `intensity` is an arbitrary multiplier and
|
|
6
|
+
* tonemapping applies a plain `toneMapExposure`. It is a public, widely used API and its behaviour
|
|
7
|
+
* is frozen.
|
|
8
|
+
*
|
|
9
|
+
* `physical` uses photometric units throughout, following Filament's conventions:
|
|
10
|
+
*
|
|
11
|
+
* | Quantity | Unit | Property |
|
|
12
|
+
* | --- | --- | --- |
|
|
13
|
+
* | Directional light | lux (lm/m²) | {@link DirectionalLight.illuminance} |
|
|
14
|
+
* | Point light | lumen (authored) / candela (shaded) | `luminousPower` / `luminousIntensity` |
|
|
15
|
+
* | Spot light | lumen (authored) / candela (shaded) | `luminousPower` / `luminousIntensity` |
|
|
16
|
+
* | Rect light | cd/m² (nit) | {@link RectLight.luminance} |
|
|
17
|
+
* | Environment / IBL | cd/m² (nit) | `EnvLightWrapper.intensity` |
|
|
18
|
+
* | Emissive material | cd/m² (nit) at `emissiveExposureWeight` 1 | `emissiveLuminance` (legacy: `emissiveStrength`) |
|
|
19
|
+
* | Camera exposure | unitless multiplier | {@link Camera.exposure} |
|
|
20
|
+
*
|
|
21
|
+
* Lighting is pre-exposed on the CPU: every light quantity is multiplied by the camera exposure
|
|
22
|
+
* before upload, so the HDR render target stays near 1.0 and downstream passes (bloom, SSR, SSGI,
|
|
23
|
+
* fog) need no unit awareness. Tonemapping therefore applies the ACES curve only.
|
|
24
|
+
*
|
|
25
|
+
* Emissive is the one exception, because it is authored on a material rather than a light. It is
|
|
26
|
+
* exposed in the shader, and `emissiveExposureWeight` decides whether it is exposed at all: at 1 it
|
|
27
|
+
* is a true cd/m² luminance, at 0 the exposure cancels out and `emissiveLuminance` degrades to a
|
|
28
|
+
* display-referred multiplier. Imported glTF/FBX materials use 0 to preserve glTF's display-referred
|
|
29
|
+
* emissive, so their `emissiveLuminance` does not read in nits.
|
|
30
|
+
*
|
|
31
|
+
* @public
|
|
32
|
+
*/ /**
|
|
33
|
+
* Fixed exposure the physical sky bake (IBL, distant-light LUT, baked skybox) is stored at, equal
|
|
34
|
+
* to the Sunny-16 reference: `1 / 38400 === calculatePhysicalExposure(16, 1/125, 100)`.
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* The bake is cached and only invalidated when the sun changes, so it cannot carry the live camera
|
|
38
|
+
* exposure. Nor can it hold raw photometric luminance: the environment cubemap is `rg11b10uf`
|
|
39
|
+
* (max ~65,024) or `rgba16f` (max 65,504), while a 100,000 lux sun drives the atmosphere model to
|
|
40
|
+
* ~384,000. That overflows to `Inf` in the sun's direction, and the GGX prefilter plus the SH
|
|
41
|
+
* projection then spread the `Inf` across the entire IBL.
|
|
42
|
+
*
|
|
43
|
+
* Storing at this fixed reference keeps the bake exposure-independent *and* in range. Consumers
|
|
44
|
+
* convert to the live exposure with `cameraExposure / PHYSICAL_BAKE_EXPOSURE`.
|
|
45
|
+
*
|
|
46
|
+
* @public
|
|
47
|
+
*/ const PHYSICAL_BAKE_EXPOSURE = 1 / 38400;
|
|
48
|
+
/** Calculate photographic EV100 from aperture, shutter time and ISO. */ function calculateEV100(aperture, shutterSeconds, iso) {
|
|
49
|
+
const safeAperture = Math.max(aperture, 0.0001);
|
|
50
|
+
const safeShutter = Math.max(shutterSeconds, 0.000001);
|
|
51
|
+
const safeISO = Math.max(iso, 0.0001);
|
|
52
|
+
return Math.log2(safeAperture * safeAperture / safeShutter * (100 / safeISO));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Calculate the scene-linear exposure multiplier for a photometrically calibrated camera.
|
|
56
|
+
*
|
|
57
|
+
* Uses the saturation-based calibration commonly used by real-time PBR renderers:
|
|
58
|
+
* `1 / (1.2 * 2 ^ EV100)`.
|
|
59
|
+
*/ function calculatePhysicalExposure(aperture, shutterSeconds, iso, compensationEV = 0) {
|
|
60
|
+
const ev100 = calculateEV100(aperture, shutterSeconds, iso) - compensationEV;
|
|
61
|
+
return 1 / (1.2 * Math.pow(2, ev100));
|
|
62
|
+
}
|
|
63
|
+
/** Calculate vertical field of view from physical camera parameters. */ function calculateVerticalFov(focalLengthMm, sensorWidthMm, sensorHeightMm, aspect, sensorFit) {
|
|
64
|
+
const focalLength = Math.max(focalLengthMm, 0.0001);
|
|
65
|
+
if (sensorFit === 'horizontal') {
|
|
66
|
+
const safeAspect = Math.max(aspect, 0.0001);
|
|
67
|
+
const fovX = 2 * Math.atan(Math.max(sensorWidthMm, 0.0001) / (2 * focalLength));
|
|
68
|
+
return 2 * Math.atan(Math.tan(fovX * 0.5) / safeAspect);
|
|
69
|
+
}
|
|
70
|
+
return 2 * Math.atan(Math.max(sensorHeightMm, 0.0001) / (2 * focalLength));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { PHYSICAL_BAKE_EXPOSURE, calculateEV100, calculatePhysicalExposure, calculateVerticalFov };
|
|
74
|
+
//# sourceMappingURL=physical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physical.js","sources":["../../src/utility/physical.ts"],"sourcesContent":["/**\r\n * Scene lighting unit model.\r\n *\r\n * @remarks\r\n * `legacy` keeps the original unitless model: light `intensity` is an arbitrary multiplier and\r\n * tonemapping applies a plain `toneMapExposure`. It is a public, widely used API and its behaviour\r\n * is frozen.\r\n *\r\n * `physical` uses photometric units throughout, following Filament's conventions:\r\n *\r\n * | Quantity | Unit | Property |\r\n * | --- | --- | --- |\r\n * | Directional light | lux (lm/m²) | {@link DirectionalLight.illuminance} |\r\n * | Point light | lumen (authored) / candela (shaded) | `luminousPower` / `luminousIntensity` |\r\n * | Spot light | lumen (authored) / candela (shaded) | `luminousPower` / `luminousIntensity` |\r\n * | Rect light | cd/m² (nit) | {@link RectLight.luminance} |\r\n * | Environment / IBL | cd/m² (nit) | `EnvLightWrapper.intensity` |\r\n * | Emissive material | cd/m² (nit) at `emissiveExposureWeight` 1 | `emissiveLuminance` (legacy: `emissiveStrength`) |\r\n * | Camera exposure | unitless multiplier | {@link Camera.exposure} |\r\n *\r\n * Lighting is pre-exposed on the CPU: every light quantity is multiplied by the camera exposure\r\n * before upload, so the HDR render target stays near 1.0 and downstream passes (bloom, SSR, SSGI,\r\n * fog) need no unit awareness. Tonemapping therefore applies the ACES curve only.\r\n *\r\n * Emissive is the one exception, because it is authored on a material rather than a light. It is\r\n * exposed in the shader, and `emissiveExposureWeight` decides whether it is exposed at all: at 1 it\r\n * is a true cd/m² luminance, at 0 the exposure cancels out and `emissiveLuminance` degrades to a\r\n * display-referred multiplier. Imported glTF/FBX materials use 0 to preserve glTF's display-referred\r\n * emissive, so their `emissiveLuminance` does not read in nits.\r\n *\r\n * @public\r\n */\r\nexport type LightingMode = 'legacy' | 'physical';\r\n\r\n/**\r\n * Camera projection parameterization.\r\n *\r\n * @public\r\n */\r\nexport type CameraProjectionMode = 'fov' | 'physical';\r\n\r\n/**\r\n * Sensor dimension used to derive the perspective field of view.\r\n *\r\n * @public\r\n */\r\nexport type CameraSensorFit = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Fixed exposure the physical sky bake (IBL, distant-light LUT, baked skybox) is stored at, equal\r\n * to the Sunny-16 reference: `1 / 38400 === calculatePhysicalExposure(16, 1/125, 100)`.\r\n *\r\n * @remarks\r\n * The bake is cached and only invalidated when the sun changes, so it cannot carry the live camera\r\n * exposure. Nor can it hold raw photometric luminance: the environment cubemap is `rg11b10uf`\r\n * (max ~65,024) or `rgba16f` (max 65,504), while a 100,000 lux sun drives the atmosphere model to\r\n * ~384,000. That overflows to `Inf` in the sun's direction, and the GGX prefilter plus the SH\r\n * projection then spread the `Inf` across the entire IBL.\r\n *\r\n * Storing at this fixed reference keeps the bake exposure-independent *and* in range. Consumers\r\n * convert to the live exposure with `cameraExposure / PHYSICAL_BAKE_EXPOSURE`.\r\n *\r\n * @public\r\n */\r\nexport const PHYSICAL_BAKE_EXPOSURE = 1 / 38400;\r\n\r\n/** Calculate photographic EV100 from aperture, shutter time and ISO. */\r\nexport function calculateEV100(aperture: number, shutterSeconds: number, iso: number): number {\r\n const safeAperture = Math.max(aperture, 0.0001);\r\n const safeShutter = Math.max(shutterSeconds, 0.000001);\r\n const safeISO = Math.max(iso, 0.0001);\r\n return Math.log2(((safeAperture * safeAperture) / safeShutter) * (100 / safeISO));\r\n}\r\n\r\n/**\r\n * Calculate the scene-linear exposure multiplier for a photometrically calibrated camera.\r\n *\r\n * Uses the saturation-based calibration commonly used by real-time PBR renderers:\r\n * `1 / (1.2 * 2 ^ EV100)`.\r\n */\r\nexport function calculatePhysicalExposure(\r\n aperture: number,\r\n shutterSeconds: number,\r\n iso: number,\r\n compensationEV = 0\r\n): number {\r\n const ev100 = calculateEV100(aperture, shutterSeconds, iso) - compensationEV;\r\n return 1 / (1.2 * Math.pow(2, ev100));\r\n}\r\n\r\n/** Calculate vertical field of view from physical camera parameters. */\r\nexport function calculateVerticalFov(\r\n focalLengthMm: number,\r\n sensorWidthMm: number,\r\n sensorHeightMm: number,\r\n aspect: number,\r\n sensorFit: CameraSensorFit\r\n): number {\r\n const focalLength = Math.max(focalLengthMm, 0.0001);\r\n if (sensorFit === 'horizontal') {\r\n const safeAspect = Math.max(aspect, 0.0001);\r\n const fovX = 2 * Math.atan(Math.max(sensorWidthMm, 0.0001) / (2 * focalLength));\r\n return 2 * Math.atan(Math.tan(fovX * 0.5) / safeAspect);\r\n }\r\n return 2 * Math.atan(Math.max(sensorHeightMm, 0.0001) / (2 * focalLength));\r\n}\r\n"],"names":["PHYSICAL_BAKE_EXPOSURE","calculateEV100","aperture","shutterSeconds","iso","safeAperture","Math","max","safeShutter","safeISO","log2","calculatePhysicalExposure","compensationEV","ev100","pow","calculateVerticalFov","focalLengthMm","sensorWidthMm","sensorHeightMm","aspect","sensorFit","focalLength","safeAspect","fovX","atan","tan"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DC,IACM,MAAMA,sBAAyB,GAAA,CAAA,GAAI;AAE1C,yEACO,SAASC,cAAAA,CAAeC,QAAgB,EAAEC,cAAsB,EAAEC,GAAW,EAAA;AAClF,IAAA,MAAMC,YAAeC,GAAAA,IAAAA,CAAKC,GAAG,CAACL,QAAU,EAAA,MAAA,CAAA;AACxC,IAAA,MAAMM,WAAcF,GAAAA,IAAAA,CAAKC,GAAG,CAACJ,cAAgB,EAAA,QAAA,CAAA;AAC7C,IAAA,MAAMM,OAAUH,GAAAA,IAAAA,CAAKC,GAAG,CAACH,GAAK,EAAA,MAAA,CAAA;IAC9B,OAAOE,IAAAA,CAAKI,IAAI,CAAGL,eAAeA,YAAgBG,GAAAA,WAAAA,IAAgB,GAAA,GAAMC,OAAM,CAAA,CAAA;AAChF;AAEA;;;;;IAMO,SAASE,yBAAAA,CACdT,QAAgB,EAChBC,cAAsB,EACtBC,GAAW,EACXQ,cAAAA,GAAiB,CAAC,EAAA;AAElB,IAAA,MAAMC,KAAQZ,GAAAA,cAAAA,CAAeC,QAAUC,EAAAA,cAAAA,EAAgBC,GAAOQ,CAAAA,GAAAA,cAAAA;AAC9D,IAAA,OAAO,KAAK,GAAA,GAAMN,KAAKQ,GAAG,CAAC,GAAGD,KAAK,CAAA,CAAA;AACrC;AAEA,yEACO,SAASE,oBAAAA,CACdC,aAAqB,EACrBC,aAAqB,EACrBC,cAAsB,EACtBC,MAAc,EACdC,SAA0B,EAAA;AAE1B,IAAA,MAAMC,WAAcf,GAAAA,IAAAA,CAAKC,GAAG,CAACS,aAAe,EAAA,MAAA,CAAA;AAC5C,IAAA,IAAII,cAAc,YAAc,EAAA;AAC9B,QAAA,MAAME,UAAahB,GAAAA,IAAAA,CAAKC,GAAG,CAACY,MAAQ,EAAA,MAAA,CAAA;AACpC,QAAA,MAAMI,IAAO,GAAA,CAAA,GAAIjB,IAAKkB,CAAAA,IAAI,CAAClB,IAAAA,CAAKC,GAAG,CAACU,aAAe,EAAA,MAAA,CAAA,IAAW,CAAA,GAAII,WAAU,CAAA,CAAA;QAC5E,OAAO,CAAA,GAAIf,KAAKkB,IAAI,CAAClB,KAAKmB,GAAG,CAACF,OAAO,GAAOD,CAAAA,GAAAA,UAAAA,CAAAA;AAC9C;IACA,OAAO,CAAA,GAAIhB,IAAKkB,CAAAA,IAAI,CAAClB,IAAAA,CAAKC,GAAG,CAACW,cAAgB,EAAA,MAAA,CAAA,IAAW,CAAA,GAAIG,WAAU,CAAA,CAAA;AACzE;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchSampler } from './misc.js';
|
|
2
2
|
import { drawFullscreenQuad } from '../render/fullscreenquad.js';
|
|
3
|
-
import { DRef } from '@zephyr3d/base';
|
|
3
|
+
import { DRef, DEPTH_FARTHEST } from '@zephyr3d/base';
|
|
4
4
|
import { getDevice } from '../app/api.js';
|
|
5
5
|
|
|
6
6
|
class RenderMipmap {
|
|
@@ -77,7 +77,7 @@ class RenderMipmap {
|
|
|
77
77
|
this.$outputs.uv = pb.vec2();
|
|
78
78
|
that.setupUniforms(this);
|
|
79
79
|
pb.main(function() {
|
|
80
|
-
this.$builtins.position = pb.vec4(this.$inputs.pos,
|
|
80
|
+
this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);
|
|
81
81
|
this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
|
|
82
82
|
if (device.type === 'webgpu') {
|
|
83
83
|
this.$builtins.position.y = pb.neg(this.$builtins.position.y);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rendermipmap.js","sources":["../../src/utility/rendermipmap.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler } from './misc';\r\nimport { drawFullscreenQuad } from '../render/fullscreenquad';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport abstract class RenderMipmap {\r\n private readonly _program: DRef<GPUProgram>;\r\n private readonly _bindGroup: DRef<BindGroup>;\r\n private _srcSize: Float32Array<ArrayBuffer>;\r\n private _dstSize: Float32Array<ArrayBuffer>;\r\n abstract renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp,\r\n uv: PBShaderExp\r\n ): PBShaderExp;\r\n setupUniforms(_scope: PBGlobalScope) {}\r\n applyUniformValues(_bindGroup: BindGroup) {}\r\n constructor() {\r\n this._program = new DRef();\r\n this._bindGroup = new DRef();\r\n this._srcSize = new Float32Array(2);\r\n this._dstSize = new Float32Array(2);\r\n }\r\n render(srcTex: Texture2D) {\r\n const device = getDevice();\r\n this.prepare(device);\r\n device.pushDeviceStates();\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n this.renderLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpTexture = device.createTexture2D(srcTex.format, srcTex.width, srcTex.height)!;\r\n const tmpFramebuffer = device.createFrameBuffer([tmpTexture], null);\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n this.renderLevel(device, i, srcTex, dstTex);\r\n }\r\n tmpFramebuffer.dispose();\r\n tmpTexture.dispose();\r\n }\r\n device.popDeviceStates();\r\n }\r\n private renderLevel(\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.createFrameBuffer([dstTexture], null);\r\n framebuffer.setColorAttachmentMipLevel(0, miplevel + 1);\r\n const bindGroup = this._bindGroup.get()!;\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n this._srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n this._srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n this._dstSize[0] = Math.max(this._srcSize[0] >> 1, 1);\r\n this._dstSize[1] = Math.max(this._srcSize[1] >> 1, 1);\r\n bindGroup.setValue('srcSize', this._srcSize);\r\n bindGroup.setValue('dstSize', this._dstSize);\r\n if (device.type === 'webgpu') {\r\n bindGroup.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n bindGroup.setTexture('srcTex', srcTexture, sampler);\r\n bindGroup.setValue('srcMipLevel', miplevel);\r\n }\r\n this.applyUniformValues(bindGroup);\r\n device.setProgram(this._program.get());\r\n device.setBindGroup(0, this._bindGroup.get()!);\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 framebuffer.dispose();\r\n }\r\n private prepare(device: AbstractDevice) {\r\n if (!this._program.get()) {\r\n const that = this;\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n that.setupUniforms(this);\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.vec2().uniform(0);\r\n this.dstSize = pb.vec2().uniform(0);\r\n that.setupUniforms(this);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.float().uniform(0);\r\n }\r\n pb.main(function () {\r\n const miplevel = device.type === 'webgpu' ? 0 : this.srcMipLevel;\r\n this.$l.invSize = pb.div(pb.vec2(1), this.srcSize);\r\n this.$l.uv = pb.div(this.$builtins.fragCoord.xy, this.dstSize);\r\n this.$l.d0 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(-0.5, -0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$l.d1 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(0.5, -0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$l.d2 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(-0.5, 0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$l.d3 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(0.5, 0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$outputs.color = that.renderPixel(this, this.d0, this.d1, this.d2, this.d3, this.uv);\r\n });\r\n }\r\n })!;\r\n program.name = '@RenderMipmap';\r\n this._program.set(program);\r\n this._bindGroup.set(device.createBindGroup(program.bindGroupLayouts[0]));\r\n }\r\n }\r\n}\r\n"],"names":["RenderMipmap","_program","_bindGroup","_srcSize","_dstSize","setupUniforms","_scope","applyUniformValues","DRef","Float32Array","render","srcTex","device","getDevice","prepare","pushDeviceStates","type","i","mipLevelCount","renderLevel","tmpTexture","createTexture2D","format","width","height","tmpFramebuffer","createFrameBuffer","dstTex","getColorAttachments","dispose","popDeviceStates","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","setColorAttachmentMipLevel","bindGroup","get","setColorAttachmentGenerateMipmaps","Math","max","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","that","program","buildRenderProgram","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","y","neg","fragment","color","tex2D","sampleType","uniform","srcSize","dstSize","srcMipLevel","float","$l","invSize","div","fragCoord","d0","textureSampleLevel","d1","d2","d3","renderPixel","name","set","createBindGroup","bindGroupLayouts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rendermipmap.js","sources":["../../src/utility/rendermipmap.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler } from './misc';\r\nimport { drawFullscreenQuad } from '../render/fullscreenquad';\r\nimport { DEPTH_FARTHEST, DRef } from '@zephyr3d/base';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport abstract class RenderMipmap {\r\n private readonly _program: DRef<GPUProgram>;\r\n private readonly _bindGroup: DRef<BindGroup>;\r\n private _srcSize: Float32Array<ArrayBuffer>;\r\n private _dstSize: Float32Array<ArrayBuffer>;\r\n abstract renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp,\r\n uv: PBShaderExp\r\n ): PBShaderExp;\r\n setupUniforms(_scope: PBGlobalScope) {}\r\n applyUniformValues(_bindGroup: BindGroup) {}\r\n constructor() {\r\n this._program = new DRef();\r\n this._bindGroup = new DRef();\r\n this._srcSize = new Float32Array(2);\r\n this._dstSize = new Float32Array(2);\r\n }\r\n render(srcTex: Texture2D) {\r\n const device = getDevice();\r\n this.prepare(device);\r\n device.pushDeviceStates();\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n this.renderLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpTexture = device.createTexture2D(srcTex.format, srcTex.width, srcTex.height)!;\r\n const tmpFramebuffer = device.createFrameBuffer([tmpTexture], null);\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n this.renderLevel(device, i, srcTex, dstTex);\r\n }\r\n tmpFramebuffer.dispose();\r\n tmpTexture.dispose();\r\n }\r\n device.popDeviceStates();\r\n }\r\n private renderLevel(\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.createFrameBuffer([dstTexture], null);\r\n framebuffer.setColorAttachmentMipLevel(0, miplevel + 1);\r\n const bindGroup = this._bindGroup.get()!;\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n this._srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n this._srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n this._dstSize[0] = Math.max(this._srcSize[0] >> 1, 1);\r\n this._dstSize[1] = Math.max(this._srcSize[1] >> 1, 1);\r\n bindGroup.setValue('srcSize', this._srcSize);\r\n bindGroup.setValue('dstSize', this._dstSize);\r\n if (device.type === 'webgpu') {\r\n bindGroup.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n bindGroup.setTexture('srcTex', srcTexture, sampler);\r\n bindGroup.setValue('srcMipLevel', miplevel);\r\n }\r\n this.applyUniformValues(bindGroup);\r\n device.setProgram(this._program.get());\r\n device.setBindGroup(0, this._bindGroup.get()!);\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 framebuffer.dispose();\r\n }\r\n private prepare(device: AbstractDevice) {\r\n if (!this._program.get()) {\r\n const that = this;\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n that.setupUniforms(this);\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.vec2().uniform(0);\r\n this.dstSize = pb.vec2().uniform(0);\r\n that.setupUniforms(this);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.float().uniform(0);\r\n }\r\n pb.main(function () {\r\n const miplevel = device.type === 'webgpu' ? 0 : this.srcMipLevel;\r\n this.$l.invSize = pb.div(pb.vec2(1), this.srcSize);\r\n this.$l.uv = pb.div(this.$builtins.fragCoord.xy, this.dstSize);\r\n this.$l.d0 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(-0.5, -0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$l.d1 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(0.5, -0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$l.d2 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(-0.5, 0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$l.d3 = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.uv, pb.mul(pb.vec2(0.5, 0.5), this.invSize)),\r\n miplevel\r\n );\r\n this.$outputs.color = that.renderPixel(this, this.d0, this.d1, this.d2, this.d3, this.uv);\r\n });\r\n }\r\n })!;\r\n program.name = '@RenderMipmap';\r\n this._program.set(program);\r\n this._bindGroup.set(device.createBindGroup(program.bindGroupLayouts[0]));\r\n }\r\n }\r\n}\r\n"],"names":["RenderMipmap","_program","_bindGroup","_srcSize","_dstSize","setupUniforms","_scope","applyUniformValues","DRef","Float32Array","render","srcTex","device","getDevice","prepare","pushDeviceStates","type","i","mipLevelCount","renderLevel","tmpTexture","createTexture2D","format","width","height","tmpFramebuffer","createFrameBuffer","dstTex","getColorAttachments","dispose","popDeviceStates","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","setColorAttachmentMipLevel","bindGroup","get","setColorAttachmentGenerateMipmaps","Math","max","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","that","program","buildRenderProgram","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","DEPTH_FARTHEST","add","mul","xy","y","neg","fragment","color","tex2D","sampleType","uniform","srcSize","dstSize","srcMipLevel","float","$l","invSize","div","fragCoord","d0","textureSampleLevel","d1","d2","d3","renderPixel","name","set","createBindGroup","bindGroupLayouts"],"mappings":"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"}
|
|
@@ -44,13 +44,15 @@ import '../../render/rendergraph/forward_plus_builder.js';
|
|
|
44
44
|
import '../../render/lightpass.js';
|
|
45
45
|
import '../../render/sky.js';
|
|
46
46
|
import '../../render/clipmap.js';
|
|
47
|
+
import '../../render/envlight.js';
|
|
47
48
|
import '../../render/dualdepthpeeling_oit.js';
|
|
48
49
|
import '../../shaders/atmosphere.js';
|
|
50
|
+
import '../../render/rendergraph/scene_render_context.js';
|
|
49
51
|
import { SceneNode } from '../../scene/scene_node.js';
|
|
50
52
|
import '../../shadow/shadowmapper.js';
|
|
51
53
|
import '../../scene/mesh.js';
|
|
52
|
-
import '../../scene/basesprite.js';
|
|
53
54
|
import '../../scene/meshdrawable.js';
|
|
55
|
+
import '../../scene/basesprite.js';
|
|
54
56
|
import '../../material/msdf_text.js';
|
|
55
57
|
import '../../scene/water.js';
|
|
56
58
|
import '../../scene/particlesys.js';
|