@zephyr3d/scene 0.9.1 → 0.9.3
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/animationset.js +2 -0
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_system.js +9 -1
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +5 -1
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/geometry_cache_utils.js +20 -4
- package/dist/animation/geometry_cache_utils.js.map +1 -1
- package/dist/animation/ik/ik_angle_constraint.js +2 -6
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -1
- package/dist/animation/ik/ik_chain_builder.js +68 -0
- package/dist/animation/ik/ik_chain_builder.js.map +1 -0
- package/dist/animation/ik/ik_pole_constraint.js +2 -7
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
- package/dist/animation/ik/two_bone_ik_solver.js +2 -6
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +60 -12
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +20 -4
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +94 -46
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/math.js +16 -0
- package/dist/animation/joint_dynamics/math.js.map +1 -0
- package/dist/animation/joint_dynamics/solver.js +21 -11
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +15 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +5 -1
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/skeleton.js +2 -2
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +2 -6
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +13 -40
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring2/constraints.js.map +1 -1
- package/dist/animation/spring2/controller.js +64 -64
- package/dist/animation/spring2/controller.js.map +1 -1
- package/dist/animation/spring2/math.js.map +1 -1
- package/dist/animation/spring2/spring_system.js +8 -8
- package/dist/animation/spring2/spring_system.js.map +1 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +1 -1
- package/dist/app/engine.js.map +1 -1
- package/dist/app/screen.js +4 -4
- package/dist/app/screen.js.map +1 -1
- package/dist/app/scriptingsystem.js +24 -1
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +22 -1
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -2
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +60 -60
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +1 -1
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +795 -266
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +3 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/shader/helper.js +281 -278
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite.js +6 -6
- package/dist/material/sprite.js.map +1 -1
- package/dist/material/terrain-cm.js +2 -2
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +38 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +10 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +127 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +263 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +1 -0
- package/dist/posteffect/taa.js +31 -39
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/cluster_light.js +3 -4
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable.js +5 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +29 -3
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +283 -33
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +338 -108
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +195 -115
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +10 -0
- package/dist/render/rendergraph/history_resources.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +162 -35
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js +25 -5
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/rendertarget.js +5 -1
- package/dist/render/rendertarget.js.map +1 -1
- package/dist/render/screenrendertarget.js +5 -1
- package/dist/render/screenrendertarget.js.map +1 -1
- package/dist/render/sky.js +4 -4
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +2 -2
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/graph_node.js +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/mesh.js +81 -97
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/particlesys.js +1 -1
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene_node.js +228 -228
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/script_attachment.js +15 -3
- package/dist/scene/script_attachment.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +3 -3
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/box.js +1 -1
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/capsule.js +0 -3
- package/dist/shapes/capsule.js.map +1 -1
- package/dist/shapes/cylinder.js +0 -3
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +0 -3
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/tetrahedron.js +3 -9
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +94 -66
- package/dist/shapes/torus.js.map +1 -1
- package/dist/src/animation/animation.js +127 -0
- package/dist/src/animation/animation.js.map +1 -0
- package/dist/src/animation/animationset.js +255 -0
- package/dist/src/animation/animationset.js.map +1 -0
- package/dist/src/animation/animationtrack.js +34 -0
- package/dist/src/animation/animationtrack.js.map +1 -0
- package/dist/src/animation/eulerrotationtrack.js +52 -0
- package/dist/src/animation/eulerrotationtrack.js.map +1 -0
- package/dist/src/animation/morphtarget.js +93 -0
- package/dist/src/animation/morphtarget.js.map +1 -0
- package/dist/src/animation/morphtrack.js +70 -0
- package/dist/src/animation/morphtrack.js.map +1 -0
- package/dist/src/animation/proptrack.js +161 -0
- package/dist/src/animation/proptrack.js.map +1 -0
- package/dist/src/animation/rotationtrack.js +51 -0
- package/dist/src/animation/rotationtrack.js.map +1 -0
- package/dist/src/animation/scaletrack.js +50 -0
- package/dist/src/animation/scaletrack.js.map +1 -0
- package/dist/src/animation/skeleton.js +204 -0
- package/dist/src/animation/skeleton.js.map +1 -0
- package/dist/src/animation/translationtrack.js +50 -0
- package/dist/src/animation/translationtrack.js.map +1 -0
- package/dist/src/app/app.js +129 -0
- package/dist/src/app/app.js.map +1 -0
- package/dist/src/app/inputmgr.js +267 -0
- package/dist/src/app/inputmgr.js.map +1 -0
- package/dist/src/asset/assetmanager.js +404 -0
- package/dist/src/asset/assetmanager.js.map +1 -0
- package/dist/src/asset/builtin.js +337 -0
- package/dist/src/asset/builtin.js.map +1 -0
- package/dist/src/asset/loaders/dds/dds.js +470 -0
- package/dist/src/asset/loaders/dds/dds.js.map +1 -0
- package/dist/src/asset/loaders/dds/dds_loader.js +28 -0
- package/dist/src/asset/loaders/dds/dds_loader.js.map +1 -0
- package/dist/src/asset/loaders/gltf/gltf_loader.js +1265 -0
- package/dist/src/asset/loaders/gltf/gltf_loader.js.map +1 -0
- package/dist/src/asset/loaders/gltf/helpers.js +327 -0
- package/dist/src/asset/loaders/gltf/helpers.js.map +1 -0
- package/dist/src/asset/loaders/hdr/hdr.js +180 -0
- package/dist/src/asset/loaders/hdr/hdr.js.map +1 -0
- package/dist/src/asset/loaders/image/tga_Loader.js +116 -0
- package/dist/src/asset/loaders/image/tga_Loader.js.map +1 -0
- package/dist/src/asset/loaders/image/webimage_loader.js +63 -0
- package/dist/src/asset/loaders/image/webimage_loader.js.map +1 -0
- package/dist/src/asset/loaders/loader.js +45 -0
- package/dist/src/asset/loaders/loader.js.map +1 -0
- package/dist/src/asset/model.js +414 -0
- package/dist/src/asset/model.js.map +1 -0
- package/dist/src/blitter/bilateralblur.js +221 -0
- package/dist/src/blitter/bilateralblur.js.map +1 -0
- package/dist/src/blitter/blitter.js +390 -0
- package/dist/src/blitter/blitter.js.map +1 -0
- package/dist/src/blitter/box.js +118 -0
- package/dist/src/blitter/box.js.map +1 -0
- package/dist/src/blitter/copy.js +22 -0
- package/dist/src/blitter/copy.js.map +1 -0
- package/dist/src/blitter/gaussianblur.js +228 -0
- package/dist/src/blitter/gaussianblur.js.map +1 -0
- package/dist/src/camera/base.js +92 -0
- package/dist/src/camera/base.js.map +1 -0
- package/dist/src/camera/camera.js +1005 -0
- package/dist/src/camera/camera.js.map +1 -0
- package/dist/src/camera/fps.js +238 -0
- package/dist/src/camera/fps.js.map +1 -0
- package/dist/src/camera/orbit.js +245 -0
- package/dist/src/camera/orbit.js.map +1 -0
- package/dist/src/camera/orthocamera.js +167 -0
- package/dist/src/camera/orthocamera.js.map +1 -0
- package/dist/src/camera/perspectivecamera.js +141 -0
- package/dist/src/camera/perspectivecamera.js.map +1 -0
- package/dist/src/index.js +120 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/material/blinn.js +81 -0
- package/dist/src/material/blinn.js.map +1 -0
- package/dist/src/material/grassmaterial.js +113 -0
- package/dist/src/material/grassmaterial.js.map +1 -0
- package/dist/src/material/lambert.js +92 -0
- package/dist/src/material/lambert.js.map +1 -0
- package/dist/src/material/material.js +301 -0
- package/dist/src/material/material.js.map +1 -0
- package/dist/src/material/meshmaterial.js +704 -0
- package/dist/src/material/meshmaterial.js.map +1 -0
- package/dist/src/material/mixins/albedocolor.js +76 -0
- package/dist/src/material/mixins/albedocolor.js.map +1 -0
- package/dist/src/material/mixins/foliage.js +47 -0
- package/dist/src/material/mixins/foliage.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/blinnphong.js +112 -0
- package/dist/src/material/mixins/lightmodel/blinnphong.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/lambert.js +58 -0
- package/dist/src/material/mixins/lightmodel/lambert.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +178 -0
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +139 -0
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -0
- package/dist/src/material/mixins/lit.js +476 -0
- package/dist/src/material/mixins/lit.js.map +1 -0
- package/dist/src/material/mixins/pbr/common.js +918 -0
- package/dist/src/material/mixins/pbr/common.js.map +1 -0
- package/dist/src/material/mixins/texture.js +172 -0
- package/dist/src/material/mixins/texture.js.map +1 -0
- package/dist/src/material/mixins/vertexcolor.js +56 -0
- package/dist/src/material/mixins/vertexcolor.js.map +1 -0
- package/dist/src/material/particle.js +178 -0
- package/dist/src/material/particle.js.map +1 -0
- package/dist/src/material/pbrmr.js +97 -0
- package/dist/src/material/pbrmr.js.map +1 -0
- package/dist/src/material/pbrsg.js +97 -0
- package/dist/src/material/pbrsg.js.map +1 -0
- package/dist/src/material/shader/helper.js +1209 -0
- package/dist/src/material/shader/helper.js.map +1 -0
- package/dist/src/material/terrain-cm.js +606 -0
- package/dist/src/material/terrain-cm.js.map +1 -0
- package/dist/src/material/terrainmaterial.js +375 -0
- package/dist/src/material/terrainmaterial.js.map +1 -0
- package/dist/src/material/unlit.js +41 -0
- package/dist/src/material/unlit.js.map +1 -0
- package/dist/src/material/water.js +417 -0
- package/dist/src/material/water.js.map +1 -0
- package/dist/src/posteffect/bloom.js +361 -0
- package/dist/src/posteffect/bloom.js.map +1 -0
- package/dist/src/posteffect/compositor.js +226 -0
- package/dist/src/posteffect/compositor.js.map +1 -0
- package/dist/src/posteffect/fxaa.js +273 -0
- package/dist/src/posteffect/fxaa.js.map +1 -0
- package/dist/src/posteffect/grayscale.js +69 -0
- package/dist/src/posteffect/grayscale.js.map +1 -0
- package/dist/src/posteffect/motionblur.js +96 -0
- package/dist/src/posteffect/motionblur.js.map +1 -0
- package/dist/src/posteffect/posteffect.js +126 -0
- package/dist/src/posteffect/posteffect.js.map +1 -0
- package/dist/src/posteffect/sao.js +324 -0
- package/dist/src/posteffect/sao.js.map +1 -0
- package/dist/src/posteffect/ssr.js +489 -0
- package/dist/src/posteffect/ssr.js.map +1 -0
- package/dist/src/posteffect/taa.js +172 -0
- package/dist/src/posteffect/taa.js.map +1 -0
- package/dist/src/posteffect/tonemap.js +94 -0
- package/dist/src/posteffect/tonemap.js.map +1 -0
- package/dist/src/render/abuffer_oit.js +361 -0
- package/dist/src/render/abuffer_oit.js.map +1 -0
- package/dist/src/render/clipmap.js +851 -0
- package/dist/src/render/clipmap.js.map +1 -0
- package/dist/src/render/cluster_light.js +333 -0
- package/dist/src/render/cluster_light.js.map +1 -0
- package/dist/src/render/cull_visitor.js +187 -0
- package/dist/src/render/cull_visitor.js.map +1 -0
- package/dist/src/render/depthpass.js +68 -0
- package/dist/src/render/depthpass.js.map +1 -0
- package/dist/src/render/drawable_mixin.js +227 -0
- package/dist/src/render/drawable_mixin.js.map +1 -0
- package/dist/src/render/envlight.js +463 -0
- package/dist/src/render/envlight.js.map +1 -0
- package/dist/src/render/fbm_wavegenerator.js +251 -0
- package/dist/src/render/fbm_wavegenerator.js.map +1 -0
- package/dist/src/render/fft_wavegenerator.js +1006 -0
- package/dist/src/render/fft_wavegenerator.js.map +1 -0
- package/dist/src/render/fullscreenquad.js +38 -0
- package/dist/src/render/fullscreenquad.js.map +1 -0
- package/dist/src/render/gerstner_wavegenerator.js +314 -0
- package/dist/src/render/gerstner_wavegenerator.js.map +1 -0
- package/dist/src/render/globalbindgroup_allocator.js +60 -0
- package/dist/src/render/globalbindgroup_allocator.js.map +1 -0
- package/dist/src/render/hzb.js +273 -0
- package/dist/src/render/hzb.js.map +1 -0
- package/dist/src/render/lightpass.js +172 -0
- package/dist/src/render/lightpass.js.map +1 -0
- package/dist/src/render/objectcolorpass.js +51 -0
- package/dist/src/render/objectcolorpass.js.map +1 -0
- package/dist/src/render/primitive.js +364 -0
- package/dist/src/render/primitive.js.map +1 -0
- package/dist/src/render/render_queue.js +467 -0
- package/dist/src/render/render_queue.js.map +1 -0
- package/dist/src/render/renderbundle_wrapper.js +152 -0
- package/dist/src/render/renderbundle_wrapper.js.map +1 -0
- package/dist/src/render/renderer.js +455 -0
- package/dist/src/render/renderer.js.map +1 -0
- package/dist/src/render/renderpass.js +200 -0
- package/dist/src/render/renderpass.js.map +1 -0
- package/dist/src/render/shadowmap_pass.js +56 -0
- package/dist/src/render/shadowmap_pass.js.map +1 -0
- package/dist/src/render/sky.js +1103 -0
- package/dist/src/render/sky.js.map +1 -0
- package/dist/src/render/weightedblended_oit.js +168 -0
- package/dist/src/render/weightedblended_oit.js.map +1 -0
- package/dist/src/scene/batchgroup.js +162 -0
- package/dist/src/scene/batchgroup.js.map +1 -0
- package/dist/src/scene/environment.js +209 -0
- package/dist/src/scene/environment.js.map +1 -0
- package/dist/src/scene/graph_node.js +72 -0
- package/dist/src/scene/graph_node.js.map +1 -0
- package/dist/src/scene/light.js +416 -0
- package/dist/src/scene/light.js.map +1 -0
- package/dist/src/scene/mesh.js +341 -0
- package/dist/src/scene/mesh.js.map +1 -0
- package/dist/src/scene/octree.js +649 -0
- package/dist/src/scene/octree.js.map +1 -0
- package/dist/src/scene/particlesys.js +738 -0
- package/dist/src/scene/particlesys.js.map +1 -0
- package/dist/src/scene/raycast_visitor.js +103 -0
- package/dist/src/scene/raycast_visitor.js.map +1 -0
- package/dist/src/scene/scene.js +284 -0
- package/dist/src/scene/scene.js.map +1 -0
- package/dist/src/scene/scene_node.js +732 -0
- package/dist/src/scene/scene_node.js.map +1 -0
- package/dist/src/scene/terrain/grass.js +278 -0
- package/dist/src/scene/terrain/grass.js.map +1 -0
- package/dist/src/scene/terrain/heightfield.js +475 -0
- package/dist/src/scene/terrain/heightfield.js.map +1 -0
- package/dist/src/scene/terrain/patch.js +530 -0
- package/dist/src/scene/terrain/patch.js.map +1 -0
- package/dist/src/scene/terrain/quadtree.js +461 -0
- package/dist/src/scene/terrain/quadtree.js.map +1 -0
- package/dist/src/scene/terrain/terrain.js +246 -0
- package/dist/src/scene/terrain/terrain.js.map +1 -0
- package/dist/src/scene/terrain-cm/grass.js +594 -0
- package/dist/src/scene/terrain-cm/grass.js.map +1 -0
- package/dist/src/scene/terrain-cm/grassmaterial.js +159 -0
- package/dist/src/scene/terrain-cm/grassmaterial.js.map +1 -0
- package/dist/src/scene/terrain-cm/terrain-cm.js +538 -0
- package/dist/src/scene/terrain-cm/terrain-cm.js.map +1 -0
- package/dist/src/scene/water.js +374 -0
- package/dist/src/scene/water.js.map +1 -0
- package/dist/src/shaders/atmosphere.js +957 -0
- package/dist/src/shaders/atmosphere.js.map +1 -0
- package/dist/src/shaders/fog.js +112 -0
- package/dist/src/shaders/fog.js.map +1 -0
- package/dist/src/shaders/misc.js +266 -0
- package/dist/src/shaders/misc.js.map +1 -0
- package/dist/src/shaders/noise.js +222 -0
- package/dist/src/shaders/noise.js.map +1 -0
- package/dist/src/shaders/pbr.js +51 -0
- package/dist/src/shaders/pbr.js.map +1 -0
- package/dist/src/shaders/shadow.js +636 -0
- package/dist/src/shaders/shadow.js.map +1 -0
- package/dist/src/shaders/ssr.js +490 -0
- package/dist/src/shaders/ssr.js.map +1 -0
- package/dist/src/shaders/temporal.js +215 -0
- package/dist/src/shaders/temporal.js.map +1 -0
- package/dist/src/shaders/water.js +756 -0
- package/dist/src/shaders/water.js.map +1 -0
- package/dist/src/shadow/esm.js +237 -0
- package/dist/src/shadow/esm.js.map +1 -0
- package/dist/src/shadow/pcf_opt.js +181 -0
- package/dist/src/shadow/pcf_opt.js.map +1 -0
- package/dist/src/shadow/pcf_pd.js +189 -0
- package/dist/src/shadow/pcf_pd.js.map +1 -0
- package/dist/src/shadow/shader.js +37 -0
- package/dist/src/shadow/shader.js.map +1 -0
- package/dist/src/shadow/shadow_impl.js +15 -0
- package/dist/src/shadow/shadow_impl.js.map +1 -0
- package/dist/src/shadow/shadowmapper.js +790 -0
- package/dist/src/shadow/shadowmapper.js.map +1 -0
- package/dist/src/shadow/ssm.js +159 -0
- package/dist/src/shadow/ssm.js.map +1 -0
- package/dist/src/shadow/vsm.js +297 -0
- package/dist/src/shadow/vsm.js.map +1 -0
- package/dist/src/shapes/box.js +386 -0
- package/dist/src/shapes/box.js.map +1 -0
- package/dist/src/shapes/cylinder.js +125 -0
- package/dist/src/shapes/cylinder.js.map +1 -0
- package/dist/src/shapes/plane.js +88 -0
- package/dist/src/shapes/plane.js.map +1 -0
- package/dist/src/shapes/shape.js +87 -0
- package/dist/src/shapes/shape.js.map +1 -0
- package/dist/src/shapes/sphere.js +114 -0
- package/dist/src/shapes/sphere.js.map +1 -0
- package/dist/src/shapes/tetrahedron.js +188 -0
- package/dist/src/shapes/tetrahedron.js.map +1 -0
- package/dist/src/shapes/torus.js +111 -0
- package/dist/src/shapes/torus.js.map +1 -0
- package/dist/src/utility/aabbtree.js +400 -0
- package/dist/src/utility/aabbtree.js.map +1 -0
- package/dist/src/utility/bounding_volume.js +29 -0
- package/dist/src/utility/bounding_volume.js.map +1 -0
- package/dist/src/utility/debug.js +28 -0
- package/dist/src/utility/debug.js.map +1 -0
- package/dist/src/utility/draco/decoder.js +116 -0
- package/dist/src/utility/draco/decoder.js.map +1 -0
- package/dist/src/utility/misc.js +105 -0
- package/dist/src/utility/misc.js.map +1 -0
- package/dist/src/utility/panorama.js +163 -0
- package/dist/src/utility/panorama.js.map +1 -0
- package/dist/src/utility/pmrem.js +354 -0
- package/dist/src/utility/pmrem.js.map +1 -0
- package/dist/src/utility/rendermipmap.js +115 -0
- package/dist/src/utility/rendermipmap.js.map +1 -0
- package/dist/src/utility/serialization/json.js +402 -0
- package/dist/src/utility/serialization/json.js.map +1 -0
- package/dist/src/utility/serialization/manager.js +623 -0
- package/dist/src/utility/serialization/manager.js.map +1 -0
- package/dist/src/utility/serialization/scene/animation.js +248 -0
- package/dist/src/utility/serialization/scene/animation.js.map +1 -0
- package/dist/src/utility/serialization/scene/batch.js +59 -0
- package/dist/src/utility/serialization/scene/batch.js.map +1 -0
- package/dist/src/utility/serialization/scene/camera.js +790 -0
- package/dist/src/utility/serialization/scene/camera.js.map +1 -0
- package/dist/src/utility/serialization/scene/common.js +222 -0
- package/dist/src/utility/serialization/scene/common.js.map +1 -0
- package/dist/src/utility/serialization/scene/light.js +575 -0
- package/dist/src/utility/serialization/scene/light.js.map +1 -0
- package/dist/src/utility/serialization/scene/material.js +1111 -0
- package/dist/src/utility/serialization/scene/material.js.map +1 -0
- package/dist/src/utility/serialization/scene/mesh.js +148 -0
- package/dist/src/utility/serialization/scene/mesh.js.map +1 -0
- package/dist/src/utility/serialization/scene/misc.js +39 -0
- package/dist/src/utility/serialization/scene/misc.js.map +1 -0
- package/dist/src/utility/serialization/scene/node.js +451 -0
- package/dist/src/utility/serialization/scene/node.js.map +1 -0
- package/dist/src/utility/serialization/scene/particle.js +425 -0
- package/dist/src/utility/serialization/scene/particle.js.map +1 -0
- package/dist/src/utility/serialization/scene/primitive.js +692 -0
- package/dist/src/utility/serialization/scene/primitive.js.map +1 -0
- package/dist/src/utility/serialization/scene/scene.js +704 -0
- package/dist/src/utility/serialization/scene/scene.js.map +1 -0
- package/dist/src/utility/serialization/scene/terrain.js +488 -0
- package/dist/src/utility/serialization/scene/terrain.js.map +1 -0
- package/dist/src/utility/serialization/scene/water.js +465 -0
- package/dist/src/utility/serialization/scene/water.js.map +1 -0
- package/dist/src/utility/shprojector.js +297 -0
- package/dist/src/utility/shprojector.js.map +1 -0
- package/dist/src/utility/textures/ggxlut.js +213 -0
- package/dist/src/utility/textures/ggxlut.js.map +1 -0
- package/dist/src/utility/textures/gradientnoise.js +62 -0
- package/dist/src/utility/textures/gradientnoise.js.map +1 -0
- package/dist/src/utility/textures/randomnoise.js +41 -0
- package/dist/src/utility/textures/randomnoise.js.map +1 -0
- package/dist/src/values.js +162 -0
- package/dist/src/values.js.map +1 -0
- package/dist/utility/blueprint/material/common.js +7 -0
- package/dist/utility/blueprint/material/common.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +3 -3
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +4 -4
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/serialization/blueprint/constants.js +255 -0
- package/dist/utility/serialization/blueprint/constants.js.map +1 -0
- package/dist/utility/serialization/blueprint/material/constants.js +203 -0
- package/dist/utility/serialization/blueprint/material/constants.js.map +1 -0
- package/dist/utility/serialization/blueprint/material/texture.js +165 -0
- package/dist/utility/serialization/blueprint/material/texture.js.map +1 -0
- package/dist/utility/serialization/manager.js +299 -268
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +45 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +10 -0
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +30 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +63 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +11 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +2 -0
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +19 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +22 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +33 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +39 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/script.js +2 -0
- package/dist/utility/serialization/scene/script.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +6 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +9 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +21 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +5 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +49 -53
- package/dist/values.js.map +1 -1
- package/package.json +2 -2
- package/dist/animation/joint_dynamics/vrm_spring_bone.js +0 -46
- package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +0 -1
- package/dist/animation/spring/spring_bone.js +0 -240
- package/dist/animation/spring/spring_bone.js.map +0 -1
- package/dist/animation/spring/spring_bone_collider.js +0 -198
- package/dist/animation/spring/spring_bone_collider.js.map +0 -1
- package/dist/animation/spring/spring_bone_constraint.js +0 -170
- package/dist/animation/spring/spring_bone_constraint.js.map +0 -1
- package/dist/animation/spring/spring_bone_system.js +0 -328
- package/dist/animation/spring/spring_bone_system.js.map +0 -1
- package/dist/render/sky_motion_vector.js +0 -85
- package/dist/render/sky_motion_vector.js.map +0 -1
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { Application } from '../app/app.js';
|
|
2
|
+
import { Primitive } from '../render/primitive.js';
|
|
3
|
+
import { DRef, Vector4 } from '@zephyr3d/base';
|
|
4
|
+
import { fetchSampler } from './misc.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.
|
|
8
|
+
* This is commonly used for efficient environment lighting approximation in real-time rendering.
|
|
9
|
+
*
|
|
10
|
+
* The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)
|
|
11
|
+
* from a cubemap texture, which can then be used for ambient lighting calculations.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const projector = new CubemapSHProjector(10000);
|
|
16
|
+
* const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });
|
|
17
|
+
* projector.projectCubemap(environmentCubemap, shBuffer);
|
|
18
|
+
* // shBuffer now contains the 9 SH coefficients as RGB values
|
|
19
|
+
* projector.dispose();
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/ class CubemapSHProjector {
|
|
24
|
+
static _programInst = null;
|
|
25
|
+
static _bindGroupInst = null;
|
|
26
|
+
static _renderStats = null;
|
|
27
|
+
_primitive;
|
|
28
|
+
_renderTarget;
|
|
29
|
+
_numSamples;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new CubemapSHProjector instance.
|
|
32
|
+
*
|
|
33
|
+
* @param numSamples - Number of Monte Carlo samples to use for SH projection.
|
|
34
|
+
* Higher values provide better accuracy but slower computation.
|
|
35
|
+
* Default is 10000.
|
|
36
|
+
*/ constructor(numSamples = 10000){
|
|
37
|
+
this._numSamples = numSamples;
|
|
38
|
+
this._primitive = new DRef();
|
|
39
|
+
this._renderTarget = new DRef();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Disposes of all resources allocated by this projector instance.
|
|
43
|
+
* Should be called when the projector is no longer needed to prevent memory leaks.
|
|
44
|
+
*/ dispose() {
|
|
45
|
+
this._primitive.dispose();
|
|
46
|
+
if (this._renderTarget.get()) {
|
|
47
|
+
this._renderTarget.get().getColorAttachments()[0].dispose();
|
|
48
|
+
this._renderTarget.dispose();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.
|
|
53
|
+
*
|
|
54
|
+
* The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
|
|
55
|
+
* The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
|
|
56
|
+
* The layout is:
|
|
57
|
+
* - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
|
|
58
|
+
* - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
|
|
59
|
+
* - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
|
|
60
|
+
*
|
|
61
|
+
* @param cubemap - The input cubemap texture to project
|
|
62
|
+
* @param outBuffer - GPU data buffer to receive the computed SH coefficients.
|
|
63
|
+
* Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes
|
|
68
|
+
* projector.projectCubemap(environmentMap, shBuffer);
|
|
69
|
+
* ```
|
|
70
|
+
*/ projectCubemap(cubemap, outBuffer) {
|
|
71
|
+
this.projectCubemapToTexture(cubemap, this._renderTarget.get());
|
|
72
|
+
this._renderTarget.get().getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.
|
|
76
|
+
*
|
|
77
|
+
* The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
|
|
78
|
+
* The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
|
|
79
|
+
* The layout is:
|
|
80
|
+
* - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
|
|
81
|
+
* - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
|
|
82
|
+
* - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
|
|
83
|
+
*
|
|
84
|
+
* @param cubemap - The input cubemap texture to project
|
|
85
|
+
* @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes
|
|
90
|
+
* const shFramebuffer = device.createFrameBuffer([shTexture], null);
|
|
91
|
+
* projector.projectCubemapToTexture(environmentMap, shFramebuffer);
|
|
92
|
+
* ```
|
|
93
|
+
*/ projectCubemapToTexture(cubemap, framebuffer) {
|
|
94
|
+
const device = Application.instance.device;
|
|
95
|
+
const clearColor = new Vector4(0, 0, 0, 1);
|
|
96
|
+
this.init(device);
|
|
97
|
+
device.pushDeviceStates();
|
|
98
|
+
device.setRenderStates(CubemapSHProjector._renderStats);
|
|
99
|
+
device.setProgram(CubemapSHProjector._programInst);
|
|
100
|
+
device.setFramebuffer(framebuffer);
|
|
101
|
+
device.clearFrameBuffer(clearColor, null, null);
|
|
102
|
+
const bindGroup = CubemapSHProjector._bindGroupInst;
|
|
103
|
+
bindGroup.setTexture('cubemap', cubemap, fetchSampler('clamp_linear_nomip'));
|
|
104
|
+
device.setBindGroup(0, bindGroup);
|
|
105
|
+
this._primitive.get().drawInstanced(9);
|
|
106
|
+
device.popDeviceStates();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Initializes the GPU resources needed for SH projection.
|
|
110
|
+
* This method is called automatically by projectCubemap() and sets up:
|
|
111
|
+
* - Sample directions primitive (Monte Carlo samples on unit sphere)
|
|
112
|
+
* - Render target (3x3 RGBA32F texture)
|
|
113
|
+
* - Render states (additive blending, no depth test)
|
|
114
|
+
* - GPU program for SH evaluation
|
|
115
|
+
*
|
|
116
|
+
* @param device - The graphics device to create resources with
|
|
117
|
+
* @internal
|
|
118
|
+
*/ init(device) {
|
|
119
|
+
if (!this._primitive.get()) {
|
|
120
|
+
const samples = new Float32Array(this._numSamples * 4);
|
|
121
|
+
for(let i = 0; i < this._numSamples; i++){
|
|
122
|
+
let x1, x2, s;
|
|
123
|
+
do {
|
|
124
|
+
x1 = Math.random() * 2 - 1;
|
|
125
|
+
x2 = Math.random() * 2 - 1;
|
|
126
|
+
s = x1 * x1 + x2 * x2;
|
|
127
|
+
}while (s >= 1)
|
|
128
|
+
const sqrtS = Math.sqrt(1 - s);
|
|
129
|
+
samples[i * 4 + 0] = 2 * x1 * sqrtS;
|
|
130
|
+
samples[i * 4 + 1] = 2 * x2 * sqrtS;
|
|
131
|
+
samples[i * 4 + 2] = 1 - 2 * s;
|
|
132
|
+
samples[i * 4 + 3] = 4 * Math.PI / this._numSamples;
|
|
133
|
+
}
|
|
134
|
+
const primitive = new Primitive();
|
|
135
|
+
primitive.createAndSetVertexBuffer('position_f32x4', samples);
|
|
136
|
+
if (device.type === 'webgl') {
|
|
137
|
+
primitive.createAndSetVertexBuffer('tex0_f32', new Float32Array([
|
|
138
|
+
0,
|
|
139
|
+
1,
|
|
140
|
+
2,
|
|
141
|
+
3,
|
|
142
|
+
4,
|
|
143
|
+
5,
|
|
144
|
+
6,
|
|
145
|
+
7,
|
|
146
|
+
8
|
|
147
|
+
]), 'instance');
|
|
148
|
+
}
|
|
149
|
+
primitive.indexCount = this._numSamples;
|
|
150
|
+
primitive.indexStart = 0;
|
|
151
|
+
primitive.primitiveType = 'point-list';
|
|
152
|
+
this._primitive.set(primitive);
|
|
153
|
+
}
|
|
154
|
+
if (!this._renderTarget.get()) {
|
|
155
|
+
const texture = device.createTexture2D('rgba32f', 3, 3, {
|
|
156
|
+
samplerOptions: {
|
|
157
|
+
mipFilter: 'none'
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
this._renderTarget.set(device.createFrameBuffer([
|
|
161
|
+
texture
|
|
162
|
+
], null));
|
|
163
|
+
}
|
|
164
|
+
if (!CubemapSHProjector._renderStats) {
|
|
165
|
+
CubemapSHProjector._renderStats = device.createRenderStateSet();
|
|
166
|
+
CubemapSHProjector._renderStats.useDepthState().enableTest(false).enableWrite(false);
|
|
167
|
+
CubemapSHProjector._renderStats.useBlendingState().enable(true).setBlendEquation('add', 'add').setBlendFuncRGB('one', 'one').setBlendFuncAlpha('zero', 'one');
|
|
168
|
+
CubemapSHProjector._renderStats.useRasterizerState().setCullMode('none');
|
|
169
|
+
}
|
|
170
|
+
if (!CubemapSHProjector._programInst) {
|
|
171
|
+
CubemapSHProjector._programInst = CubemapSHProjector._createProgram(device);
|
|
172
|
+
CubemapSHProjector._bindGroupInst = device.createBindGroup(CubemapSHProjector._programInst.bindGroupLayouts[0]);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Creates the GPU program for spherical harmonics evaluation.
|
|
177
|
+
*
|
|
178
|
+
* The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).
|
|
179
|
+
* Each instance renders all sample points, but the vertex shader maps them to different
|
|
180
|
+
* pixels in the 3x3 output texture based on the instance ID.
|
|
181
|
+
*
|
|
182
|
+
* The fragment shader evaluates the appropriate SH basis function based on the pixel location,
|
|
183
|
+
* samples the cubemap in the sample direction, and multiplies by the integration weight.
|
|
184
|
+
*
|
|
185
|
+
* @param device - The graphics device to create the program with
|
|
186
|
+
* @returns The compiled GPU program
|
|
187
|
+
* @internal
|
|
188
|
+
*/ static _createProgram(device) {
|
|
189
|
+
return device.buildRenderProgram({
|
|
190
|
+
vertex (pb) {
|
|
191
|
+
this.$inputs.directionWeight = pb.vec4().attrib('position');
|
|
192
|
+
if (device.type === 'webgl') {
|
|
193
|
+
this.$inputs.instanceId = pb.float().attrib('texCoord0');
|
|
194
|
+
}
|
|
195
|
+
pb.main(function() {
|
|
196
|
+
this.$outputs.direction = this.$inputs.directionWeight.xyz;
|
|
197
|
+
this.$outputs.weight = this.$inputs.directionWeight.w;
|
|
198
|
+
if (pb.getDevice().type !== 'webgpu') {
|
|
199
|
+
this.$builtins.pointSize = 1;
|
|
200
|
+
}
|
|
201
|
+
this.$outputs.shIndex = device.type === 'webgl' ? this.$inputs.instanceId : pb.int(this.$builtins.instanceIndex);
|
|
202
|
+
this.$l.x = pb.mod(this.$outputs.shIndex, 3);
|
|
203
|
+
this.$l.y = pb.div(this.$outputs.shIndex, 3);
|
|
204
|
+
this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);
|
|
205
|
+
this.$l.ndcY = pb.sub(pb.div(pb.add(pb.float(this.y), 0.5), 1.5), 1);
|
|
206
|
+
this.$l.$builtins.position = pb.vec4(this.ndcX, this.ndcY, 0, 1);
|
|
207
|
+
if (pb.getDevice().type === 'webgpu') {
|
|
208
|
+
this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
fragment (pb) {
|
|
213
|
+
this.$outputs.color = pb.vec4();
|
|
214
|
+
this.cubemap = pb.texCube().uniform(0);
|
|
215
|
+
pb.func('Y0', [
|
|
216
|
+
pb.vec3('v')
|
|
217
|
+
], function() {
|
|
218
|
+
this.$return(0.282094791773878);
|
|
219
|
+
});
|
|
220
|
+
pb.func('Y1', [
|
|
221
|
+
pb.vec3('v')
|
|
222
|
+
], function() {
|
|
223
|
+
this.$return(pb.mul(this.v.y, -0.4886025119));
|
|
224
|
+
});
|
|
225
|
+
pb.func('Y2', [
|
|
226
|
+
pb.vec3('v')
|
|
227
|
+
], function() {
|
|
228
|
+
this.$return(pb.mul(this.v.z, 0.4886025119));
|
|
229
|
+
});
|
|
230
|
+
pb.func('Y3', [
|
|
231
|
+
pb.vec3('v')
|
|
232
|
+
], function() {
|
|
233
|
+
this.$return(pb.mul(this.v.x, -0.4886025119));
|
|
234
|
+
});
|
|
235
|
+
pb.func('Y4', [
|
|
236
|
+
pb.vec3('v')
|
|
237
|
+
], function() {
|
|
238
|
+
this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));
|
|
239
|
+
});
|
|
240
|
+
pb.func('Y5', [
|
|
241
|
+
pb.vec3('v')
|
|
242
|
+
], function() {
|
|
243
|
+
this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));
|
|
244
|
+
});
|
|
245
|
+
pb.func('Y6', [
|
|
246
|
+
pb.vec3('v')
|
|
247
|
+
], function() {
|
|
248
|
+
this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));
|
|
249
|
+
});
|
|
250
|
+
pb.func('Y7', [
|
|
251
|
+
pb.vec3('v')
|
|
252
|
+
], function() {
|
|
253
|
+
this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));
|
|
254
|
+
});
|
|
255
|
+
pb.func('Y8', [
|
|
256
|
+
pb.vec3('v')
|
|
257
|
+
], function() {
|
|
258
|
+
this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));
|
|
259
|
+
});
|
|
260
|
+
pb.func('evalBasis', [
|
|
261
|
+
pb.vec3('dir'),
|
|
262
|
+
pb.int('c')
|
|
263
|
+
], function() {
|
|
264
|
+
this.$if(pb.equal(this.c, 0), function() {
|
|
265
|
+
this.$return(this.Y0(this.dir));
|
|
266
|
+
}).$elseif(pb.equal(this.c, 1), function() {
|
|
267
|
+
this.$return(this.Y1(this.dir));
|
|
268
|
+
}).$elseif(pb.equal(this.c, 2), function() {
|
|
269
|
+
this.$return(this.Y2(this.dir));
|
|
270
|
+
}).$elseif(pb.equal(this.c, 3), function() {
|
|
271
|
+
this.$return(this.Y3(this.dir));
|
|
272
|
+
}).$elseif(pb.equal(this.c, 4), function() {
|
|
273
|
+
this.$return(this.Y4(this.dir));
|
|
274
|
+
}).$elseif(pb.equal(this.c, 5), function() {
|
|
275
|
+
this.$return(this.Y5(this.dir));
|
|
276
|
+
}).$elseif(pb.equal(this.c, 6), function() {
|
|
277
|
+
this.$return(this.Y6(this.dir));
|
|
278
|
+
}).$elseif(pb.equal(this.c, 7), function() {
|
|
279
|
+
this.$return(this.Y7(this.dir));
|
|
280
|
+
}).$elseif(pb.equal(this.c, 8), function() {
|
|
281
|
+
this.$return(this.Y8(this.dir));
|
|
282
|
+
}).$else(function() {
|
|
283
|
+
this.$return(0);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
pb.main(function() {
|
|
287
|
+
this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;
|
|
288
|
+
this.$l.sh = this.evalBasis(this.$inputs.direction, pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex);
|
|
289
|
+
this.$outputs.color = pb.vec4(pb.mul(this.radiance, this.sh, this.$inputs.weight), 1);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { CubemapSHProjector };
|
|
297
|
+
//# sourceMappingURL=shprojector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shprojector.js","sources":["../../../src/utility/shprojector.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { Application } from '../app';\r\nimport { Primitive } from '../render/primitive';\r\nimport { DRef, Vector4 } from '@zephyr3d/base';\r\nimport { fetchSampler } from './misc';\r\n\r\n/**\r\n * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.\r\n * This is commonly used for efficient environment lighting approximation in real-time rendering.\r\n *\r\n * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)\r\n * from a cubemap texture, which can then be used for ambient lighting calculations.\r\n *\r\n * @example\r\n * ```typescript\r\n * const projector = new CubemapSHProjector(10000);\r\n * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });\r\n * projector.projectCubemap(environmentCubemap, shBuffer);\r\n * // shBuffer now contains the 9 SH coefficients as RGB values\r\n * projector.dispose();\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class CubemapSHProjector {\r\n private static _programInst: GPUProgram = null;\r\n private static _bindGroupInst: BindGroup = null;\r\n private static _renderStats: RenderStateSet = null;\r\n private readonly _primitive: DRef<Primitive>;\r\n private readonly _renderTarget: DRef<FrameBuffer>;\r\n private readonly _numSamples: number;\r\n /**\r\n * Creates a new CubemapSHProjector instance.\r\n *\r\n * @param numSamples - Number of Monte Carlo samples to use for SH projection.\r\n * Higher values provide better accuracy but slower computation.\r\n * Default is 10000.\r\n */\r\n constructor(numSamples = 10000) {\r\n this._numSamples = numSamples;\r\n this._primitive = new DRef();\r\n this._renderTarget = new DRef();\r\n }\r\n /**\r\n * Disposes of all resources allocated by this projector instance.\r\n * Should be called when the projector is no longer needed to prevent memory leaks.\r\n */\r\n dispose() {\r\n this._primitive.dispose();\r\n if (this._renderTarget.get()) {\r\n this._renderTarget.get().getColorAttachments()[0].dispose();\r\n this._renderTarget.dispose();\r\n }\r\n }\r\n /**\r\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.\r\n *\r\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\r\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\r\n * The layout is:\r\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\r\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\r\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\r\n *\r\n * @param cubemap - The input cubemap texture to project\r\n * @param outBuffer - GPU data buffer to receive the computed SH coefficients.\r\n * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).\r\n *\r\n * @example\r\n * ```typescript\r\n * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes\r\n * projector.projectCubemap(environmentMap, shBuffer);\r\n * ```\r\n */\r\n projectCubemap(cubemap: TextureCube, outBuffer: GPUDataBuffer) {\r\n this.projectCubemapToTexture(cubemap, this._renderTarget.get());\r\n this._renderTarget.get().getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);\r\n }\r\n /**\r\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.\r\n *\r\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\r\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\r\n * The layout is:\r\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\r\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\r\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\r\n *\r\n * @param cubemap - The input cubemap texture to project\r\n * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.\r\n *\r\n * @example\r\n * ```typescript\r\n * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes\r\n * const shFramebuffer = device.createFrameBuffer([shTexture], null);\r\n * projector.projectCubemapToTexture(environmentMap, shFramebuffer);\r\n * ```\r\n */\r\n projectCubemapToTexture(cubemap: TextureCube, framebuffer: FrameBuffer) {\r\n const device = Application.instance.device;\r\n const clearColor = new Vector4(0, 0, 0, 1);\r\n this.init(device);\r\n device.pushDeviceStates();\r\n device.setRenderStates(CubemapSHProjector._renderStats);\r\n device.setProgram(CubemapSHProjector._programInst);\r\n device.setFramebuffer(framebuffer);\r\n device.clearFrameBuffer(clearColor, null, null);\r\n const bindGroup = CubemapSHProjector._bindGroupInst;\r\n bindGroup.setTexture('cubemap', cubemap, fetchSampler('clamp_linear_nomip'));\r\n device.setBindGroup(0, bindGroup);\r\n this._primitive.get().drawInstanced(9);\r\n device.popDeviceStates();\r\n }\r\n /**\r\n * Initializes the GPU resources needed for SH projection.\r\n * This method is called automatically by projectCubemap() and sets up:\r\n * - Sample directions primitive (Monte Carlo samples on unit sphere)\r\n * - Render target (3x3 RGBA32F texture)\r\n * - Render states (additive blending, no depth test)\r\n * - GPU program for SH evaluation\r\n *\r\n * @param device - The graphics device to create resources with\r\n * @internal\r\n */\r\n private init(device: AbstractDevice) {\r\n if (!this._primitive.get()) {\r\n const samples = new Float32Array(this._numSamples * 4);\r\n for (let i = 0; i < this._numSamples; i++) {\r\n let x1: number, x2: number, s: number;\r\n do {\r\n x1 = Math.random() * 2 - 1;\r\n x2 = Math.random() * 2 - 1;\r\n s = x1 * x1 + x2 * x2;\r\n } while (s >= 1);\r\n const sqrtS = Math.sqrt(1 - s);\r\n samples[i * 4 + 0] = 2 * x1 * sqrtS;\r\n samples[i * 4 + 1] = 2 * x2 * sqrtS;\r\n samples[i * 4 + 2] = 1 - 2 * s;\r\n samples[i * 4 + 3] = (4 * Math.PI) / this._numSamples;\r\n }\r\n const primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32x4', samples);\r\n if (device.type === 'webgl') {\r\n primitive.createAndSetVertexBuffer(\r\n 'tex0_f32',\r\n new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 8]),\r\n 'instance'\r\n );\r\n }\r\n primitive.indexCount = this._numSamples;\r\n primitive.indexStart = 0;\r\n primitive.primitiveType = 'point-list';\r\n this._primitive.set(primitive);\r\n }\r\n\r\n if (!this._renderTarget.get()) {\r\n const texture = device.createTexture2D('rgba32f', 3, 3, {\r\n samplerOptions: { mipFilter: 'none' }\r\n });\r\n this._renderTarget.set(device.createFrameBuffer([texture], null));\r\n }\r\n\r\n if (!CubemapSHProjector._renderStats) {\r\n CubemapSHProjector._renderStats = device.createRenderStateSet();\r\n CubemapSHProjector._renderStats.useDepthState().enableTest(false).enableWrite(false);\r\n CubemapSHProjector._renderStats\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n CubemapSHProjector._renderStats.useRasterizerState().setCullMode('none');\r\n }\r\n\r\n if (!CubemapSHProjector._programInst) {\r\n CubemapSHProjector._programInst = CubemapSHProjector._createProgram(device);\r\n CubemapSHProjector._bindGroupInst = device.createBindGroup(\r\n CubemapSHProjector._programInst.bindGroupLayouts[0]\r\n );\r\n }\r\n }\r\n /**\r\n * Creates the GPU program for spherical harmonics evaluation.\r\n *\r\n * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).\r\n * Each instance renders all sample points, but the vertex shader maps them to different\r\n * pixels in the 3x3 output texture based on the instance ID.\r\n *\r\n * The fragment shader evaluates the appropriate SH basis function based on the pixel location,\r\n * samples the cubemap in the sample direction, and multiplies by the integration weight.\r\n *\r\n * @param device - The graphics device to create the program with\r\n * @returns The compiled GPU program\r\n * @internal\r\n */\r\n private static _createProgram(device: AbstractDevice) {\r\n return device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.directionWeight = pb.vec4().attrib('position');\r\n if (device.type === 'webgl') {\r\n this.$inputs.instanceId = pb.float().attrib('texCoord0');\r\n }\r\n pb.main(function () {\r\n this.$outputs.direction = this.$inputs.directionWeight.xyz;\r\n this.$outputs.weight = this.$inputs.directionWeight.w;\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$outputs.shIndex =\r\n device.type === 'webgl' ? this.$inputs.instanceId : pb.int(this.$builtins.instanceIndex);\r\n this.$l.x = pb.mod(this.$outputs.shIndex, 3);\r\n this.$l.y = pb.div(this.$outputs.shIndex, 3);\r\n this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);\r\n this.$l.ndcY = pb.sub(pb.div(pb.add(pb.float(this.y), 0.5), 1.5), 1);\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, this.ndcY, 0, 1);\r\n if (pb.getDevice().type === 'webgpu') {\r\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.cubemap = pb.texCube().uniform(0);\r\n pb.func('Y0', [pb.vec3('v')], function () {\r\n this.$return(0.282094791773878);\r\n });\r\n pb.func('Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('evalBasis', [pb.vec3('dir'), pb.int('c')], function () {\r\n this.$if(pb.equal(this.c, 0), function () {\r\n this.$return(this.Y0(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 1), function () {\r\n this.$return(this.Y1(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 2), function () {\r\n this.$return(this.Y2(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 3), function () {\r\n this.$return(this.Y3(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 4), function () {\r\n this.$return(this.Y4(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 5), function () {\r\n this.$return(this.Y5(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 6), function () {\r\n this.$return(this.Y6(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 7), function () {\r\n this.$return(this.Y7(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 8), function () {\r\n this.$return(this.Y8(this.dir));\r\n })\r\n .$else(function () {\r\n this.$return(0);\r\n });\r\n });\r\n pb.main(function () {\r\n this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;\r\n this.$l.sh = this.evalBasis(\r\n this.$inputs.direction,\r\n pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex\r\n );\r\n this.$outputs.color = pb.vec4(pb.mul(this.radiance, this.sh, this.$inputs.weight), 1);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n"],"names":["CubemapSHProjector","_programInst","_bindGroupInst","_renderStats","_primitive","_renderTarget","_numSamples","numSamples","DRef","dispose","get","getColorAttachments","projectCubemap","cubemap","outBuffer","projectCubemapToTexture","readPixelsToBuffer","framebuffer","device","Application","instance","clearColor","Vector4","init","pushDeviceStates","setRenderStates","setProgram","setFramebuffer","clearFrameBuffer","bindGroup","setTexture","fetchSampler","setBindGroup","drawInstanced","popDeviceStates","samples","Float32Array","i","x1","x2","s","Math","random","sqrtS","sqrt","PI","primitive","Primitive","createAndSetVertexBuffer","type","indexCount","indexStart","primitiveType","set","texture","createTexture2D","samplerOptions","mipFilter","createFrameBuffer","createRenderStateSet","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","useRasterizerState","setCullMode","_createProgram","createBindGroup","bindGroupLayouts","buildRenderProgram","vertex","pb","$inputs","directionWeight","vec4","attrib","instanceId","float","main","$outputs","direction","xyz","weight","w","getDevice","$builtins","pointSize","shIndex","int","instanceIndex","$l","x","mod","y","div","ndcX","sub","add","ndcY","position","mul","fragment","color","texCube","uniform","func","vec3","$return","v","z","$if","equal","c","Y0","dir","$elseif","Y1","Y2","Y3","Y4","Y5","Y6","Y7","Y8","$else","radiance","textureSampleLevel","rgb","sh","evalBasis"],"mappings":"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"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { Application } from '../../app/app.js';
|
|
2
|
+
|
|
3
|
+
const ggxLut = new Map();
|
|
4
|
+
function getGGXLUT(size) {
|
|
5
|
+
let lut = ggxLut.get(size);
|
|
6
|
+
if (!lut) {
|
|
7
|
+
lut = createGGXLUT(size);
|
|
8
|
+
ggxLut.set(size, lut);
|
|
9
|
+
}
|
|
10
|
+
return lut;
|
|
11
|
+
}
|
|
12
|
+
function createGGXLUT(size) {
|
|
13
|
+
const device = Application.instance.device;
|
|
14
|
+
const program = device.buildRenderProgram({
|
|
15
|
+
vertex (pb) {
|
|
16
|
+
this.$inputs.pos = pb.vec2().attrib('position');
|
|
17
|
+
this.$outputs.uv = pb.vec2();
|
|
18
|
+
pb.main(function() {
|
|
19
|
+
this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);
|
|
20
|
+
this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
|
|
21
|
+
if (device.type === 'webgpu') {
|
|
22
|
+
this.$builtins.position.y = pb.neg(this.$builtins.position.y);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
fragment (pb) {
|
|
27
|
+
this.$outputs.color = pb.vec4();
|
|
28
|
+
const SAMPLE_COUNT = 1024;
|
|
29
|
+
if (device.type === 'webgl') {
|
|
30
|
+
pb.func('radicalInverse_VdC', [
|
|
31
|
+
pb.int('bits')
|
|
32
|
+
], function() {
|
|
33
|
+
this.$l.rand = pb.float(0);
|
|
34
|
+
this.$l.denom = pb.float(1);
|
|
35
|
+
this.$l.invBase = pb.float(0.5);
|
|
36
|
+
this.$l.n = this.bits;
|
|
37
|
+
this.$for(pb.int('i'), 0, 32, function() {
|
|
38
|
+
this.denom = pb.mul(this.denom, 2);
|
|
39
|
+
this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));
|
|
40
|
+
this.n = pb.div(this.n, 2);
|
|
41
|
+
this.$if(pb.equal(this.n, 0), function() {
|
|
42
|
+
this.$break();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
this.$return(this.rand);
|
|
46
|
+
});
|
|
47
|
+
pb.func('hammersley2d', [
|
|
48
|
+
pb.int('i'),
|
|
49
|
+
pb.int('N')
|
|
50
|
+
], function() {
|
|
51
|
+
this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));
|
|
52
|
+
});
|
|
53
|
+
} else {
|
|
54
|
+
pb.func('radicalInverse_VdC', [
|
|
55
|
+
pb.uint('bits')
|
|
56
|
+
], function() {
|
|
57
|
+
this.$l.n = this.bits;
|
|
58
|
+
this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));
|
|
59
|
+
this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x55555555), 1), pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1));
|
|
60
|
+
this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x33333333), 2), pb.sar(pb.compAnd(this.n, 0xcccccccc), 2));
|
|
61
|
+
this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4), pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4));
|
|
62
|
+
this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8), pb.sar(pb.compAnd(this.n, 0xff00ff00), 8));
|
|
63
|
+
this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));
|
|
64
|
+
});
|
|
65
|
+
pb.func('hammersley2d', [
|
|
66
|
+
pb.int('i'),
|
|
67
|
+
pb.int('N')
|
|
68
|
+
], function() {
|
|
69
|
+
this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i))));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
pb.func('generateTBN', [
|
|
73
|
+
pb.vec3('normal')
|
|
74
|
+
], function() {
|
|
75
|
+
this.$l.bitangent = pb.vec3(0, 1, 0);
|
|
76
|
+
this.$l.NoU = this.normal.y;
|
|
77
|
+
this.$l.epsl = 0.0000001;
|
|
78
|
+
this.$if(pb.lessThanEqual(pb.sub(1, pb.abs(this.normal.y)), this.epsl), function() {
|
|
79
|
+
this.bitangent = this.$choice(pb.greaterThan(this.normal.y, 0), pb.vec3(0, 0, 1), pb.vec3(0, 0, -1));
|
|
80
|
+
});
|
|
81
|
+
this.$l.tangent = pb.normalize(pb.cross(this.bitangent, this.normal));
|
|
82
|
+
this.bitangent = pb.cross(this.normal, this.tangent);
|
|
83
|
+
this.$return(pb.mat3(this.tangent, this.bitangent, this.normal));
|
|
84
|
+
});
|
|
85
|
+
pb.func('D_Charlie', [
|
|
86
|
+
pb.float('sheenRoughness'),
|
|
87
|
+
pb.float('NdotH')
|
|
88
|
+
], function() {
|
|
89
|
+
this.$l.roughness = pb.max(this.sheenRoughness, 0.000001);
|
|
90
|
+
this.$l.invR = pb.div(1, this.roughness);
|
|
91
|
+
this.$l.cos2h = pb.mul(this.NdotH, this.NdotH);
|
|
92
|
+
this.$l.sin2h = pb.sub(1, this.cos2h);
|
|
93
|
+
this.$return(pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), Math.PI * 2));
|
|
94
|
+
});
|
|
95
|
+
pb.func('smithGGXCorrelated', [
|
|
96
|
+
pb.float('NoV'),
|
|
97
|
+
pb.float('NoL'),
|
|
98
|
+
pb.float('roughness')
|
|
99
|
+
], function() {
|
|
100
|
+
this.$l.a2 = pb.mul(this.roughness, this.roughness, this.roughness, this.roughness);
|
|
101
|
+
this.$l.GGXV = pb.mul(this.NoL, pb.sqrt(pb.add(pb.mul(this.NoV, this.NoV, pb.sub(1, this.a2)), this.a2)));
|
|
102
|
+
this.$l.GGXL = pb.mul(this.NoV, pb.sqrt(pb.add(pb.mul(this.NoL, this.NoL, pb.sub(1, this.a2)), this.a2)));
|
|
103
|
+
this.$return(pb.div(0.5, pb.add(this.GGXV, this.GGXL)));
|
|
104
|
+
});
|
|
105
|
+
pb.func('V_Ashikhmin', [
|
|
106
|
+
pb.float('NdotL'),
|
|
107
|
+
pb.float('NdotV')
|
|
108
|
+
], function() {
|
|
109
|
+
this.$return(pb.clamp(pb.div(1, pb.mul(pb.sub(pb.add(this.NdotL, this.NdotV), pb.mul(this.NdotL, this.NdotV)), 4)), 0, 1));
|
|
110
|
+
});
|
|
111
|
+
pb.func('importanceSample', [
|
|
112
|
+
pb.vec2('xi'),
|
|
113
|
+
pb.vec3('normal'),
|
|
114
|
+
pb.float('roughness'),
|
|
115
|
+
pb.vec3('ggx').out(),
|
|
116
|
+
pb.vec3('charlie').out()
|
|
117
|
+
], function() {
|
|
118
|
+
this.$l.alphaRoughness = pb.mul(this.roughness, this.roughness);
|
|
119
|
+
this.$l.cosTheta = pb.clamp(pb.sqrt(pb.div(pb.sub(1, this.xi.y), pb.add(1, pb.mul(pb.sub(pb.mul(this.alphaRoughness, this.alphaRoughness), 1), this.xi.y)))), 0, 1);
|
|
120
|
+
this.$l.sinTheta = pb.sqrt(pb.sub(1, pb.mul(this.cosTheta, this.cosTheta)));
|
|
121
|
+
this.$l.phi = pb.mul(this.xi.x, Math.PI * 2);
|
|
122
|
+
this.$l.TBN = this.generateTBN(this.normal);
|
|
123
|
+
this.$l.localSpaceDir = pb.normalize(pb.vec3(pb.mul(this.sinTheta, pb.cos(this.phi)), pb.mul(this.sinTheta, pb.sin(this.phi)), this.cosTheta));
|
|
124
|
+
this.ggx = pb.mul(this.TBN, this.localSpaceDir);
|
|
125
|
+
this.sinTheta = pb.pow(this.xi.y, pb.div(this.alphaRoughness, pb.add(pb.mul(this.alphaRoughness, 2), 1)));
|
|
126
|
+
this.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));
|
|
127
|
+
this.localSpaceDir = pb.normalize(pb.vec3(pb.mul(this.sinTheta, pb.cos(this.phi)), pb.mul(this.sinTheta, pb.sin(this.phi)), this.cosTheta));
|
|
128
|
+
this.charlie = pb.mul(this.TBN, this.localSpaceDir);
|
|
129
|
+
});
|
|
130
|
+
pb.func('integrateBRDF', [
|
|
131
|
+
pb.float('NoV'),
|
|
132
|
+
pb.float('roughness')
|
|
133
|
+
], function() {
|
|
134
|
+
this.$l.V = pb.vec3(pb.sub(1, pb.mul(this.NoV, this.NoV)), 0, this.NoV);
|
|
135
|
+
this.$l.a = pb.float(0);
|
|
136
|
+
this.$l.b = pb.float(0);
|
|
137
|
+
this.$l.c = pb.float(0);
|
|
138
|
+
this.$l.n = pb.vec3(0, 0, 1);
|
|
139
|
+
this.$for(pb.int('i'), 0, SAMPLE_COUNT, function() {
|
|
140
|
+
this.$l.xi = this.hammersley2d(this.i, SAMPLE_COUNT);
|
|
141
|
+
this.$l.ggxSample = pb.vec3();
|
|
142
|
+
this.$l.charlieSample = pb.vec3();
|
|
143
|
+
this.importanceSample(this.xi, this.n, this.roughness, this.ggxSample, this.charlieSample);
|
|
144
|
+
this.$l.ggxL = pb.normalize(pb.reflect(pb.neg(this.V), this.ggxSample.xyz));
|
|
145
|
+
this.$l.ggxNoL = pb.clamp(this.ggxL.z, 0, 1);
|
|
146
|
+
this.$l.ggxNoH = pb.clamp(this.ggxSample.z, 0, 1);
|
|
147
|
+
this.$l.ggxVoH = pb.clamp(pb.dot(this.V, this.ggxSample.xyz), 0, 1);
|
|
148
|
+
this.$l.charlieL = pb.normalize(pb.reflect(pb.neg(this.V), this.charlieSample.xyz));
|
|
149
|
+
this.$l.charlieNoL = pb.clamp(this.charlieL.z, 0, 1);
|
|
150
|
+
this.$l.charlieNoH = pb.clamp(this.charlieSample.z, 0, 1);
|
|
151
|
+
this.$l.charlieVoH = pb.clamp(pb.dot(this.V, this.charlieSample.xyz), 0, 1);
|
|
152
|
+
this.$if(pb.greaterThan(this.ggxNoL, 0), function() {
|
|
153
|
+
this.$l.pdf = pb.div(pb.mul(this.smithGGXCorrelated(this.NoV, this.ggxNoL, this.roughness), this.ggxVoH, this.ggxNoL), this.ggxNoH);
|
|
154
|
+
this.$l.Fc = pb.pow(pb.sub(1, this.ggxVoH), 5);
|
|
155
|
+
this.a = pb.add(this.a, pb.mul(pb.sub(1, this.Fc), this.pdf));
|
|
156
|
+
this.b = pb.add(this.b, pb.mul(this.Fc, this.pdf));
|
|
157
|
+
});
|
|
158
|
+
this.$if(pb.greaterThan(this.charlieNoL, 0), function() {
|
|
159
|
+
this.$l.sheenDistribution = this.D_Charlie(this.roughness, this.charlieNoH);
|
|
160
|
+
this.$l.sheenVis = this.V_Ashikhmin(this.charlieNoL, this.NoV);
|
|
161
|
+
this.c = pb.add(this.c, pb.mul(this.sheenVis, this.sheenDistribution, this.charlieNoL, this.charlieVoH));
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
this.$return(pb.div(pb.vec3(pb.mul(this.a, 4), pb.mul(this.b, 4), pb.mul(this.c, 8 * Math.PI)), SAMPLE_COUNT));
|
|
165
|
+
});
|
|
166
|
+
pb.main(function() {
|
|
167
|
+
this.$outputs.color = pb.vec4(this.integrateBRDF(this.$inputs.uv.x, this.$inputs.uv.y), 1);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
const vertexLayout = device.createVertexLayout({
|
|
172
|
+
vertexBuffers: [
|
|
173
|
+
{
|
|
174
|
+
buffer: device.createVertexBuffer('position_f32x2', new Float32Array([
|
|
175
|
+
-1,
|
|
176
|
+
-1,
|
|
177
|
+
1,
|
|
178
|
+
-1,
|
|
179
|
+
-1,
|
|
180
|
+
1,
|
|
181
|
+
1,
|
|
182
|
+
1
|
|
183
|
+
]))
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
});
|
|
187
|
+
const rs = device.createRenderStateSet();
|
|
188
|
+
rs.useRasterizerState().setCullMode('none');
|
|
189
|
+
rs.useDepthState().enableTest(false).enableWrite(false);
|
|
190
|
+
const tex = device.createTexture2D('rgba8unorm', size, size, {
|
|
191
|
+
samplerOptions: {
|
|
192
|
+
mipFilter: 'none'
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
tex.name = 'GGXLUT';
|
|
196
|
+
const fb = device.createFrameBuffer([
|
|
197
|
+
tex
|
|
198
|
+
], null);
|
|
199
|
+
device.pushDeviceStates();
|
|
200
|
+
device.setProgram(program);
|
|
201
|
+
device.setVertexLayout(vertexLayout);
|
|
202
|
+
device.setRenderStates(rs);
|
|
203
|
+
device.setFramebuffer(fb);
|
|
204
|
+
device.draw('triangle-strip', 0, 4);
|
|
205
|
+
device.popDeviceStates();
|
|
206
|
+
fb.dispose();
|
|
207
|
+
vertexLayout.dispose();
|
|
208
|
+
program.dispose();
|
|
209
|
+
return tex;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export { getGGXLUT };
|
|
213
|
+
//# sourceMappingURL=ggxlut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ggxlut.js","sources":["../../../../src/utility/textures/ggxlut.ts"],"sourcesContent":["import type { Texture2D } from '@zephyr3d/device';\r\nimport { Application } from '../../app';\r\n\r\nconst ggxLut: Map<number, Texture2D> = new Map();\r\nexport function getGGXLUT(size: number): Texture2D {\r\n let lut = ggxLut.get(size);\r\n if (!lut) {\r\n lut = createGGXLUT(size);\r\n ggxLut.set(size, lut);\r\n }\r\n return lut;\r\n}\r\nfunction createGGXLUT(size: number) {\r\n const device = Application.instance.device;\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n const SAMPLE_COUNT = 1024;\r\n if (device.type === 'webgl') {\r\n pb.func('radicalInverse_VdC', [pb.int('bits')], function () {\r\n this.$l.rand = pb.float(0);\r\n this.$l.denom = pb.float(1);\r\n this.$l.invBase = pb.float(0.5);\r\n this.$l.n = this.bits;\r\n this.$for(pb.int('i'), 0, 32, function () {\r\n this.denom = pb.mul(this.denom, 2);\r\n this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));\r\n this.n = pb.div(this.n, 2);\r\n this.$if(pb.equal(this.n, 0), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.rand);\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));\r\n });\r\n } else {\r\n pb.func('radicalInverse_VdC', [pb.uint('bits')], function () {\r\n this.$l.n = this.bits;\r\n this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x55555555), 1),\r\n pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x33333333), 2),\r\n pb.sar(pb.compAnd(this.n, 0xcccccccc), 2)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4),\r\n pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8),\r\n pb.sar(pb.compAnd(this.n, 0xff00ff00), 8)\r\n );\r\n this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(\r\n pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i)))\r\n );\r\n });\r\n }\r\n pb.func('generateTBN', [pb.vec3('normal')], function () {\r\n this.$l.bitangent = pb.vec3(0, 1, 0);\r\n this.$l.NoU = this.normal.y;\r\n this.$l.epsl = 0.0000001;\r\n this.$if(pb.lessThanEqual(pb.sub(1, pb.abs(this.normal.y)), this.epsl), function () {\r\n this.bitangent = this.$choice(\r\n pb.greaterThan(this.normal.y, 0),\r\n pb.vec3(0, 0, 1),\r\n pb.vec3(0, 0, -1)\r\n );\r\n });\r\n this.$l.tangent = pb.normalize(pb.cross(this.bitangent, this.normal));\r\n this.bitangent = pb.cross(this.normal, this.tangent);\r\n this.$return(pb.mat3(this.tangent, this.bitangent, this.normal));\r\n });\r\n pb.func('D_Charlie', [pb.float('sheenRoughness'), pb.float('NdotH')], function () {\r\n this.$l.roughness = pb.max(this.sheenRoughness, 0.000001);\r\n this.$l.invR = pb.div(1, this.roughness);\r\n this.$l.cos2h = pb.mul(this.NdotH, this.NdotH);\r\n this.$l.sin2h = pb.sub(1, this.cos2h);\r\n this.$return(\r\n pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), Math.PI * 2)\r\n );\r\n });\r\n pb.func('smithGGXCorrelated', [pb.float('NoV'), pb.float('NoL'), pb.float('roughness')], function () {\r\n this.$l.a2 = pb.mul(this.roughness, this.roughness, this.roughness, this.roughness);\r\n this.$l.GGXV = pb.mul(\r\n this.NoL,\r\n pb.sqrt(pb.add(pb.mul(this.NoV, this.NoV, pb.sub(1, this.a2)), this.a2))\r\n );\r\n this.$l.GGXL = pb.mul(\r\n this.NoV,\r\n pb.sqrt(pb.add(pb.mul(this.NoL, this.NoL, pb.sub(1, this.a2)), this.a2))\r\n );\r\n this.$return(pb.div(0.5, pb.add(this.GGXV, this.GGXL)));\r\n });\r\n pb.func('V_Ashikhmin', [pb.float('NdotL'), pb.float('NdotV')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.div(1, pb.mul(pb.sub(pb.add(this.NdotL, this.NdotV), pb.mul(this.NdotL, this.NdotV)), 4)),\r\n 0,\r\n 1\r\n )\r\n );\r\n });\r\n pb.func(\r\n 'importanceSample',\r\n [\r\n pb.vec2('xi'),\r\n pb.vec3('normal'),\r\n pb.float('roughness'),\r\n pb.vec3('ggx').out(),\r\n pb.vec3('charlie').out()\r\n ],\r\n function () {\r\n this.$l.alphaRoughness = pb.mul(this.roughness, this.roughness);\r\n this.$l.cosTheta = pb.clamp(\r\n pb.sqrt(\r\n pb.div(\r\n pb.sub(1, this.xi.y),\r\n pb.add(1, pb.mul(pb.sub(pb.mul(this.alphaRoughness, this.alphaRoughness), 1), this.xi.y))\r\n )\r\n ),\r\n 0,\r\n 1\r\n );\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, pb.mul(this.cosTheta, this.cosTheta)));\r\n this.$l.phi = pb.mul(this.xi.x, Math.PI * 2);\r\n this.$l.TBN = this.generateTBN(this.normal);\r\n this.$l.localSpaceDir = pb.normalize(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n this.ggx = pb.mul(this.TBN, this.localSpaceDir);\r\n this.sinTheta = pb.pow(\r\n this.xi.y,\r\n pb.div(this.alphaRoughness, pb.add(pb.mul(this.alphaRoughness, 2), 1))\r\n );\r\n this.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));\r\n this.localSpaceDir = pb.normalize(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n this.charlie = pb.mul(this.TBN, this.localSpaceDir);\r\n }\r\n );\r\n pb.func('integrateBRDF', [pb.float('NoV'), pb.float('roughness')], function () {\r\n this.$l.V = pb.vec3(pb.sub(1, pb.mul(this.NoV, this.NoV)), 0, this.NoV);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(0);\r\n this.$l.c = pb.float(0);\r\n this.$l.n = pb.vec3(0, 0, 1);\r\n this.$for(pb.int('i'), 0, SAMPLE_COUNT, function () {\r\n this.$l.xi = this.hammersley2d(this.i, SAMPLE_COUNT);\r\n this.$l.ggxSample = pb.vec3();\r\n this.$l.charlieSample = pb.vec3();\r\n this.importanceSample(this.xi, this.n, this.roughness, this.ggxSample, this.charlieSample);\r\n this.$l.ggxL = pb.normalize(pb.reflect(pb.neg(this.V), this.ggxSample.xyz));\r\n this.$l.ggxNoL = pb.clamp(this.ggxL.z, 0, 1);\r\n this.$l.ggxNoH = pb.clamp(this.ggxSample.z, 0, 1);\r\n this.$l.ggxVoH = pb.clamp(pb.dot(this.V, this.ggxSample.xyz), 0, 1);\r\n this.$l.charlieL = pb.normalize(pb.reflect(pb.neg(this.V), this.charlieSample.xyz));\r\n this.$l.charlieNoL = pb.clamp(this.charlieL.z, 0, 1);\r\n this.$l.charlieNoH = pb.clamp(this.charlieSample.z, 0, 1);\r\n this.$l.charlieVoH = pb.clamp(pb.dot(this.V, this.charlieSample.xyz), 0, 1);\r\n this.$if(pb.greaterThan(this.ggxNoL, 0), function () {\r\n this.$l.pdf = pb.div(\r\n pb.mul(\r\n this.smithGGXCorrelated(this.NoV, this.ggxNoL, this.roughness),\r\n this.ggxVoH,\r\n this.ggxNoL\r\n ),\r\n this.ggxNoH\r\n );\r\n this.$l.Fc = pb.pow(pb.sub(1, this.ggxVoH), 5);\r\n this.a = pb.add(this.a, pb.mul(pb.sub(1, this.Fc), this.pdf));\r\n this.b = pb.add(this.b, pb.mul(this.Fc, this.pdf));\r\n });\r\n this.$if(pb.greaterThan(this.charlieNoL, 0), function () {\r\n this.$l.sheenDistribution = this.D_Charlie(this.roughness, this.charlieNoH);\r\n this.$l.sheenVis = this.V_Ashikhmin(this.charlieNoL, this.NoV);\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this.sheenVis, this.sheenDistribution, this.charlieNoL, this.charlieVoH)\r\n );\r\n });\r\n });\r\n this.$return(\r\n pb.div(pb.vec3(pb.mul(this.a, 4), pb.mul(this.b, 4), pb.mul(this.c, 8 * Math.PI)), SAMPLE_COUNT)\r\n );\r\n });\r\n pb.main(function () {\r\n this.$outputs.color = pb.vec4(this.integrateBRDF(this.$inputs.uv.x, this.$inputs.uv.y), 1);\r\n });\r\n }\r\n });\r\n const vertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n { buffer: device.createVertexBuffer('position_f32x2', new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])) }\r\n ]\r\n });\r\n const rs = device.createRenderStateSet();\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n const tex = device.createTexture2D('rgba8unorm', size, size, { samplerOptions: { mipFilter: 'none' } });\r\n tex.name = 'GGXLUT';\r\n const fb = device.createFrameBuffer([tex], null);\r\n device.pushDeviceStates();\r\n device.setProgram(program);\r\n device.setVertexLayout(vertexLayout);\r\n device.setRenderStates(rs);\r\n device.setFramebuffer(fb);\r\n device.draw('triangle-strip', 0, 4);\r\n device.popDeviceStates();\r\n fb.dispose();\r\n vertexLayout.dispose();\r\n program.dispose();\r\n return tex;\r\n}\r\n"],"names":["ggxLut","Map","getGGXLUT","size","lut","get","createGGXLUT","set","device","Application","instance","program","buildRenderProgram","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","type","y","neg","fragment","color","SAMPLE_COUNT","func","int","$l","rand","float","denom","invBase","n","bits","$for","div","mod","$if","equal","$break","$return","i","N","radicalInverse_VdC","uint","compOr","sal","sar","compAnd","vec3","bitangent","NoU","normal","epsl","lessThanEqual","sub","abs","$choice","greaterThan","tangent","normalize","cross","mat3","roughness","max","sheenRoughness","invR","cos2h","NdotH","sin2h","pow","Math","PI","a2","GGXV","NoL","sqrt","NoV","GGXL","clamp","NdotL","NdotV","out","alphaRoughness","cosTheta","xi","sinTheta","phi","x","TBN","generateTBN","localSpaceDir","cos","sin","ggx","charlie","V","a","b","c","hammersley2d","ggxSample","charlieSample","importanceSample","ggxL","reflect","xyz","ggxNoL","z","ggxNoH","ggxVoH","dot","charlieL","charlieNoL","charlieNoH","charlieVoH","pdf","smithGGXCorrelated","Fc","sheenDistribution","D_Charlie","sheenVis","V_Ashikhmin","integrateBRDF","vertexLayout","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","rs","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","tex","createTexture2D","samplerOptions","mipFilter","name","fb","createFrameBuffer","pushDeviceStates","setProgram","setVertexLayout","setRenderStates","setFramebuffer","draw","popDeviceStates","dispose"],"mappings":"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"}
|