@zephyr3d/scene 0.9.25 → 0.9.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
- package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +7 -5
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -4
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/skeleton.js +58 -24
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +577 -179
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +4 -3
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
- package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +2 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +11 -3
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +10 -0
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +53 -43
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptingsystem.js +119 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +3 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +284 -67
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zhair/zhair_format.js +288 -0
- package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
- package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
- package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
- package/dist/asset/model.js +178 -67
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +193 -21
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +3 -1
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +4019 -1278
- package/dist/index.js +15 -5
- package/dist/index.js.map +1 -1
- package/dist/material/eye.js +932 -0
- package/dist/material/eye.js.map +1 -0
- package/dist/material/hair.js +917 -0
- package/dist/material/hair.js.map +1 -0
- package/dist/material/hairstrand.js +842 -0
- package/dist/material/hairstrand.js.map +1 -0
- package/dist/material/hairstrand_data.js +162 -0
- package/dist/material/hairstrand_data.js.map +1 -0
- package/dist/material/lambert.js +5 -2
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +338 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +120 -19
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +5 -4
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +73 -18
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +4 -4
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +48 -11
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mtoon.js +6 -5
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +146 -28
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrblueprint_instance.js +501 -0
- package/dist/material/pbrblueprint_instance.js.map +1 -0
- package/dist/material/pbrmr.js +15 -16
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +330 -20
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +55 -0
- package/dist/material/shader/terrain_blend.js.map +1 -0
- package/dist/material/skin.js +192 -32
- package/dist/material/skin.js.map +1 -1
- package/dist/material/spriteblueprint.js +16 -1
- package/dist/material/spriteblueprint.js.map +1 -1
- package/dist/material/subsurfaceprofile.js +86 -23
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/water.js +3 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +167 -7
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/coloradjust.js +2 -1
- package/dist/posteffect/coloradjust.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js +2 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js +3 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js +4 -1
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/skinsss.js +368 -69
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +16 -9
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +91 -34
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +44 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +45 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cull_visitor.js +19 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +36 -2
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +26 -1
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +52 -51
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +3 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/oit.js +29 -0
- package/dist/render/oit.js.map +1 -0
- package/dist/render/render_queue.js +3 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +2 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +61 -1
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +73 -8
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +166 -126
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +36 -35
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +8 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +3 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +4 -1
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/hair.js +963 -0
- package/dist/scene/hair.js.map +1 -0
- package/dist/scene/light.js +5 -1
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +481 -47
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +3 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +3 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +6 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +3 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +6 -1
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +3 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +6 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/texture_cache.js +309 -0
- package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
- package/dist/scene/water.js +6 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/diffusion.js +54 -0
- package/dist/shaders/diffusion.js.map +1 -0
- package/dist/shaders/shadow.js +33 -21
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/temporal.js +71 -33
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shadow/dom.js +546 -0
- package/dist/shadow/dom.js.map +1 -0
- package/dist/shadow/pcf_opt.js +3 -5
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/receiver_bias.js +41 -0
- package/dist/shadow/receiver_bias.js.map +1 -0
- package/dist/shadow/shader.js +20 -60
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js +89 -0
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +50 -50
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +150 -37
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/shape.js +11 -2
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +50 -9
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +112 -2
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +142 -49
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +490 -25
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +898 -4
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/manager.js +431 -100
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +370 -3
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +133 -1
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +26 -5
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/hair.js +1141 -0
- package/dist/utility/serialization/scene/hair.js.map +1 -0
- package/dist/utility/serialization/scene/light.js +84 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1867 -166
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +231 -14
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +141 -7
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +4 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +4 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +4 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +96 -95
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/values.js +49 -2
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sources":["../../src/shadow/dom.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n FrameBuffer,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { applyShadowDepthBias, ndcToShadowCoord3, shadowCoordDepthInRange } from '../shaders/shadow';\r\nimport { computeShadowBias } from './shader';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { REVERSE_Z, Vector4, type Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Opacity layers, which is three rather than four because the fourth channel of\r\n * the result texture carries the depth the layers are measured from. Keeping\r\n * both in one texture is what lets the receiver read the whole technique through\r\n * the single shadow-map binding the lighting shaders declare.\r\n * @internal\r\n */\r\nconst DOM_LAYER_COUNT = 3;\r\n\r\n/** @internal Caster-pass uniform holding the frontmost depth from geometry pass 0. */\r\nconst UNIFORM_NAME_DOM_FRONT_DEPTH = 'Z_domFrontDepth';\r\n\r\n/**\r\n * Transmittance a fully opaque caster is recorded as, since zero has no finite\r\n * optical depth to blend. Dark enough to read as black, and small enough in the\r\n * exponent that several opaque layers can stack without saturating half floats.\r\n * @internal\r\n */\r\nconst DOM_MIN_TRANSMITTANCE = 0.001;\r\n\r\n/** @internal */\r\ntype DOMImplData = {\r\n /**\r\n * Frontmost caster depth, written by geometry pass 0 and sampled by pass 1.\r\n * Separate from the result texture on purpose: a texture cannot be a render\r\n * target and a sampled resource in the same pass.\r\n */\r\n frontDepth: Texture2D;\r\n /** RGB = cumulative optical depth per layer, A = the depth those layers start at. */\r\n result: Texture2D;\r\n /** Targets {@link DOMImplData.frontDepth}, reusing the shared depth attachment. */\r\n depthFramebuffer: FrameBuffer;\r\n /** Targets {@link DOMImplData.result}. No depth attachment - pass 1 does not test. */\r\n opacityFramebuffer: FrameBuffer;\r\n};\r\n\r\n/**\r\n * Deep opacity map shadows.\r\n *\r\n * @remarks\r\n * Hair is the case an ordinary shadow map cannot express. A shadow map answers\r\n * \"is this point behind the nearest caster\", which is the right question for a\r\n * wall and the wrong one for ten thousand strands: light entering a groom is not\r\n * blocked at its surface, it is attenuated gradually as it passes more and more\r\n * fibres. A binary test renders that as a hard edge with everything behind it\r\n * uniformly black.\r\n *\r\n * A deep opacity map (Yuksel & Keyser 2008) records the attenuation instead of\r\n * the boundary. Geometry pass 0 writes the frontmost caster depth `z0` per texel.\r\n * Pass 1 rasterises the casters again and each fragment adds its optical depth to\r\n * every layer lying behind it, giving cumulative absorption sampled at three\r\n * depths measured *from `z0`* rather than from the light. Because the layers\r\n * follow the hair surface, three of them resolve what a plain opacity shadow map\r\n * needs dozens of uniformly spaced ones to match.\r\n *\r\n * Recording optical depth rather than coverage is what keeps it exact for solid\r\n * casters as well as thin ones, so a scene does not have to reserve this mode for\r\n * its hair: see the caster output for why the two differ.\r\n *\r\n * WebGPU only, and deliberately so: the strand geometry this exists to shadow is\r\n * itself WebGPU only, so supporting the WebGL fallbacks - cascade atlases instead\r\n * of array layers, RGBA8-packed depth instead of float - would double the surface\r\n * area to serve no material.\r\n *\r\n * @internal\r\n */\r\nexport class DOM extends ShadowImpl {\r\n /** @internal */\r\n private _layerDistance: number;\r\n /** @internal */\r\n private _density: number;\r\n /** @internal Width of the sampling kernel in texels; 1 disables filtering. */\r\n private _filterSize: number;\r\n /** @internal */\r\n private readonly _paramsScratch: Vector4;\r\n /**\r\n * @internal\r\n * Which geometry pass is being rasterised. Lives on the implementation rather\r\n * than in `implData` because {@link DOM.getShaderHash} has no access to the\r\n * params, and the hash must separate the two passes or they share a program.\r\n */\r\n private _geometryPass: number;\r\n /**\r\n * @internal\r\n * Depth the shadow camera spans, captured when the map is rendered. Needed to\r\n * express {@link DOM.layerDistance} in world units: the shader compares device\r\n * depths, and for the orthographic projection a directional light uses those\r\n * are the world depth divided by exactly this.\r\n */\r\n private _depthRange: number;\r\n constructor(layerDistance = 0.25, density = 1, filterSize = 5) {\r\n super();\r\n this._layerDistance = layerDistance;\r\n this._density = density;\r\n this._filterSize = DOM.clampFilterSize(filterSize);\r\n this._paramsScratch = new Vector4();\r\n this._geometryPass = 0;\r\n this._depthRange = 1;\r\n }\r\n /** @internal */\r\n private static clampFilterSize(val: number) {\r\n return val !== 1 && val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n }\r\n /**\r\n * Width of the sampling kernel, in shadow map texels. One of 1, 3, 5 or 7.\r\n *\r\n * @remarks\r\n * The graded transmittance this technique records runs along the light, not\r\n * across the map, so at the silhouette of a groom - where the change is one of\r\n * coverage rather than of depth - a single tap is as abrupt as an unfiltered\r\n * shadow map. This is the kernel that softens that edge, and it is the same\r\n * knob PCF's kernel size is, with the difference that each tap here costs a\r\n * layer lookup rather than a depth comparison.\r\n *\r\n * Set to 1 to sample once, which is measurably cheaper and visibly harder.\r\n */\r\n get filterSize() {\r\n return this._filterSize;\r\n }\r\n set filterSize(val) {\r\n this._filterSize = DOM.clampFilterSize(val);\r\n }\r\n /**\r\n * Depth the layers span, in world units along the light direction.\r\n *\r\n * @remarks\r\n * Set it to roughly the thickness of the hair. Too small and everything past\r\n * the outer strands saturates the last layer, which is a hard shadow again;\r\n * too large and all three layers land inside the first strand, leaving the\r\n * interior unshadowed.\r\n *\r\n * Exact for directional lights, whose orthographic projection makes device\r\n * depth a linear function of world depth. Spot and point lights project\r\n * perspectively, so there the value is only accurate near the middle of the\r\n * shadow camera's range - which is where hair lit by one usually sits.\r\n */\r\n get layerDistance() {\r\n return this._layerDistance;\r\n }\r\n set layerDistance(val) {\r\n this._layerDistance = val > 0 ? val : 0.0001;\r\n }\r\n /**\r\n * Artistic multiplier on the absorption the casters actually recorded.\r\n *\r\n * @remarks\r\n * One reproduces alpha compositing exactly and is the right default. Raise it\r\n * to deepen the interior of a groom without moving the layers, lower it to let\r\n * more light through than the geometry strictly would.\r\n */\r\n get density() {\r\n return this._density;\r\n }\r\n set density(val) {\r\n this._density = val < 0 ? 0 : val;\r\n }\r\n getType() {\r\n return 'dom' as const;\r\n }\r\n resourceDirty() {\r\n return this._resourceDirty;\r\n }\r\n getShadowMapBorder() {\r\n // Margin so the kernel's outer taps still land inside the map at the edges of\r\n // the shadow region, matching what the PCF implementations reserve.\r\n return this._filterSize;\r\n }\r\n getDepthScale() {\r\n return 1;\r\n }\r\n setDepthScale(_val: number) {}\r\n /**\r\n * Layer geometry and density, for both the caster and the receiver. `z` and\r\n * `w` are unused.\r\n *\r\n * @remarks\r\n * `x` is the layer span converted from world units into the device-depth\r\n * difference the shaders actually compare, using the range captured when the\r\n * map was rendered.\r\n */\r\n getParams(out?: Vector4) {\r\n const result = out ?? this._paramsScratch;\r\n result.setXYZW(this._layerDistance / this._depthRange, this._density, 0, 0);\r\n return result;\r\n }\r\n getGeometryPassCount() {\r\n return 2;\r\n }\r\n supportsCascades() {\r\n // Each split would need its own depth and layer set, and both already share\r\n // the one texture the receiver can bind.\r\n return false;\r\n }\r\n clipsCasterAlpha() {\r\n // Neither pass wants the clip. Pass 1 integrates the alpha, and clipping is\r\n // destructive to it in both of the forms the material applies: a dithered\r\n // caster survives with probability alpha and then contributes the absorption\r\n // of that same alpha, counting it twice, and a hard cutoff drops the sub-pixel\r\n // strands that carry most of a groom's transmittance.\r\n //\r\n // Pass 0 skips it for a different reason. Its job is to find the frontmost\r\n // strand, and under dithering the clip makes that choice per-pixel random -\r\n // the layers would then start at a depth that flickers between strands, and\r\n // every opacity reading behind it inherits the jitter.\r\n //\r\n // The case this gives up is a caster whose alpha is a real mask rather than a\r\n // coverage value, such as a hair card with cut-out texels: pass 0 will place\r\n // z0 on the card's surface even where it is fully transparent. Strand\r\n // geometry, which is what this technique is for, has no such texels.\r\n return false;\r\n }\r\n beginGeometryPass(shadowMapParams: ShadowMapParams, pass: number) {\r\n const implData = shadowMapParams.implData as DOMImplData;\r\n this._geometryPass = pass;\r\n // The light camera is finalised by the time the casters are drawn, so this is\r\n // where the world-to-device depth scale becomes known. It stays valid for the\r\n // lighting pass that follows, which reads the same converted params back.\r\n const range = shadowMapParams.cameraParams.y - shadowMapParams.cameraParams.x;\r\n this._depthRange = range > 1e-6 ? range : 1;\r\n getDevice().setFramebuffer(pass === 0 ? implData.depthFramebuffer : implData.opacityFramebuffer);\r\n }\r\n setCasterRenderStates(_shadowMapParams: ShadowMapParams, stateSet: RenderStateSet) {\r\n if (this._geometryPass !== 1) {\r\n return;\r\n }\r\n // Every strand between z0 and the last layer has to contribute, so the pass\r\n // must not depth-test against the frontmost surface pass 0 resolved, and must\r\n // not write depth of its own - its framebuffer has no depth attachment at all.\r\n // Optical depth sums across the three layer channels; alpha instead carries\r\n // z0, which every fragment reads from the same texel, so replacing is correct\r\n // where summing would multiply it by the number of overlapping strands.\r\n stateSet\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n stateSet.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n getShadowMapClearColor(_shadowMapParams: ShadowMapParams) {\r\n if (this._geometryPass === 1) {\r\n // No hair over this texel means no absorption. Alpha carries z0, and the\r\n // sentinel below makes an uncovered texel read as \"nothing in front\".\r\n return new Vector4(0, 0, 0, REVERSE_Z ? 0 : 1);\r\n }\r\n const farthest = REVERSE_Z ? 0 : 1;\r\n return new Vector4(farthest, farthest, farthest, 1);\r\n }\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams) {\r\n // Null keeps the framebuffer the caller allocates depth-only. The colour this\r\n // technique needs is allocated here, against framebuffers of its own, so\r\n // letting the caller also allocate a full-size colour attachment would waste\r\n // it outright.\r\n return null;\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return this.preferredShadowMapDepthFormat();\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n // The receiver needs the actual stored values - a depth to measure offsets\r\n // from and three sums to interpolate - not the result of a hardware compare.\r\n return false;\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return (shadowMapParams.implData as DOMImplData).result as ShadowMapType;\r\n }\r\n /**\r\n * Format for both targets.\r\n *\r\n * @remarks\r\n * Full float wherever the accumulation pass can blend into it, and the reason\r\n * is the anchor depth, not the absorption sums. `z0` is stored absolute, in\r\n * units of the shadow camera's whole depth range, and every layer coordinate\r\n * on both sides of the technique is a difference against it divided by the\r\n * layer span. At half precision its quantisation step is about 2^-11 of the\r\n * stored value - roughly `0.0005 * depthRange` in world units - which for a\r\n * shadow camera spanning a large scene is comparable to the depth of the hair\r\n * itself. The error is independent per texel, so it does not read as bias but\r\n * as blotches: patches of a backlit groom whose receivers land in front of\r\n * their quantised `z0` and come out fully lit. A layer span large enough to\r\n * drown the noise hides it, but throws away the graded falloff the technique\r\n * exists for.\r\n *\r\n * Half float remains the fallback for devices whose blending cannot target\r\n * full float; there the practical mitigation is a tight shadow distance.\r\n * @internal\r\n */\r\n private colorFormat(): TextureFormat {\r\n const caps = getDevice().getDeviceCaps().textureCaps;\r\n if (caps.supportFloatColorBuffer && caps.supportFloatBlending) {\r\n return 'rgba32f';\r\n }\r\n return caps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba32f';\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n const device = getDevice();\r\n const sharedDepth = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n const width = sharedDepth.width;\r\n const height = sharedDepth.height;\r\n const format = this.colorFormat();\r\n // Everything here is pooled, per frame, the way the blur targets of VSM and\r\n // ESM are. `implData` cannot cache across frames even though it looks like it\r\n // could: it lives on a ShadowMapParams that is recycled between every light\r\n // and cleared at the end of each frame, so holding directly-created textures\r\n // in it leaks them at whatever rate the scene renders.\r\n const frontDepth = device.pool.fetchTemporalTexture2D(false, format, width, height, false);\r\n const result = device.pool.fetchTemporalTexture2D(false, format, width, height, false);\r\n // Pass 0 borrows the shadow map's own depth attachment, which is otherwise\r\n // unused - this implementation asks for no colour there - so the hardware\r\n // depth test resolves the frontmost strand for it. Pass 1 gets no depth,\r\n // which is both what stops it testing and what frees `frontDepth` to be\r\n // sampled while `result` is written.\r\n const depthFramebuffer = device.pool.createTemporalFramebuffer(true, [frontDepth], sharedDepth);\r\n const opacityFramebuffer = device.pool.createTemporalFramebuffer(true, [result], null);\r\n // The framebuffers hold the references now; these drop the fetch counts so\r\n // both textures return to the pool when the frame ends.\r\n device.pool.releaseTexture(frontDepth);\r\n device.pool.releaseTexture(result);\r\n shadowMapParams.implData = {\r\n frontDepth,\r\n result,\r\n depthFramebuffer,\r\n opacityFramebuffer\r\n } satisfies DOMImplData;\r\n shadowMapParams.shadowMap = result;\r\n shadowMapParams.shadowMapSampler = result.getDefaultSampler(false);\r\n this._resourceDirty = false;\r\n }\r\n postRenderShadowMap(_shadowMapParams: ShadowMapParams) {}\r\n getShaderHash() {\r\n // The two geometry passes emit different caster fragments and the shadow pass\r\n // keys its programs on this hash, so the pass index has to appear in it. The\r\n // kernel is unrolled into the receiver, so it belongs here too.\r\n return `${DOM_LAYER_COUNT}_${this._geometryPass}_${this._filterSize}`;\r\n }\r\n declareCasterUniforms(scope: PBGlobalScope, _shadowMapParams: ShadowMapParams) {\r\n if (this._geometryPass !== 1) {\r\n return;\r\n }\r\n const pb = scope.$builder;\r\n // sampleType before uniform(), matching how the receiver's shadow map is\r\n // declared: the binding is created from the accumulated descriptor.\r\n const tex = pb.tex2D();\r\n tex.sampleType('unfilterable-float');\r\n scope[UNIFORM_NAME_DOM_FRONT_DEPTH] = tex.uniform(0);\r\n }\r\n applyCasterUniforms(bindGroup: BindGroup, shadowMapParams: ShadowMapParams) {\r\n if (this._geometryPass !== 1) {\r\n return;\r\n }\r\n const implData = shadowMapParams.implData as DOMImplData;\r\n bindGroup.setTexture(\r\n UNIFORM_NAME_DOM_FRONT_DEPTH,\r\n implData.frontDepth,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n }\r\n /**\r\n * How far a depth lies behind the frontmost strand, in layer-span units.\r\n *\r\n * @remarks\r\n * Both callers measure \"deeper into the hair than z0\", but which direction that\r\n * is depends on the depth encoding: under reverse-Z a farther surface has the\r\n * *smaller* value, so the plain subtraction is negative for every fragment\r\n * behind the front and the clamp below flattens the whole technique to no\r\n * shadow at all.\r\n * @internal\r\n */\r\n private layerCoord(\r\n scope: PBInsideFunctionScope,\r\n depth: PBShaderExp,\r\n z0: PBShaderExp,\r\n layerSpan: PBShaderExp\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n const delta = REVERSE_Z ? pb.sub(z0, depth) : pb.sub(depth, z0);\r\n return pb.div(pb.max(delta, 0), layerSpan);\r\n }\r\n /**\r\n * Caster output.\r\n *\r\n * Pass 0 writes the frontmost depth. Pass 1 writes this fragment's optical depth\r\n * into the layers behind it, for additive blending to sum, and carries z0\r\n * through alpha so the receiver can find where the layers start.\r\n */\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n alpha: Nullable<PBShaderExp>\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const geometryPass = this._geometryPass;\r\n // Alpha travels as a parameter. Reaching into the caller's scope for its\r\n // `outColor` would be reading a local of a different shader function, and the\r\n // two cases that matter - an opaque caster and a fully transparent one - are\r\n // the same value there.\r\n const hasAlpha = geometryPass === 1 && !!alpha;\r\n const funcName = `lib_domCasterOutput_${geometryPass}_${hasAlpha ? 'a' : 'o'}`;\r\n const params = hasAlpha ? [pb.vec3('worldPos'), pb.float('alpha')] : [pb.vec3('worldPos')];\r\n pb.func(funcName, params, function () {\r\n this.$l.depth = that.casterDepth(shadowMapParams, this, this.worldPos);\r\n if (geometryPass === 0) {\r\n this.$return(pb.vec4(this.depth, 0, 0, 1));\r\n } else {\r\n this.$l.z0 = pb.textureLoad(\r\n this[UNIFORM_NAME_DOM_FRONT_DEPTH],\r\n pb.ivec2(this.$builtins.fragCoord.xy),\r\n 0\r\n ).x;\r\n this.$l.layerSpan = ShaderHelper.getShadowImplParams(this).x;\r\n // Distance behind the frontmost strand, in layer-span units. A fragment at\r\n // or in front of z0 lands at zero and fills every layer.\r\n this.$l.t = that.layerCoord(this, this.depth, this.z0, this.layerSpan);\r\n // Layer k's far boundary sits at (k+1)/3 of the span, and a fragment\r\n // contributes to every layer whose boundary lies behind it. The last\r\n // layer has no far boundary: it extends to the end of the caster volume,\r\n // so a fragment deeper than the span still lands in it and the third\r\n // layer holds the cumulative absorption of *everything* behind z0.\r\n // Dropping deep fragments instead - step(t, 1) - deletes the hair behind\r\n // the front slice from the map entirely, and any receiver deeper than\r\n // the span reads only that slice: wherever it happens to be sparse, the\r\n // middle of a dense backlit groom comes out fully lit in blotches.\r\n this.$l.mask = pb.vec3(pb.step(this.t, 1 / 3), pb.step(this.t, 2 / 3), 1);\r\n // A caster that computes no fragment colour covers fully.\r\n this.$l.casterAlpha = hasAlpha ? this.alpha : pb.float(1);\r\n // Optical depth rather than raw coverage, because what has to be additive\r\n // here is the exponent, not the alpha. Compositing N layers multiplies\r\n // their transmittances - prod(1 - a) - and blending can only sum, so each\r\n // fragment contributes -log(1 - a) and the receiver's exp(-sum) reproduces\r\n // that product exactly.\r\n //\r\n // Summing alpha instead makes exp(-sum) an approximation that only holds\r\n // while alpha is small, which is true of a sub-pixel strand and false of\r\n // anything solid: a single opaque caster would sum to 1 and shadow to\r\n // exp(-1), a 37% grey rather than black.\r\n //\r\n // The floor bounds what alpha = 1 encodes. It has to be finite to blend,\r\n // and 0.001 transmittance is already black; it also leaves room for\r\n // several opaque layers to stack without leaving half precision.\r\n this.$l.opticalDepth = pb.neg(pb.log(pb.max(pb.sub(1, this.casterAlpha), DOM_MIN_TRANSMITTANCE)));\r\n this.$return(pb.vec4(pb.mul(this.mask, this.opticalDepth), this.z0));\r\n }\r\n });\r\n const global = pb.getGlobalScope();\r\n return (hasAlpha ? global[funcName](worldPos, alpha!) : global[funcName](worldPos)) as PBShaderExp;\r\n }\r\n /**\r\n * Normalized light-space depth of a caster fragment, in the encoding the\r\n * receiver reconstructs.\r\n * @internal\r\n */\r\n private casterDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n const lightSpacePos = pb.mul(ShaderHelper.getLightViewMatrixForShadow(scope), pb.vec4(worldPos, 1));\r\n return pb.clamp(\r\n pb.div(pb.length(lightSpacePos.xyz), ShaderHelper.getLightPositionAndRangeForShadow(scope).w),\r\n 0,\r\n 1\r\n );\r\n }\r\n return pb.emulateDepthClamp ? pb.clamp(scope.$inputs.clamppedDepth, 0, 1) : scope.$builtins.fragCoord.z;\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 funcName = 'lib_computeShadowDOM';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcName, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\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.inRange = 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.inRange, function () {\r\n // A single tap needs no bias: it reads the texel the receiver itself\r\n // wrote, so its own surface sits exactly at z0 and contributes nothing.\r\n // A kernel breaks that. Neighbouring texels record the frontmost surface\r\n // at their own position, which on anything sloped is nearer the light\r\n // than the receiver, and the receiver then reads itself as being behind a\r\n // caster. On a solid surface that is the full jump from no absorption to\r\n // all of it, so it shows up as the banding an unbiased shadow map has.\r\n if (that._filterSize > 1) {\r\n this.$l.bias = 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.bias, true);\r\n }\r\n this.shadow = that.transmittance(this, this.shadowCoord);\r\n });\r\n this.$return(this.shadow);\r\n });\r\n return pb.getGlobalScope()[funcName](shadowVertex, NdotL) as PBShaderExp;\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 // Cascades would need a depth and a layer set per split, which no longer fits\r\n // the one texture the single shadow-map binding allows. Callers keep working\r\n // by shadowing from the first cascade's map.\r\n return this.computeShadow(shadowMapParams, scope, shadowVertex, NdotL);\r\n }\r\n /**\r\n * Fraction of light surviving the hair in front of the receiver, averaged over\r\n * the filter kernel.\r\n *\r\n * @remarks\r\n * The averaging is over transmittance, one value per tap, rather than over the\r\n * stored texels. Blending the texels first would interpolate `z0` across the\r\n * silhouette of the groom, where one side holds a real strand depth and the\r\n * other the empty-texel sentinel, and the depth halfway between them describes\r\n * nothing - every layer reading taken against it would be measured from the\r\n * wrong origin. Averaging the results instead asks a well-posed question of\r\n * each texel and combines only the answers, which is also what makes this an\r\n * antialiased edge rather than a blurred one.\r\n * @internal\r\n */\r\n private transmittance(scope: PBInsideFunctionScope, shadowCoord: PBShaderExp): PBShaderExp {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const size = this._filterSize;\r\n const funcName = `lib_domTransmittance_${size}`;\r\n pb.func(funcName, [pb.vec3('shadowCoord')], function () {\r\n if (size <= 1) {\r\n this.$return(that.tapTransmittance(this, this.shadowCoord.xy, this.shadowCoord.z));\r\n } else {\r\n // cameraParams.z carries the shadow map size, and this implementation\r\n // never splits into cascades, so the map is exactly that wide.\r\n this.$l.texelSize = pb.div(1, ShaderHelper.getShadowCameraParams(this).z);\r\n this.$l.sum = pb.float(0);\r\n this.$l.tapUV = pb.vec2();\r\n const radius = (size - 1) / 2;\r\n for (let y = -radius; y <= radius; y++) {\r\n for (let x = -radius; x <= radius; x++) {\r\n this.tapUV = pb.add(this.shadowCoord.xy, pb.mul(pb.vec2(x, y), this.texelSize));\r\n this.sum = pb.add(this.sum, that.tapTransmittance(this, this.tapUV, this.shadowCoord.z));\r\n }\r\n }\r\n this.$return(pb.div(this.sum, size * size));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcName](shadowCoord) as PBShaderExp;\r\n }\r\n /**\r\n * Transmittance from a single shadow map texel.\r\n * @internal\r\n */\r\n private tapTransmittance(\r\n scope: PBInsideFunctionScope,\r\n uv: PBShaderExp,\r\n receiverDepth: PBShaderExp\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const funcName = 'lib_domTap';\r\n pb.func(funcName, [pb.vec2('uv'), pb.float('receiverDepth')], function () {\r\n this.$l.texel = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.uv, 0);\r\n this.$l.layers = this.texel.rgb;\r\n this.$l.z0 = this.texel.a;\r\n this.$l.layerSpan = ShaderHelper.getShadowImplParams(this).x;\r\n this.$l.density = ShaderHelper.getShadowImplParams(this).y;\r\n this.$l.t = that.layerCoord(this, this.receiverDepth, this.z0, this.layerSpan);\r\n // The layers are cumulative, so opacity at an arbitrary depth is a lerp\r\n // between the two bracketing layer values. Scaling t by the layer count puts\r\n // the integer part on the near layer and the fraction between the pair.\r\n this.$l.scaled = pb.clamp(pb.mul(this.t, DOM_LAYER_COUNT), 0, DOM_LAYER_COUNT);\r\n this.$l.index = pb.floor(this.scaled);\r\n this.$l.frac = pb.sub(this.scaled, this.index);\r\n // Nothing has been traversed before the first layer, so the near value at\r\n // index 0 is zero rather than layers.x.\r\n this.$l.near = pb.float(0);\r\n this.$l.far = this.layers.x;\r\n this.$if(pb.greaterThanEqual(this.index, 2), function () {\r\n this.near = this.layers.y;\r\n this.far = this.layers.z;\r\n }).$elseif(pb.greaterThanEqual(this.index, 1), function () {\r\n this.near = this.layers.x;\r\n this.far = this.layers.y;\r\n });\r\n // Optical depth is what accumulates linearly through a medium, so the lerp\r\n // between two layer readings is meaningful in a way that lerping stored\r\n // alphas would not have been.\r\n this.$l.absorption = pb.mix(this.near, this.far, this.frac);\r\n // Beer-Lambert. With the casters recording -log(1 - alpha) this is exactly\r\n // prod(1 - alpha) over everything crossed, so a solid caster reaches black\r\n // and a stack of thin strands reaches the same value alpha compositing them\r\n // would have.\r\n this.$return(pb.exp(pb.neg(pb.mul(this.absorption, this.density))));\r\n });\r\n return pb.getGlobalScope()[funcName](uv, receiverDepth) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["DOM_LAYER_COUNT","UNIFORM_NAME_DOM_FRONT_DEPTH","DOM_MIN_TRANSMITTANCE","DOM","ShadowImpl","layerDistance","density","filterSize","_layerDistance","_density","_filterSize","clampFilterSize","_paramsScratch","Vector4","_geometryPass","_depthRange","val","getType","resourceDirty","_resourceDirty","getShadowMapBorder","getDepthScale","setDepthScale","_val","getParams","out","result","setXYZW","getGeometryPassCount","supportsCascades","clipsCasterAlpha","beginGeometryPass","shadowMapParams","pass","implData","range","cameraParams","y","x","getDevice","setFramebuffer","depthFramebuffer","opacityFramebuffer","setCasterRenderStates","_shadowMapParams","stateSet","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","getShadowMapClearColor","REVERSE_Z","farthest","getShadowMapColorFormat","getShadowMapDepthFormat","preferredShadowMapDepthFormat","useNativeShadowMap","getShadowMap","caps","getDeviceCaps","textureCaps","supportFloatColorBuffer","supportFloatBlending","supportHalfFloatColorBuffer","doUpdateResources","device","sharedDepth","shadowMapFramebuffer","getDepthAttachment","width","height","format","colorFormat","frontDepth","pool","fetchTemporalTexture2D","createTemporalFramebuffer","releaseTexture","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getShaderHash","declareCasterUniforms","scope","pb","$builder","tex","tex2D","sampleType","uniform","applyCasterUniforms","bindGroup","setTexture","fetchSampler","layerCoord","depth","z0","layerSpan","delta","sub","div","max","computeShadowMapDepth","worldPos","alpha","that","geometryPass","hasAlpha","funcName","params","vec3","float","func","$l","casterDepth","$return","vec4","textureLoad","ivec2","$builtins","fragCoord","xy","ShaderHelper","getShadowImplParams","t","mask","step","casterAlpha","opticalDepth","neg","log","mul","global","getGlobalScope","lightType","LIGHT_TYPE_POINT","lightSpacePos","getLightViewMatrixForShadow","clamp","length","xyz","getLightPositionAndRangeForShadow","w","emulateDepthClamp","$inputs","clamppedDepth","z","computeShadow","shadowVertex","NdotL","shadowCoord","ndcToShadowCoord3","inRange","all","bvec2","bvec4","greaterThanEqual","lessThanEqual","shadowCoordDepthInRange","shadow","$if","bias","computeShadowBias","applyShadowDepthBias","transmittance","computeShadowCSM","_split","size","tapTransmittance","texelSize","getShadowCameraParams","sum","tapUV","vec2","radius","add","uv","receiverDepth","texel","textureSampleLevel","layers","rgb","a","scaled","index","floor","frac","near","far","$elseif","absorption","mix","exp"],"mappings":"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"}
|
package/dist/shadow/pcf_opt.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ShadowImpl } from './shadow_impl.js';
|
|
2
2
|
import { decodeNormalizedFloatFromRGBA } from '../shaders/misc.js';
|
|
3
|
-
import { computeShadowMapDepth, ndcToShadowCoord, shadowCoordDepthInRange,
|
|
3
|
+
import { computeShadowMapDepth, ndcToShadowCoord, shadowCoordDepthInRange, applyShadowDepthBias, filterShadowPCF } from '../shaders/shadow.js';
|
|
4
4
|
import { LIGHT_TYPE_POINT } from '../values.js';
|
|
5
5
|
import { ShaderHelper } from '../material/shader/helper.js';
|
|
6
6
|
import { computeShadowBiasCSM, computeShadowBias } from './shader.js';
|
|
@@ -74,11 +74,10 @@ import { Vector4, REVERSE_Z } from '@zephyr3d/base';
|
|
|
74
74
|
this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
|
|
75
75
|
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)));
|
|
76
76
|
this.$l.shadow = pb.float(1);
|
|
77
|
-
this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);
|
|
78
77
|
this.$if(this.inShadow, function() {
|
|
79
78
|
this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);
|
|
80
79
|
this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);
|
|
81
|
-
this.shadow = filterShadowPCF(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, that._kernelSize, this.shadowCoord, this.
|
|
80
|
+
this.shadow = filterShadowPCF(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, that._kernelSize, this.shadowCoord, this.split);
|
|
82
81
|
});
|
|
83
82
|
this.$return(this.shadow);
|
|
84
83
|
});
|
|
@@ -110,11 +109,10 @@ import { Vector4, REVERSE_Z } from '@zephyr3d/base';
|
|
|
110
109
|
this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
|
|
111
110
|
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)));
|
|
112
111
|
this.$l.shadow = pb.float(1);
|
|
113
|
-
this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);
|
|
114
112
|
this.$if(this.inShadow, function() {
|
|
115
113
|
this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.shadowCoord.z, this.NdotL, false);
|
|
116
114
|
this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);
|
|
117
|
-
this.shadow = filterShadowPCF(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, that._kernelSize, this.shadowCoord
|
|
115
|
+
this.shadow = filterShadowPCF(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, that._kernelSize, this.shadowCoord);
|
|
118
116
|
});
|
|
119
117
|
this.$return(this.shadow);
|
|
120
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcf_opt.js","sources":["../../src/shadow/pcf_opt.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureFormat, TextureSampler } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n computeReceiverPlaneDepthBias,\r\n filterShadowPCF,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class PCFOPT extends ShadowImpl {\r\n protected _kernelSize: number;\r\n protected _shadowSampler: Nullable<TextureSampler>;\r\n constructor(kernelSize?: number) {\r\n super();\r\n this._kernelSize = kernelSize ?? 5;\r\n this._shadowSampler = null;\r\n }\r\n get kernelSize() {\r\n return this._kernelSize;\r\n }\r\n set kernelSize(val) {\r\n val = val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n this._kernelSize = val;\r\n }\r\n getType() {\r\n return 'pcf-opt' as const;\r\n }\r\n dispose() {\r\n this._shadowSampler = null;\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._kernelSize;\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 `${this._kernelSize}`;\r\n }\r\n getShadowMapColorFormat(shadowMapParams: ShadowMapParams): Nullable<TextureFormat> {\r\n return this.useNativeShadowMap(shadowMapParams) ? null : 'rgba8unorm';\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams): TextureFormat {\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 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.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n that._kernelSize,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\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 const that = this;\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 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(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n that._kernelSize,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias\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 /** @internal */\r\n sampleShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = `lib_sampleShadowMapOPT`;\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords,\r\n applyShadowDepthBias(this, this.z, this.bias, true)\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n /** @internal */\r\n sampleShadowMapCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n split: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMapCSM = 'lib_sampleShadowMapCSMOPT';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameSampleShadowMapCSM,\r\n [pb.vec4('coords'), pb.int('split'), pb.float('z'), pb.float('bias')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.distance = applyShadowDepthBias(this, this.z, this.bias, true);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n this.distance\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), this.coords.xy, this.distance),\r\n 0,\r\n 1\r\n )\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.coords.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords.xy, 0);\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$return(\r\n REVERSE_Z ? pb.step(this.shadowTex.x, this.distance) : pb.step(this.distance, this.shadowTex.x)\r\n );\r\n }\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameSampleShadowMapCSM](coords, split, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCFOPT","ShadowImpl","_kernelSize","_shadowSampler","kernelSize","val","getType","dispose","resourceDirty","getShadowMapBorder","_shadowMapParams","getParams","out","Vector4","zero","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","receiverPlaneDepthBias","computeReceiverPlaneDepthBias","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCF","lightType","$return","getGlobalScope","computeShadow","funcNameComputeShadow","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","xy","maxZ","max","abs","distance","linearDepthToNonLinear","computeShadowBias","sampleShadowMap","length","getDevice","type","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","clamp","textureSampleCompareLevel","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step","sampleShadowMapCSM","funcNameSampleShadowMapCSM","isTexture2DArray","textureArraySampleCompareLevel","textureArraySampleLevel","REVERSE_Z"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pcf_opt.js","sources":["../../src/shadow/pcf_opt.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureFormat, TextureSampler } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCF,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class PCFOPT extends ShadowImpl {\r\n protected _kernelSize: number;\r\n protected _shadowSampler: Nullable<TextureSampler>;\r\n constructor(kernelSize?: number) {\r\n super();\r\n this._kernelSize = kernelSize ?? 5;\r\n this._shadowSampler = null;\r\n }\r\n get kernelSize() {\r\n return this._kernelSize;\r\n }\r\n set kernelSize(val) {\r\n val = val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n this._kernelSize = val;\r\n }\r\n getType() {\r\n return 'pcf-opt' as const;\r\n }\r\n dispose() {\r\n this._shadowSampler = null;\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._kernelSize;\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 `${this._kernelSize}`;\r\n }\r\n getShadowMapColorFormat(shadowMapParams: ShadowMapParams): Nullable<TextureFormat> {\r\n return this.useNativeShadowMap(shadowMapParams) ? null : 'rgba8unorm';\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams): TextureFormat {\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 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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n that._kernelSize,\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 const that = this;\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 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(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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 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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n that._kernelSize,\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 getDevice().type !== 'webgl';\r\n }\r\n /** @internal */\r\n sampleShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = `lib_sampleShadowMapOPT`;\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords,\r\n applyShadowDepthBias(this, this.z, this.bias, true)\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n /** @internal */\r\n sampleShadowMapCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n split: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMapCSM = 'lib_sampleShadowMapCSMOPT';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameSampleShadowMapCSM,\r\n [pb.vec4('coords'), pb.int('split'), pb.float('z'), pb.float('bias')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.distance = applyShadowDepthBias(this, this.z, this.bias, true);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n this.distance\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), this.coords.xy, this.distance),\r\n 0,\r\n 1\r\n )\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.coords.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords.xy, 0);\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$return(\r\n REVERSE_Z ? pb.step(this.shadowTex.x, this.distance) : pb.step(this.distance, this.shadowTex.x)\r\n );\r\n }\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameSampleShadowMapCSM](coords, split, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCFOPT","ShadowImpl","_kernelSize","_shadowSampler","kernelSize","val","getType","dispose","resourceDirty","getShadowMapBorder","_shadowMapParams","getParams","out","Vector4","zero","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCF","lightType","$return","getGlobalScope","computeShadow","funcNameComputeShadow","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","xy","maxZ","max","abs","distance","linearDepthToNonLinear","computeShadowBias","sampleShadowMap","length","getDevice","type","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","clamp","textureSampleCompareLevel","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step","sampleShadowMapCSM","funcNameSampleShadowMapCSM","isTexture2DArray","textureArraySampleCompareLevel","textureArraySampleLevel","REVERSE_Z"],"mappings":"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"}
|
package/dist/shadow/pcf_pd.js
CHANGED
|
@@ -95,7 +95,7 @@ import { Vector4, REVERSE_Z } from '@zephyr3d/base';
|
|
|
95
95
|
this.$if(this.inShadow, function() {
|
|
96
96
|
this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);
|
|
97
97
|
this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);
|
|
98
|
-
this.shadow = filterShadowPCF(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, kernelSize, this.shadowCoord,
|
|
98
|
+
this.shadow = filterShadowPCF(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, kernelSize, this.shadowCoord, this.split);
|
|
99
99
|
});
|
|
100
100
|
this.$return(this.shadow);
|
|
101
101
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcf_pd.js","sources":["../../src/shadow/pcf_pd.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureSampler } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCF,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class PCFPD extends ShadowImpl {\r\n private static readonly SHADER_VERSION = 3;\r\n protected _tapCount: number;\r\n protected _sampleRadius: number;\r\n protected _shadowSampler: Nullable<TextureSampler>;\r\n constructor(tapCount?: number, sampleRadius?: number) {\r\n super();\r\n this._tapCount = tapCount ?? 3;\r\n this._sampleRadius = sampleRadius ?? 1;\r\n this._shadowSampler = null;\r\n }\r\n get tapCount() {\r\n return this._tapCount;\r\n }\r\n set tapCount(val) {\r\n this._tapCount = val;\r\n }\r\n getType() {\r\n return 'pcf-pd' as const;\r\n }\r\n dispose() {\r\n this._shadowSampler = null;\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n private getPCFKernelSize() {\r\n if (this._sampleRadius >= 4 || this._tapCount >= 32) {\r\n return 7;\r\n }\r\n if (this._sampleRadius >= 2 || this._tapCount >= 12) {\r\n return 5;\r\n }\r\n return 3;\r\n }\r\n getParams(out?: Vector4) {\r\n return out ?? Vector4.zero();\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return Math.max(this._sampleRadius + 1, this.getPCFKernelSize());\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 this._sampleRadius;\r\n }\r\n setDepthScale(val: number) {\r\n this._sampleRadius = val;\r\n }\r\n getShaderHash() {\r\n return `${PCFPD.SHADER_VERSION}-${this._tapCount}-${this._sampleRadius}`;\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 return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? device.type === 'webgl'\r\n ? 'rgba16f'\r\n : 'r16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? device.type === 'webgl'\r\n ? 'rgba32f'\r\n : 'r32f'\r\n : 'rgba8unorm';\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 kernelSize = this.getPCFKernelSize();\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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\r\n this.shadowCoord,\r\n undefined,\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 const that = this;\r\n const kernelSize = this.getPCFKernelSize();\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 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(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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 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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\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 getDevice().type !== 'webgl';\r\n }\r\n /** @internal */\r\n sampleShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_sampleShadowMapPD';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords,\r\n applyShadowDepthBias(this, this.z, this.bias, true)\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n /** @internal */\r\n sampleShadowMapCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n split: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMapCSM = 'lib_sampleShadowMapCSMPD';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameSampleShadowMapCSM,\r\n [pb.vec4('coords'), pb.int('split'), pb.float('z'), pb.float('bias')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.distance = applyShadowDepthBias(this, this.z, this.bias, true);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n this.distance\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), this.coords.xy, this.distance),\r\n 0,\r\n 1\r\n )\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.coords.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords.xy, 0);\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$return(\r\n REVERSE_Z ? pb.step(this.shadowTex.x, this.distance) : pb.step(this.distance, this.shadowTex.x)\r\n );\r\n }\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameSampleShadowMapCSM](coords, split, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCFPD","ShadowImpl","SHADER_VERSION","_tapCount","_sampleRadius","_shadowSampler","tapCount","sampleRadius","val","getType","dispose","resourceDirty","getPCFKernelSize","getParams","out","Vector4","zero","getShadowMapBorder","_shadowMapParams","Math","max","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","getShaderHash","getShadowMapColorFormat","device","getDevice","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","type","supportFloatColorBuffer","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","kernelSize","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCF","lightType","undefined","$return","getGlobalScope","computeShadow","funcNameComputeShadow","that","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","xy","maxZ","abs","distance","linearDepthToNonLinear","computeShadowBias","sampleShadowMap","length","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","clamp","textureSampleCompareLevel","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step","sampleShadowMapCSM","funcNameSampleShadowMapCSM","isTexture2DArray","textureArraySampleCompareLevel","textureArraySampleLevel","REVERSE_Z"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pcf_pd.js","sources":["../../src/shadow/pcf_pd.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureSampler } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCF,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class PCFPD extends ShadowImpl {\r\n private static readonly SHADER_VERSION = 3;\r\n protected _tapCount: number;\r\n protected _sampleRadius: number;\r\n protected _shadowSampler: Nullable<TextureSampler>;\r\n constructor(tapCount?: number, sampleRadius?: number) {\r\n super();\r\n this._tapCount = tapCount ?? 3;\r\n this._sampleRadius = sampleRadius ?? 1;\r\n this._shadowSampler = null;\r\n }\r\n get tapCount() {\r\n return this._tapCount;\r\n }\r\n set tapCount(val) {\r\n this._tapCount = val;\r\n }\r\n getType() {\r\n return 'pcf-pd' as const;\r\n }\r\n dispose() {\r\n this._shadowSampler = null;\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n private getPCFKernelSize() {\r\n if (this._sampleRadius >= 4 || this._tapCount >= 32) {\r\n return 7;\r\n }\r\n if (this._sampleRadius >= 2 || this._tapCount >= 12) {\r\n return 5;\r\n }\r\n return 3;\r\n }\r\n getParams(out?: Vector4) {\r\n return out ?? Vector4.zero();\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return Math.max(this._sampleRadius + 1, this.getPCFKernelSize());\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 this._sampleRadius;\r\n }\r\n setDepthScale(val: number) {\r\n this._sampleRadius = val;\r\n }\r\n getShaderHash() {\r\n return `${PCFPD.SHADER_VERSION}-${this._tapCount}-${this._sampleRadius}`;\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 return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? device.type === 'webgl'\r\n ? 'rgba16f'\r\n : 'r16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? device.type === 'webgl'\r\n ? 'rgba32f'\r\n : 'r32f'\r\n : 'rgba8unorm';\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 kernelSize = this.getPCFKernelSize();\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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\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 const that = this;\r\n const kernelSize = this.getPCFKernelSize();\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 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(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\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 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 = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\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 getDevice().type !== 'webgl';\r\n }\r\n /** @internal */\r\n sampleShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_sampleShadowMapPD';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords,\r\n applyShadowDepthBias(this, this.z, this.bias, true)\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n /** @internal */\r\n sampleShadowMapCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n split: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMapCSM = 'lib_sampleShadowMapCSMPD';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameSampleShadowMapCSM,\r\n [pb.vec4('coords'), pb.int('split'), pb.float('z'), pb.float('bias')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.distance = applyShadowDepthBias(this, this.z, this.bias, true);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n this.distance\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), this.coords.xy, this.distance),\r\n 0,\r\n 1\r\n )\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.coords.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords.xy, 0);\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$return(\r\n REVERSE_Z ? pb.step(this.shadowTex.x, this.distance) : pb.step(this.distance, this.shadowTex.x)\r\n );\r\n }\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameSampleShadowMapCSM](coords, split, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCFPD","ShadowImpl","SHADER_VERSION","_tapCount","_sampleRadius","_shadowSampler","tapCount","sampleRadius","val","getType","dispose","resourceDirty","getPCFKernelSize","getParams","out","Vector4","zero","getShadowMapBorder","_shadowMapParams","Math","max","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","getShaderHash","getShadowMapColorFormat","device","getDevice","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","type","supportFloatColorBuffer","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","kernelSize","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCF","lightType","$return","getGlobalScope","computeShadow","funcNameComputeShadow","that","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","xy","maxZ","abs","distance","linearDepthToNonLinear","computeShadowBias","sampleShadowMap","length","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","clamp","textureSampleCompareLevel","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step","sampleShadowMapCSM","funcNameSampleShadowMapCSM","isTexture2DArray","textureArraySampleCompareLevel","textureArraySampleLevel","REVERSE_Z"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LIGHT_TYPE_SPOT, LIGHT_TYPE_POINT } from '../values.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Receiver-dependent tuning shared by the depth bias and the normal offset.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* These read nothing but the shader scope, deliberately: the depth bias lives in
|
|
8
|
+
* `shadow/shader.ts` and the normal offset in `material/shader/helper.ts`, and a
|
|
9
|
+
* shared leaf module is what keeps those two from importing each other.
|
|
10
|
+
*/ /** @internal */ function isMaskedPerspectiveShadowLight(scope, lightType) {
|
|
11
|
+
const alphaCutoff = scope.zAlphaCutoff;
|
|
12
|
+
return !!alphaCutoff && (lightType === LIGHT_TYPE_SPOT || lightType === LIGHT_TYPE_POINT);
|
|
13
|
+
}
|
|
14
|
+
/** @internal */ function getShadowReceiverBiasFactor(scope) {
|
|
15
|
+
const pb = scope.$builder;
|
|
16
|
+
const alphaCutoff = scope.zAlphaCutoff;
|
|
17
|
+
if (alphaCutoff) {
|
|
18
|
+
// Thin masked geometry such as layered hair cards needs a tighter receiver bias,
|
|
19
|
+
// otherwise nearby layers lose self-shadow before the shadow map is even sampled.
|
|
20
|
+
const cutoff = pb.clamp(alphaCutoff, 0, 1);
|
|
21
|
+
return pb.mix(0.22, 0.4, cutoff);
|
|
22
|
+
}
|
|
23
|
+
return pb.float(1);
|
|
24
|
+
}
|
|
25
|
+
/** @internal */ function getShadowReceiverNoL(scope, NdotL, lightType) {
|
|
26
|
+
const pb = scope.$builder;
|
|
27
|
+
const alphaCutoff = scope.zAlphaCutoff;
|
|
28
|
+
if (alphaCutoff) {
|
|
29
|
+
// Layered masked cards should not explode slope bias at grazing angles.
|
|
30
|
+
// This is especially visible for back / rim spot lights on hair cards.
|
|
31
|
+
const cutoff = pb.clamp(alphaCutoff, 0, 1);
|
|
32
|
+
if (lightType != null && isMaskedPerspectiveShadowLight(scope, lightType)) {
|
|
33
|
+
return pb.max(NdotL, pb.mix(0.85, 0.95, cutoff));
|
|
34
|
+
}
|
|
35
|
+
return pb.max(NdotL, pb.mix(0.45, 0.65, cutoff));
|
|
36
|
+
}
|
|
37
|
+
return NdotL;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { getShadowReceiverBiasFactor, getShadowReceiverNoL, isMaskedPerspectiveShadowLight };
|
|
41
|
+
//# sourceMappingURL=receiver_bias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receiver_bias.js","sources":["../../src/shadow/receiver_bias.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\n\r\n/**\r\n * Receiver-dependent tuning shared by the depth bias and the normal offset.\r\n *\r\n * @remarks\r\n * These read nothing but the shader scope, deliberately: the depth bias lives in\r\n * `shadow/shader.ts` and the normal offset in `material/shader/helper.ts`, and a\r\n * shared leaf module is what keeps those two from importing each other.\r\n */\r\n\r\n/** @internal */\r\nexport function isMaskedPerspectiveShadowLight(scope: PBInsideFunctionScope, lightType: number) {\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n return !!alphaCutoff && (lightType === LIGHT_TYPE_SPOT || lightType === LIGHT_TYPE_POINT);\r\n}\r\n\r\n/** @internal */\r\nexport function getShadowReceiverBiasFactor(scope: PBInsideFunctionScope) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff) {\r\n // Thin masked geometry such as layered hair cards needs a tighter receiver bias,\r\n // otherwise nearby layers lose self-shadow before the shadow map is even sampled.\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n return pb.mix(0.22, 0.4, cutoff) as PBShaderExp;\r\n }\r\n return pb.float(1) as PBShaderExp;\r\n}\r\n\r\n/** @internal */\r\nexport function getShadowReceiverNoL(scope: PBInsideFunctionScope, NdotL: PBShaderExp, lightType?: number) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff) {\r\n // Layered masked cards should not explode slope bias at grazing angles.\r\n // This is especially visible for back / rim spot lights on hair cards.\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n if (lightType != null && isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n return pb.max(NdotL, pb.mix(0.85, 0.95, cutoff)) as PBShaderExp;\r\n }\r\n return pb.max(NdotL, pb.mix(0.45, 0.65, cutoff)) as PBShaderExp;\r\n }\r\n return NdotL as PBShaderExp;\r\n}\r\n"],"names":["isMaskedPerspectiveShadowLight","scope","lightType","alphaCutoff","zAlphaCutoff","LIGHT_TYPE_SPOT","LIGHT_TYPE_POINT","getShadowReceiverBiasFactor","pb","$builder","cutoff","clamp","mix","float","getShadowReceiverNoL","NdotL","max"],"mappings":";;AAGA;;;;;;;AAOC,qBAGM,SAASA,8BAA+BC,CAAAA,KAA4B,EAAEC,SAAiB,EAAA;IAC5F,MAAMC,WAAAA,GAAc,KAACF,CAAiEG,YAAY;AAClG,IAAA,OAAO,CAAC,CAACD,WAAAA,KAAgBD,SAAcG,KAAAA,eAAAA,IAAmBH,cAAcI,gBAAe,CAAA;AACzF;AAEA,iBACO,SAASC,2BAAAA,CAA4BN,KAA4B,EAAA;IACtE,MAAMO,EAAAA,GAAKP,MAAMQ,QAAQ;IACzB,MAAMN,WAAAA,GAAc,KAACF,CAAiEG,YAAY;AAClG,IAAA,IAAID,WAAa,EAAA;;;AAGf,QAAA,MAAMO,MAASF,GAAAA,EAAAA,CAAGG,KAAK,CAACR,aAAa,CAAG,EAAA,CAAA,CAAA;AACxC,QAAA,OAAOK,EAAGI,CAAAA,GAAG,CAAC,IAAA,EAAM,GAAKF,EAAAA,MAAAA,CAAAA;AAC3B;IACA,OAAOF,EAAAA,CAAGK,KAAK,CAAC,CAAA,CAAA;AAClB;AAEA,iBACO,SAASC,oBAAAA,CAAqBb,KAA4B,EAAEc,KAAkB,EAAEb,SAAkB,EAAA;IACvG,MAAMM,EAAAA,GAAKP,MAAMQ,QAAQ;IACzB,MAAMN,WAAAA,GAAc,KAACF,CAAiEG,YAAY;AAClG,IAAA,IAAID,WAAa,EAAA;;;AAGf,QAAA,MAAMO,MAASF,GAAAA,EAAAA,CAAGG,KAAK,CAACR,aAAa,CAAG,EAAA,CAAA,CAAA;AACxC,QAAA,IAAID,SAAa,IAAA,IAAA,IAAQF,8BAA+BC,CAAAA,KAAAA,EAAOC,SAAY,CAAA,EAAA;YACzE,OAAOM,EAAAA,CAAGQ,GAAG,CAACD,KAAAA,EAAOP,GAAGI,GAAG,CAAC,MAAM,IAAMF,EAAAA,MAAAA,CAAAA,CAAAA;AAC1C;QACA,OAAOF,EAAAA,CAAGQ,GAAG,CAACD,KAAAA,EAAOP,GAAGI,GAAG,CAAC,MAAM,IAAMF,EAAAA,MAAAA,CAAAA,CAAAA;AAC1C;IACA,OAAOK,KAAAA;AACT;;;;"}
|
package/dist/shadow/shader.js
CHANGED
|
@@ -1,53 +1,7 @@
|
|
|
1
1
|
import { ShaderHelper } from '../material/shader/helper.js';
|
|
2
|
-
import '../
|
|
3
|
-
import '
|
|
4
|
-
import '../material/unlit.js';
|
|
5
|
-
import '../material/particle.js';
|
|
6
|
-
import '../material/subsurfaceprofile.js';
|
|
7
|
-
import '../material/skin.js';
|
|
8
|
-
import '@zephyr3d/device';
|
|
9
|
-
import { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_SPOT, LIGHT_TYPE_POINT } from '../values.js';
|
|
10
|
-
import '@zephyr3d/base';
|
|
11
|
-
import '../material/meshmaterial.js';
|
|
12
|
-
import '../material/grassmaterial.js';
|
|
13
|
-
import '../material/terrain-cm.js';
|
|
14
|
-
import '../material/pbrmr.js';
|
|
15
|
-
import '../material/pbrsg.js';
|
|
16
|
-
import '../material/mtoon.js';
|
|
17
|
-
import '../material/pbrblueprint.js';
|
|
18
|
-
import '../material/sprite.js';
|
|
19
|
-
import '../material/sprite_std.js';
|
|
20
|
-
import '../utility/blueprint/material/texture.js';
|
|
2
|
+
import { LIGHT_TYPE_DIRECTIONAL } from '../values.js';
|
|
3
|
+
import { getShadowReceiverBiasFactor, isMaskedPerspectiveShadowLight } from './receiver_bias.js';
|
|
21
4
|
|
|
22
|
-
function getShadowReceiverBiasFactors(scope) {
|
|
23
|
-
const pb = scope.$builder;
|
|
24
|
-
const alphaCutoff = scope.zAlphaCutoff;
|
|
25
|
-
if (alphaCutoff) {
|
|
26
|
-
// Thin masked geometry such as layered hair cards needs a tighter receiver bias,
|
|
27
|
-
// otherwise nearby layers lose self-shadow before the shadow map is even sampled.
|
|
28
|
-
const cutoff = pb.clamp(alphaCutoff, 0, 1);
|
|
29
|
-
return pb.vec2(pb.mix(0.22, 0.4, cutoff), pb.mix(0.05, 0.16, cutoff));
|
|
30
|
-
}
|
|
31
|
-
return pb.vec2(1, 1);
|
|
32
|
-
}
|
|
33
|
-
function isMaskedPerspectiveShadowLight(scope, lightType) {
|
|
34
|
-
const alphaCutoff = scope.zAlphaCutoff;
|
|
35
|
-
return !!alphaCutoff && (lightType === LIGHT_TYPE_SPOT || lightType === LIGHT_TYPE_POINT);
|
|
36
|
-
}
|
|
37
|
-
function getShadowReceiverNoL(scope, NdotL, lightType) {
|
|
38
|
-
const pb = scope.$builder;
|
|
39
|
-
const alphaCutoff = scope.zAlphaCutoff;
|
|
40
|
-
if (alphaCutoff) {
|
|
41
|
-
// Layered masked cards should not explode slope bias at grazing angles.
|
|
42
|
-
// This is especially visible for back / rim spot lights on hair cards.
|
|
43
|
-
const cutoff = pb.clamp(alphaCutoff, 0, 1);
|
|
44
|
-
if (lightType != null && isMaskedPerspectiveShadowLight(scope, lightType)) {
|
|
45
|
-
return pb.max(NdotL, pb.mix(0.85, 0.95, cutoff));
|
|
46
|
-
}
|
|
47
|
-
return pb.max(NdotL, pb.mix(0.45, 0.65, cutoff));
|
|
48
|
-
}
|
|
49
|
-
return NdotL;
|
|
50
|
-
}
|
|
51
5
|
function getShadowReceiverPerspectiveBiasScale(scope, lightType, linearDepth, farNearRatio) {
|
|
52
6
|
const pb = scope.$builder;
|
|
53
7
|
const alphaCutoff = scope.zAlphaCutoff;
|
|
@@ -60,27 +14,33 @@ function getShadowReceiverPerspectiveBiasScale(scope, lightType, linearDepth, fa
|
|
|
60
14
|
}
|
|
61
15
|
return pb.mix(1, farNearRatio, linearDepth);
|
|
62
16
|
}
|
|
63
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Constant depth bias for a cascaded directional shadow.
|
|
19
|
+
*
|
|
20
|
+
* @remarks
|
|
21
|
+
* The slope-scaled term that used to occupy `depthBiasValues.y` is gone: `.y`
|
|
22
|
+
* now carries the normal offset distance, and normal offsetting (see
|
|
23
|
+
* `ShaderHelper.applyShadowNormalOffset`) is what handles receiver slope. A
|
|
24
|
+
* depth bias cannot, because the depth spanned by one texel diverges as the
|
|
25
|
+
* surface turns away from the light.
|
|
26
|
+
*/ function computeShadowBiasCSM(scope, _NdotL, split) {
|
|
64
27
|
const pb = scope.$builder;
|
|
65
|
-
|
|
66
|
-
const splitFlags = pb.vec4(pb.float(pb.equal(split, 0)), pb.float(pb.equal(split, 1)), pb.float(pb.equal(split, 2)), pb.float(pb.equal(split, 3)));
|
|
67
|
-
const depthBiasScale = pb.dot(ShaderHelper.getDepthBiasScales(scope), splitFlags);
|
|
68
|
-
const receiverBiasFactors = getShadowReceiverBiasFactors(scope);
|
|
69
|
-
const receiverNoL = getShadowReceiverNoL(scope, NdotL);
|
|
70
|
-
return pb.dot(pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL)), depthBiasScale), pb.vec2(1, 1));
|
|
28
|
+
return pb.mul(ShaderHelper.getDepthBiasValues(scope).x, getShadowReceiverBiasFactor(scope), ShaderHelper.getShadowCascadeBiasScale(scope, split));
|
|
71
29
|
}
|
|
72
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Constant depth bias for a single-cascade shadow. See {@link computeShadowBiasCSM}
|
|
32
|
+
* for why there is no slope-scaled term.
|
|
33
|
+
*/ function computeShadowBias(lightType, scope, z, _NdotL, linear) {
|
|
73
34
|
const pb = scope.$builder;
|
|
74
35
|
const depthBiasParam = ShaderHelper.getDepthBiasValues(scope);
|
|
75
|
-
const
|
|
76
|
-
const receiverNoL = getShadowReceiverNoL(scope, NdotL, lightType);
|
|
36
|
+
const receiverBiasFactor = getShadowReceiverBiasFactor(scope);
|
|
77
37
|
if (lightType === LIGHT_TYPE_DIRECTIONAL) {
|
|
78
|
-
return pb.
|
|
38
|
+
return pb.mul(depthBiasParam.x, receiverBiasFactor);
|
|
79
39
|
} else {
|
|
80
40
|
const nearFar = ShaderHelper.getShadowCameraParams(scope).xy;
|
|
81
41
|
const linearDepth = linear ? z : ShaderHelper.nonLinearDepthToLinearNormalized(scope, z, nearFar);
|
|
82
42
|
const biasScaleFactor = getShadowReceiverPerspectiveBiasScale(scope, lightType, linearDepth, depthBiasParam.w);
|
|
83
|
-
let bias = pb.
|
|
43
|
+
let bias = pb.mul(depthBiasParam.x, receiverBiasFactor, biasScaleFactor);
|
|
84
44
|
if (isMaskedPerspectiveShadowLight(scope, lightType)) {
|
|
85
45
|
const alphaCutoff = scope.zAlphaCutoff;
|
|
86
46
|
bias = pb.mul(bias, pb.mix(0.12, 0.22, pb.clamp(alphaCutoff, 0, 1)));
|