@zephyr3d/scene 0.9.25 → 0.9.27
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 +92 -30
- package/dist/animation/animationset.js.map +1 -1
- 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/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- 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 +79 -25
- 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 +184 -69
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +268 -44
- 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 +9044 -5139
- package/dist/index.js +17 -6
- 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 +48 -10
- 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 +106 -19
- 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 +734 -23
- 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 +2059 -72
- 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 +664 -56
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.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 +121 -36
- 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 +8 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +20 -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 +3 -2
- 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 +6 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +130 -20
- 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/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.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 +39 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.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 +379 -10
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.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/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -2
- 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 +546 -4
- 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/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- 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 +1 -1
- 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 +434 -101
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +401 -5
- 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 +186 -26
- 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 +1105 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +9 -8
- 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
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
package/dist/shaders/temporal.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Views {@link Camera.TAADebug} selects between, in place of the resolved image.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Public because the property they name is: a setter taking a bare number whose
|
|
6
|
+
* legal values cannot be spelled is not usable from outside the package, and the
|
|
7
|
+
* editor already surfaces them as an enum.
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
*/ const TAA_DEBUG_NONE = 0;
|
|
11
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_CURRENT_COLOR = 1;
|
|
12
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_HISTORY_COLOR = 2;
|
|
13
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_VELOCITY = 3;
|
|
14
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_EDGE = 4;
|
|
15
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_ALAPH = 5;
|
|
16
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_MOTION_VECTOR = 6;
|
|
17
|
+
/** {@inheritDoc TAA_DEBUG_NONE} @public */ const TAA_DEBUG_STRENGTH = 7;
|
|
9
18
|
const FLT_MIN = 0.00000001;
|
|
10
19
|
const FLT_MAX = 32767;
|
|
20
|
+
/** Reinhard-space ceiling whose inverse is {@link FLT_MAX}, so clipping in
|
|
21
|
+
* tonemapped space keeps the same linear ceiling the resolve had when it
|
|
22
|
+
* clamped afterwards. */ const TONEMAPPED_MAX = FLT_MAX / (FLT_MAX + 1);
|
|
11
23
|
/**
|
|
12
24
|
* Temporal resolve implementation
|
|
13
25
|
*
|
|
@@ -25,6 +37,28 @@ const FLT_MAX = 32767;
|
|
|
25
37
|
* @public
|
|
26
38
|
*/ function temporalResolve(scope, currentColorTex, historyColorTex, currentDepthTex, motionVectorTex, prevMotionVectorTex, uv, workSize, debug = TAA_DEBUG_NONE) {
|
|
27
39
|
const pb = scope.$builder;
|
|
40
|
+
// Defined ahead of the neighbourhood helpers because clipHistoryColor calls
|
|
41
|
+
// reinhard: pb emits functions in definition order and GLSL requires a callee
|
|
42
|
+
// to be declared before its caller.
|
|
43
|
+
pb.func('reinhard', [
|
|
44
|
+
pb.vec3('hdr')
|
|
45
|
+
], function() {
|
|
46
|
+
// Floor at zero: x / (1 + x) has a pole at -1, and the 3x3 neighbourhood is
|
|
47
|
+
// sampled straight from the scene color, which an upstream effect can leave
|
|
48
|
+
// slightly negative.
|
|
49
|
+
this.$l.c = pb.max(this.hdr, pb.vec3(0));
|
|
50
|
+
this.$return(pb.div(this.c, pb.add(this.c, pb.vec3(1))));
|
|
51
|
+
});
|
|
52
|
+
pb.func('reinhardInv', [
|
|
53
|
+
pb.vec3('sdr')
|
|
54
|
+
], function() {
|
|
55
|
+
this.$return(pb.div(this.sdr, pb.sub(pb.vec3(1), this.sdr)));
|
|
56
|
+
});
|
|
57
|
+
pb.func('luminance', [
|
|
58
|
+
pb.vec3('color')
|
|
59
|
+
], function() {
|
|
60
|
+
this.$return(pb.max(pb.dot(this.color, pb.vec3(0.299, 0.587, 0.114)), 0.0001));
|
|
61
|
+
});
|
|
28
62
|
pb.func('getClosestVelocity', [
|
|
29
63
|
pb.vec2('uv'),
|
|
30
64
|
pb.vec2('texSize')
|
|
@@ -86,7 +120,13 @@ const FLT_MAX = 32767;
|
|
|
86
120
|
this.$l.colorAvg2 = pb.vec3(0);
|
|
87
121
|
for(let i = -1; i <= 1; i++){
|
|
88
122
|
for(let j = -1; j <= 1; j++){
|
|
89
|
-
|
|
123
|
+
// The box is built in Reinhard space and `historyColor` arrives
|
|
124
|
+
// tonemapped to match. Gathering it in linear HDR instead makes a
|
|
125
|
+
// single specular texel of a few thousand, sitting next to neighbours
|
|
126
|
+
// near 1, blow the standard deviation up until the AABB contains any
|
|
127
|
+
// history at all -- the clip then stops constraining exactly the
|
|
128
|
+
// pixels that flicker, which is where it is needed most.
|
|
129
|
+
this.$l[`s${n}`] = this.reinhard(pb.textureSampleLevel(currentColorTex, pb.add(this.uv, pb.div(pb.vec2(i, j), this.texSize)), 0).rgb);
|
|
90
130
|
this.colorAvg = pb.add(this.colorAvg, this[`s${n}`]);
|
|
91
131
|
this.colorAvg2 = pb.add(this.colorAvg2, pb.mul(this[`s${n}`], this[`s${n}`]));
|
|
92
132
|
n++;
|
|
@@ -94,29 +134,17 @@ const FLT_MAX = 32767;
|
|
|
94
134
|
}
|
|
95
135
|
this.colorAvg = pb.div(this.colorAvg, n - 1);
|
|
96
136
|
this.colorAvg2 = pb.div(this.colorAvg2, n - 1);
|
|
97
|
-
|
|
137
|
+
// Keep a non-zero floor: collapsing the box to the 3x3 mean while moving
|
|
138
|
+
// discards all sub-pixel detail and turns the output into a box-filtered
|
|
139
|
+
// jittered frame, which shimmers with the jitter phase.
|
|
140
|
+
this.$l.boxSize = pb.mix(2.5, 0.75, pb.smoothStep(0, 0.02, pb.length(this.closestVelocity)));
|
|
98
141
|
this.$l.dev = pb.mul(pb.sqrt(pb.abs(pb.sub(this.colorAvg2, pb.mul(this.colorAvg, this.colorAvg)))), this.boxSize);
|
|
99
142
|
this.$l.colorMin = pb.sub(this.colorAvg, this.dev);
|
|
100
143
|
this.$l.colorMax = pb.add(this.colorAvg, this.dev);
|
|
101
144
|
this.$l.color = this.clipAABB(this.colorMin, this.colorMax, pb.clamp(this.colorAvg, this.colorMin, this.colorMax), this.historyColor);
|
|
102
|
-
this.color = pb.clamp(this.color, pb.vec3(
|
|
145
|
+
this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(TONEMAPPED_MAX));
|
|
103
146
|
this.$return(this.color);
|
|
104
147
|
});
|
|
105
|
-
pb.func('reinhard', [
|
|
106
|
-
pb.vec3('hdr')
|
|
107
|
-
], function() {
|
|
108
|
-
this.$return(pb.div(this.hdr, pb.add(this.hdr, pb.vec3(1))));
|
|
109
|
-
});
|
|
110
|
-
pb.func('reinhardInv', [
|
|
111
|
-
pb.vec3('sdr')
|
|
112
|
-
], function() {
|
|
113
|
-
this.$return(pb.div(this.sdr, pb.sub(pb.vec3(1), this.sdr)));
|
|
114
|
-
});
|
|
115
|
-
pb.func('luminance', [
|
|
116
|
-
pb.vec3('color')
|
|
117
|
-
], function() {
|
|
118
|
-
this.$return(pb.max(pb.dot(this.color, pb.vec3(0.299, 0.587, 0.114)), 0.0001));
|
|
119
|
-
});
|
|
120
148
|
pb.func('getDisocclusionFactor', [
|
|
121
149
|
pb.vec2('uv'),
|
|
122
150
|
pb.vec2('velocity'),
|
|
@@ -168,24 +196,34 @@ const FLT_MAX = 32767;
|
|
|
168
196
|
this.$if(pb.and(pb.greaterThanEqual(this.velocity.x, 5e4), pb.greaterThanEqual(this.velocity.y, 5e4)), function() {
|
|
169
197
|
this.$return(this.sampleColor);
|
|
170
198
|
});
|
|
171
|
-
|
|
199
|
+
// Reproject with the depth-dilated (closest) velocity so silhouette pixels
|
|
200
|
+
// follow the foreground geometry; using the center velocity causes edge
|
|
201
|
+
// crawling/shimmer at object boundaries.
|
|
202
|
+
this.$l.velocityClosest = this.getClosestVelocity(this.screenUV, this.texSize);
|
|
203
|
+
this.$l.reprojectedUV = pb.sub(this.screenUV, this.velocityClosest.xy);
|
|
172
204
|
//this.$l.historyColor = pb.textureSampleLevel(historyColorTex, this.reprojectedUV, 0).rgb;
|
|
173
205
|
this.$l.historyColor = this.sampleHistoryColorCatmulRom9(this.reprojectedUV, this.texSize);
|
|
174
|
-
this.$l.velocityClosest = this.getClosestVelocity(this.screenUV, this.texSize);
|
|
175
206
|
this.$l.blendFactor = pb.div(this.velocityClosest.z, 50000);
|
|
176
|
-
|
|
207
|
+
// Tonemap, then clip -- not the other way round. The neighbourhood box is
|
|
208
|
+
// built in Reinhard space, so the history has to be in it as well; the
|
|
209
|
+
// resolve stays there until the final reinhardInv below.
|
|
210
|
+
this.prevColor = this.clipHistoryColor(this.screenUV, this.reinhard(this.historyColor), this.velocityClosest.xy, this.texSize);
|
|
177
211
|
this.$l.screenFactor = this.$choice(pb.or(pb.any(pb.lessThan(this.reprojectedUV, pb.vec2(0))), pb.any(pb.greaterThan(this.reprojectedUV, pb.vec2(1)))), pb.float(1), pb.float(0));
|
|
178
|
-
this.$l.disocclusionFactor = this.getDisocclusionFactor(this.reprojectedUV, this.
|
|
212
|
+
this.$l.disocclusionFactor = this.getDisocclusionFactor(this.reprojectedUV, this.velocityClosest.xy, this.texSize);
|
|
179
213
|
this.$l.alpha = pb.clamp(pb.add(this.blendFactor, this.screenFactor, this.disocclusionFactor), 0, 1);
|
|
180
214
|
//this.alpha = 0.1;
|
|
181
|
-
|
|
215
|
+
// prevColor is already tonemapped (and clipped in that space) above.
|
|
182
216
|
this.currentColor = this.reinhard(this.sampleColor);
|
|
183
217
|
this.$l.currentLum = this.luminance(this.currentColor);
|
|
184
218
|
this.$l.prevLum = this.luminance(this.prevColor);
|
|
185
|
-
|
|
219
|
+
// Luminance is in Reinhard space (always < 1), so a 1.001 floor makes the
|
|
220
|
+
// denominator constant and the ratio degenerates to an absolute difference,
|
|
221
|
+
// leaving dark-area flicker almost undamped. Use a smaller floor so the
|
|
222
|
+
// difference stays relative.
|
|
223
|
+
this.$l.diff = pb.div(pb.abs(pb.sub(this.currentLum, this.prevLum)), pb.max(this.currentLum, pb.max(this.prevLum, 0.2)));
|
|
186
224
|
this.diff = pb.sub(1, this.diff);
|
|
187
225
|
this.diff = pb.mul(this.diff, this.diff);
|
|
188
|
-
this.alpha = pb.clamp(pb.mix(0, this.alpha, this.diff), 0.
|
|
226
|
+
this.alpha = pb.clamp(pb.mix(0, this.alpha, this.diff), 0.05, 1);
|
|
189
227
|
this.$l.resolvedColor = pb.vec3();
|
|
190
228
|
if (debug === TAA_DEBUG_CURRENT_COLOR) {
|
|
191
229
|
this.resolvedColor = this.currentColor.rgb;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temporal.js","sources":["../../src/shaders/temporal.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/** @internal */\r\nexport const TAA_DEBUG_NONE = 0;\r\n/** @internal */\r\nexport const TAA_DEBUG_CURRENT_COLOR = 1;\r\n/** @internal */\r\nexport const TAA_DEBUG_HISTORY_COLOR = 2;\r\n/** @internal */\r\nexport const TAA_DEBUG_VELOCITY = 3;\r\n/** @internal */\r\nexport const TAA_DEBUG_EDGE = 4;\r\n/** @internal */\r\nexport const TAA_DEBUG_ALAPH = 5;\r\n/** @internal */\r\nexport const TAA_DEBUG_MOTION_VECTOR = 6;\r\n/** @internal */\r\nexport const TAA_DEBUG_STRENGTH = 7;\r\n\r\nconst FLT_MIN = 0.00000001;\r\nconst FLT_MAX = 32767;\r\n\r\n/**\r\n * Temporal resolve implementation\r\n *\r\n * @param scope - The shader scope\r\n * @param currentColorTex - 2D texture that holds the current color\r\n * @param historyColorTex - 2D texture that holds the history color\r\n * @param currentDepthTex - 2D texture that holds the scene depth\r\n * @param motionVectorTex - 2D texture that holds the motion vector\r\n * @param prevMotionVectorTex - 2D texture that holds the previous motion vector\r\n * @param uv - Fragment uv coordinate\r\n * @param workSize - Target texture size\r\n * @param debug - Value for debugging\r\n * @returns\r\n *\r\n * @public\r\n */\r\nexport function temporalResolve(\r\n scope: PBInsideFunctionScope,\r\n currentColorTex: PBShaderExp,\r\n historyColorTex: PBShaderExp,\r\n currentDepthTex: PBShaderExp,\r\n motionVectorTex: PBShaderExp,\r\n prevMotionVectorTex: PBShaderExp,\r\n uv: PBShaderExp,\r\n workSize: PBShaderExp,\r\n debug = TAA_DEBUG_NONE\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('getClosestVelocity', [pb.vec2('uv'), pb.vec2('texSize')], function () {\r\n this.$l.minDepth = pb.float(1);\r\n this.$l.closestUV = this.uv;\r\n this.$l.tmpDepth = pb.float();\r\n this.$l.tmpUV = pb.vec2();\r\n for (let i = -1; i <= 1; i++) {\r\n for (let j = -1; j <= 1; j++) {\r\n this.tmpUV = pb.add(this.uv, pb.div(pb.vec2(i, j), this.texSize));\r\n this.tmpDepth = pb.textureSampleLevel(currentDepthTex, this.tmpUV, 0).r;\r\n this.$if(pb.lessThan(this.tmpDepth, this.minDepth), function () {\r\n this.minDepth = this.tmpDepth;\r\n this.closestUV = this.tmpUV;\r\n });\r\n }\r\n }\r\n this.$l.motionVector = pb.textureSampleLevel(motionVectorTex, this.closestUV, 0);\r\n this.$return(this.motionVector.xyz);\r\n });\r\n pb.func('clipAABB', [pb.vec3('aabbMin'), pb.vec3('aabbMax'), pb.vec3('p'), pb.vec3('q')], function () {\r\n this.$l.r = pb.sub(this.q, this.p);\r\n this.$l.rMax = pb.sub(this.aabbMax, this.p);\r\n this.$l.rMin = pb.sub(this.aabbMin, this.p);\r\n this.$if(pb.greaterThan(this.r.x, pb.add(this.rMax.x, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMax.x, this.r.x));\r\n });\r\n this.$if(pb.greaterThan(this.r.y, pb.add(this.rMax.y, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMax.y, this.r.y));\r\n });\r\n this.$if(pb.greaterThan(this.r.z, pb.add(this.rMax.z, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMax.z, this.r.z));\r\n });\r\n this.$if(pb.lessThan(this.r.x, pb.sub(this.rMin.x, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMin.x, this.r.x));\r\n });\r\n this.$if(pb.lessThan(this.r.y, pb.sub(this.rMin.y, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMin.y, this.r.y));\r\n });\r\n this.$if(pb.lessThan(this.r.z, pb.sub(this.rMin.z, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMin.z, this.r.z));\r\n });\r\n this.$return(pb.add(this.p, this.r));\r\n });\r\n pb.func(\r\n 'clipHistoryColor',\r\n [pb.vec2('uv'), pb.vec3('historyColor'), pb.vec2('closestVelocity'), pb.vec2('texSize')],\r\n function () {\r\n let n = 1;\r\n this.$l.colorAvg = pb.vec3(0);\r\n this.$l.colorAvg2 = pb.vec3(0);\r\n for (let i = -1; i <= 1; i++) {\r\n for (let j = -1; j <= 1; j++) {\r\n this.$l[`s${n}`] = pb.textureSampleLevel(\r\n currentColorTex,\r\n pb.add(this.uv, pb.div(pb.vec2(i, j), this.texSize)),\r\n 0\r\n ).rgb;\r\n this.colorAvg = pb.add(this.colorAvg, this[`s${n}`]);\r\n this.colorAvg2 = pb.add(this.colorAvg2, pb.mul(this[`s${n}`], this[`s${n}`]));\r\n n++;\r\n }\r\n }\r\n this.colorAvg = pb.div(this.colorAvg, n - 1);\r\n this.colorAvg2 = pb.div(this.colorAvg2, n - 1);\r\n this.$l.boxSize = pb.mix(2.5, 0, pb.smoothStep(0, 0.02, pb.length(this.closestVelocity)));\r\n this.$l.dev = pb.mul(\r\n pb.sqrt(pb.abs(pb.sub(this.colorAvg2, pb.mul(this.colorAvg, this.colorAvg)))),\r\n this.boxSize\r\n );\r\n this.$l.colorMin = pb.sub(this.colorAvg, this.dev);\r\n this.$l.colorMax = pb.add(this.colorAvg, this.dev);\r\n this.$l.color = this.clipAABB(\r\n this.colorMin,\r\n this.colorMax,\r\n pb.clamp(this.colorAvg, this.colorMin, this.colorMax),\r\n this.historyColor\r\n );\r\n this.color = pb.clamp(this.color, pb.vec3(FLT_MIN), pb.vec3(FLT_MAX));\r\n this.$return(this.color);\r\n }\r\n );\r\n pb.func('reinhard', [pb.vec3('hdr')], function () {\r\n this.$return(pb.div(this.hdr, pb.add(this.hdr, pb.vec3(1))));\r\n });\r\n pb.func('reinhardInv', [pb.vec3('sdr')], function () {\r\n this.$return(pb.div(this.sdr, pb.sub(pb.vec3(1), this.sdr)));\r\n });\r\n pb.func('luminance', [pb.vec3('color')], function () {\r\n this.$return(pb.max(pb.dot(this.color, pb.vec3(0.299, 0.587, 0.114)), 0.0001));\r\n });\r\n pb.func('getDisocclusionFactor', [pb.vec2('uv'), pb.vec2('velocity'), pb.vec2('texSize')], function () {\r\n this.$l.prevVelocitySample = pb.textureSampleLevel(prevMotionVectorTex, this.uv, 0);\r\n this.$l.prevVelocity = this.prevVelocitySample.xy;\r\n this.$l.disocclusion = pb.sub(\r\n pb.length(pb.mul(pb.sub(this.velocity, this.prevVelocity), this.texSize)),\r\n 2.5\r\n );\r\n this.$return(pb.clamp(pb.mul(this.disocclusion, 0.01), 0, 1));\r\n });\r\n pb.func('sampleHistoryColorCatmulRom9', [pb.vec2('uv'), pb.vec2('texSize')], function () {\r\n this.$l.samplePos = pb.mul(this.uv, this.texSize);\r\n this.$l.texPos1 = pb.add(pb.floor(pb.sub(this.samplePos, pb.vec2(0.5))), pb.vec2(0.5));\r\n this.$l.f = pb.sub(this.samplePos, this.texPos1);\r\n this.$l.w0 = pb.mul(\r\n this.f,\r\n pb.sub(pb.mul(this.f, pb.sub(pb.vec2(1), pb.mul(this.f, 0.5))), pb.vec2(0.5))\r\n );\r\n this.$l.w1 = pb.add(pb.vec2(1), pb.mul(this.f, this.f, pb.sub(pb.mul(this.f, 1.5), pb.vec2(2.5))));\r\n this.$l.w2 = pb.mul(\r\n this.f,\r\n pb.add(pb.vec2(0.5), pb.mul(this.f, pb.sub(pb.vec2(2), pb.mul(this.f, 1.5))))\r\n );\r\n this.$l.w3 = pb.mul(this.f, this.f, pb.sub(pb.mul(this.f, 0.5), pb.vec2(0.5)));\r\n this.$l.w12 = pb.add(this.w1, this.w2);\r\n this.$l.offset12 = pb.div(this.w2, pb.add(this.w1, this.w2));\r\n this.$l.texPos0 = pb.sub(this.texPos1, pb.vec2(1));\r\n this.$l.texPos3 = pb.add(this.texPos1, pb.vec2(2));\r\n this.$l.texPos12 = pb.add(this.texPos1, this.offset12);\r\n this.texPos0 = pb.div(this.texPos0, this.texSize);\r\n this.texPos3 = pb.div(this.texPos3, this.texSize);\r\n this.texPos12 = pb.div(this.texPos12, this.texSize);\r\n this.$l.result = pb.vec3(0);\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos0, 0).rgb, this.w0.x, this.w0.y)\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos12.x, this.texPos0.y), 0).rgb,\r\n this.w12.x,\r\n this.w0.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos3.x, this.texPos0.y), 0).rgb,\r\n this.w3.x,\r\n this.w0.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos0.x, this.texPos12.y), 0).rgb,\r\n this.w0.x,\r\n this.w12.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos12, 0).rgb, this.w12.x, this.w12.y)\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos3.x, this.texPos12.y), 0).rgb,\r\n this.w3.x,\r\n this.w12.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos0.x, this.texPos3.y), 0).rgb,\r\n this.w0.x,\r\n this.w3.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos12.x, this.texPos3.y), 0).rgb,\r\n this.w12.x,\r\n this.w3.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos3, 0).rgb, this.w3.x, this.w3.y)\r\n );\r\n this.$return(pb.max(this.result, pb.vec3(0)));\r\n });\r\n pb.func('temporalResolve', [pb.vec2('screenUV'), pb.vec2('texSize')], function () {\r\n this.$l.velocitySample = pb.textureSampleLevel(motionVectorTex, this.screenUV, 0);\r\n this.$l.velocity = this.velocitySample.xy;\r\n this.$l.sampleColor = pb.textureSampleLevel(currentColorTex, this.screenUV, 0).rgb;\r\n this.$if(\r\n pb.and(pb.greaterThanEqual(this.velocity.x, 5e4), pb.greaterThanEqual(this.velocity.y, 5e4)),\r\n function () {\r\n this.$return(this.sampleColor);\r\n }\r\n );\r\n this.$l.reprojectedUV = pb.sub(this.screenUV, this.velocity);\r\n //this.$l.historyColor = pb.textureSampleLevel(historyColorTex, this.reprojectedUV, 0).rgb;\r\n this.$l.historyColor = this.sampleHistoryColorCatmulRom9(this.reprojectedUV, this.texSize);\r\n this.$l.velocityClosest = this.getClosestVelocity(this.screenUV, this.texSize);\r\n this.$l.blendFactor = pb.div(this.velocityClosest.z, 50000);\r\n this.prevColor = this.clipHistoryColor(\r\n this.screenUV,\r\n this.historyColor,\r\n this.velocityClosest.xy,\r\n this.texSize\r\n );\r\n this.$l.screenFactor = this.$choice(\r\n pb.or(\r\n pb.any(pb.lessThan(this.reprojectedUV, pb.vec2(0))),\r\n pb.any(pb.greaterThan(this.reprojectedUV, pb.vec2(1)))\r\n ),\r\n pb.float(1),\r\n pb.float(0)\r\n );\r\n this.$l.disocclusionFactor = this.getDisocclusionFactor(this.reprojectedUV, this.velocity, this.texSize);\r\n this.$l.alpha = pb.clamp(pb.add(this.blendFactor, this.screenFactor, this.disocclusionFactor), 0, 1);\r\n //this.alpha = 0.1;\r\n this.prevColor = this.reinhard(this.prevColor);\r\n this.currentColor = this.reinhard(this.sampleColor);\r\n this.$l.currentLum = this.luminance(this.currentColor);\r\n this.$l.prevLum = this.luminance(this.prevColor);\r\n this.$l.diff = pb.div(\r\n pb.abs(pb.sub(this.currentLum, this.prevLum)),\r\n pb.max(this.currentLum, pb.max(this.prevLum, 1.001))\r\n );\r\n this.diff = pb.sub(1, this.diff);\r\n this.diff = pb.mul(this.diff, this.diff);\r\n this.alpha = pb.clamp(pb.mix(0, this.alpha, this.diff), 0.1, 1);\r\n this.$l.resolvedColor = pb.vec3();\r\n if (debug === TAA_DEBUG_CURRENT_COLOR) {\r\n this.resolvedColor = this.currentColor.rgb;\r\n this.resolvedColor = this.reinhardInv(this.resolvedColor);\r\n } else if (debug === TAA_DEBUG_HISTORY_COLOR) {\r\n this.resolvedColor = this.prevColor.rgb;\r\n this.resolvedColor = this.reinhardInv(this.resolvedColor);\r\n } else if (debug === TAA_DEBUG_EDGE) {\r\n this.resolvedColor = pb.vec3(this.screenFactor);\r\n } else if (debug === TAA_DEBUG_ALAPH) {\r\n this.resolvedColor = pb.vec3(this.alpha);\r\n } else if (debug === TAA_DEBUG_VELOCITY) {\r\n this.resolvedColor = pb.abs(pb.sub(this.sampleColor, this.historyColor));\r\n } else if (debug === TAA_DEBUG_MOTION_VECTOR) {\r\n this.resolvedColor = pb.abs(pb.mul(this.velocityClosest, 20));\r\n } else if (debug === TAA_DEBUG_STRENGTH) {\r\n this.resolvedColor = pb.vec3(this.blendFactor);\r\n } else {\r\n this.resolvedColor = pb.mix(this.prevColor.rgb, this.currentColor.rgb, this.alpha);\r\n this.resolvedColor = this.reinhardInv(this.resolvedColor);\r\n }\r\n this.$return(this.resolvedColor);\r\n });\r\n return scope.temporalResolve(uv, workSize) as PBShaderExp;\r\n}\r\n"],"names":["TAA_DEBUG_NONE","TAA_DEBUG_CURRENT_COLOR","TAA_DEBUG_HISTORY_COLOR","TAA_DEBUG_VELOCITY","TAA_DEBUG_EDGE","TAA_DEBUG_ALAPH","TAA_DEBUG_MOTION_VECTOR","TAA_DEBUG_STRENGTH","FLT_MIN","FLT_MAX","temporalResolve","scope","currentColorTex","historyColorTex","currentDepthTex","motionVectorTex","prevMotionVectorTex","uv","workSize","debug","pb","$builder","func","vec2","$l","minDepth","float","closestUV","tmpDepth","tmpUV","i","j","add","div","texSize","textureSampleLevel","r","$if","lessThan","motionVector","$return","xyz","vec3","sub","q","p","rMax","aabbMax","rMin","aabbMin","greaterThan","x","mul","y","z","n","colorAvg","colorAvg2","rgb","boxSize","mix","smoothStep","length","closestVelocity","dev","sqrt","abs","colorMin","colorMax","color","clipAABB","clamp","historyColor","hdr","sdr","max","dot","prevVelocitySample","prevVelocity","xy","disocclusion","velocity","samplePos","texPos1","floor","f","w0","w1","w2","w3","w12","offset12","texPos0","texPos3","texPos12","result","velocitySample","screenUV","sampleColor","and","greaterThanEqual","reprojectedUV","sampleHistoryColorCatmulRom9","velocityClosest","getClosestVelocity","blendFactor","prevColor","clipHistoryColor","screenFactor","$choice","or","any","disocclusionFactor","getDisocclusionFactor","alpha","reinhard","currentColor","currentLum","luminance","prevLum","diff","resolvedColor","reinhardInv"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"temporal.js","sources":["../../src/shaders/temporal.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Views {@link Camera.TAADebug} selects between, in place of the resolved image.\r\n *\r\n * @remarks\r\n * Public because the property they name is: a setter taking a bare number whose\r\n * legal values cannot be spelled is not usable from outside the package, and the\r\n * editor already surfaces them as an enum.\r\n *\r\n * @public\r\n */\r\nexport const TAA_DEBUG_NONE = 0;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_CURRENT_COLOR = 1;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_HISTORY_COLOR = 2;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_VELOCITY = 3;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_EDGE = 4;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_ALAPH = 5;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_MOTION_VECTOR = 6;\r\n/** {@inheritDoc TAA_DEBUG_NONE} @public */\r\nexport const TAA_DEBUG_STRENGTH = 7;\r\n\r\nconst FLT_MIN = 0.00000001;\r\nconst FLT_MAX = 32767;\r\n/** Reinhard-space ceiling whose inverse is {@link FLT_MAX}, so clipping in\r\n * tonemapped space keeps the same linear ceiling the resolve had when it\r\n * clamped afterwards. */\r\nconst TONEMAPPED_MAX = FLT_MAX / (FLT_MAX + 1);\r\n\r\n/**\r\n * Temporal resolve implementation\r\n *\r\n * @param scope - The shader scope\r\n * @param currentColorTex - 2D texture that holds the current color\r\n * @param historyColorTex - 2D texture that holds the history color\r\n * @param currentDepthTex - 2D texture that holds the scene depth\r\n * @param motionVectorTex - 2D texture that holds the motion vector\r\n * @param prevMotionVectorTex - 2D texture that holds the previous motion vector\r\n * @param uv - Fragment uv coordinate\r\n * @param workSize - Target texture size\r\n * @param debug - Value for debugging\r\n * @returns\r\n *\r\n * @public\r\n */\r\nexport function temporalResolve(\r\n scope: PBInsideFunctionScope,\r\n currentColorTex: PBShaderExp,\r\n historyColorTex: PBShaderExp,\r\n currentDepthTex: PBShaderExp,\r\n motionVectorTex: PBShaderExp,\r\n prevMotionVectorTex: PBShaderExp,\r\n uv: PBShaderExp,\r\n workSize: PBShaderExp,\r\n debug = TAA_DEBUG_NONE\r\n) {\r\n const pb = scope.$builder;\r\n // Defined ahead of the neighbourhood helpers because clipHistoryColor calls\r\n // reinhard: pb emits functions in definition order and GLSL requires a callee\r\n // to be declared before its caller.\r\n pb.func('reinhard', [pb.vec3('hdr')], function () {\r\n // Floor at zero: x / (1 + x) has a pole at -1, and the 3x3 neighbourhood is\r\n // sampled straight from the scene color, which an upstream effect can leave\r\n // slightly negative.\r\n this.$l.c = pb.max(this.hdr, pb.vec3(0));\r\n this.$return(pb.div(this.c, pb.add(this.c, pb.vec3(1))));\r\n });\r\n pb.func('reinhardInv', [pb.vec3('sdr')], function () {\r\n this.$return(pb.div(this.sdr, pb.sub(pb.vec3(1), this.sdr)));\r\n });\r\n pb.func('luminance', [pb.vec3('color')], function () {\r\n this.$return(pb.max(pb.dot(this.color, pb.vec3(0.299, 0.587, 0.114)), 0.0001));\r\n });\r\n pb.func('getClosestVelocity', [pb.vec2('uv'), pb.vec2('texSize')], function () {\r\n this.$l.minDepth = pb.float(1);\r\n this.$l.closestUV = this.uv;\r\n this.$l.tmpDepth = pb.float();\r\n this.$l.tmpUV = pb.vec2();\r\n for (let i = -1; i <= 1; i++) {\r\n for (let j = -1; j <= 1; j++) {\r\n this.tmpUV = pb.add(this.uv, pb.div(pb.vec2(i, j), this.texSize));\r\n this.tmpDepth = pb.textureSampleLevel(currentDepthTex, this.tmpUV, 0).r;\r\n this.$if(pb.lessThan(this.tmpDepth, this.minDepth), function () {\r\n this.minDepth = this.tmpDepth;\r\n this.closestUV = this.tmpUV;\r\n });\r\n }\r\n }\r\n this.$l.motionVector = pb.textureSampleLevel(motionVectorTex, this.closestUV, 0);\r\n this.$return(this.motionVector.xyz);\r\n });\r\n pb.func('clipAABB', [pb.vec3('aabbMin'), pb.vec3('aabbMax'), pb.vec3('p'), pb.vec3('q')], function () {\r\n this.$l.r = pb.sub(this.q, this.p);\r\n this.$l.rMax = pb.sub(this.aabbMax, this.p);\r\n this.$l.rMin = pb.sub(this.aabbMin, this.p);\r\n this.$if(pb.greaterThan(this.r.x, pb.add(this.rMax.x, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMax.x, this.r.x));\r\n });\r\n this.$if(pb.greaterThan(this.r.y, pb.add(this.rMax.y, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMax.y, this.r.y));\r\n });\r\n this.$if(pb.greaterThan(this.r.z, pb.add(this.rMax.z, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMax.z, this.r.z));\r\n });\r\n this.$if(pb.lessThan(this.r.x, pb.sub(this.rMin.x, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMin.x, this.r.x));\r\n });\r\n this.$if(pb.lessThan(this.r.y, pb.sub(this.rMin.y, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMin.y, this.r.y));\r\n });\r\n this.$if(pb.lessThan(this.r.z, pb.sub(this.rMin.z, FLT_MIN)), function () {\r\n this.r = pb.mul(this.r, pb.div(this.rMin.z, this.r.z));\r\n });\r\n this.$return(pb.add(this.p, this.r));\r\n });\r\n pb.func(\r\n 'clipHistoryColor',\r\n [pb.vec2('uv'), pb.vec3('historyColor'), pb.vec2('closestVelocity'), pb.vec2('texSize')],\r\n function () {\r\n let n = 1;\r\n this.$l.colorAvg = pb.vec3(0);\r\n this.$l.colorAvg2 = pb.vec3(0);\r\n for (let i = -1; i <= 1; i++) {\r\n for (let j = -1; j <= 1; j++) {\r\n // The box is built in Reinhard space and `historyColor` arrives\r\n // tonemapped to match. Gathering it in linear HDR instead makes a\r\n // single specular texel of a few thousand, sitting next to neighbours\r\n // near 1, blow the standard deviation up until the AABB contains any\r\n // history at all -- the clip then stops constraining exactly the\r\n // pixels that flicker, which is where it is needed most.\r\n this.$l[`s${n}`] = this.reinhard(\r\n pb.textureSampleLevel(currentColorTex, pb.add(this.uv, pb.div(pb.vec2(i, j), this.texSize)), 0)\r\n .rgb\r\n );\r\n this.colorAvg = pb.add(this.colorAvg, this[`s${n}`]);\r\n this.colorAvg2 = pb.add(this.colorAvg2, pb.mul(this[`s${n}`], this[`s${n}`]));\r\n n++;\r\n }\r\n }\r\n this.colorAvg = pb.div(this.colorAvg, n - 1);\r\n this.colorAvg2 = pb.div(this.colorAvg2, n - 1);\r\n // Keep a non-zero floor: collapsing the box to the 3x3 mean while moving\r\n // discards all sub-pixel detail and turns the output into a box-filtered\r\n // jittered frame, which shimmers with the jitter phase.\r\n this.$l.boxSize = pb.mix(2.5, 0.75, pb.smoothStep(0, 0.02, pb.length(this.closestVelocity)));\r\n this.$l.dev = pb.mul(\r\n pb.sqrt(pb.abs(pb.sub(this.colorAvg2, pb.mul(this.colorAvg, this.colorAvg)))),\r\n this.boxSize\r\n );\r\n this.$l.colorMin = pb.sub(this.colorAvg, this.dev);\r\n this.$l.colorMax = pb.add(this.colorAvg, this.dev);\r\n this.$l.color = this.clipAABB(\r\n this.colorMin,\r\n this.colorMax,\r\n pb.clamp(this.colorAvg, this.colorMin, this.colorMax),\r\n this.historyColor\r\n );\r\n this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(TONEMAPPED_MAX));\r\n this.$return(this.color);\r\n }\r\n );\r\n pb.func('getDisocclusionFactor', [pb.vec2('uv'), pb.vec2('velocity'), pb.vec2('texSize')], function () {\r\n this.$l.prevVelocitySample = pb.textureSampleLevel(prevMotionVectorTex, this.uv, 0);\r\n this.$l.prevVelocity = this.prevVelocitySample.xy;\r\n this.$l.disocclusion = pb.sub(\r\n pb.length(pb.mul(pb.sub(this.velocity, this.prevVelocity), this.texSize)),\r\n 2.5\r\n );\r\n this.$return(pb.clamp(pb.mul(this.disocclusion, 0.01), 0, 1));\r\n });\r\n pb.func('sampleHistoryColorCatmulRom9', [pb.vec2('uv'), pb.vec2('texSize')], function () {\r\n this.$l.samplePos = pb.mul(this.uv, this.texSize);\r\n this.$l.texPos1 = pb.add(pb.floor(pb.sub(this.samplePos, pb.vec2(0.5))), pb.vec2(0.5));\r\n this.$l.f = pb.sub(this.samplePos, this.texPos1);\r\n this.$l.w0 = pb.mul(\r\n this.f,\r\n pb.sub(pb.mul(this.f, pb.sub(pb.vec2(1), pb.mul(this.f, 0.5))), pb.vec2(0.5))\r\n );\r\n this.$l.w1 = pb.add(pb.vec2(1), pb.mul(this.f, this.f, pb.sub(pb.mul(this.f, 1.5), pb.vec2(2.5))));\r\n this.$l.w2 = pb.mul(\r\n this.f,\r\n pb.add(pb.vec2(0.5), pb.mul(this.f, pb.sub(pb.vec2(2), pb.mul(this.f, 1.5))))\r\n );\r\n this.$l.w3 = pb.mul(this.f, this.f, pb.sub(pb.mul(this.f, 0.5), pb.vec2(0.5)));\r\n this.$l.w12 = pb.add(this.w1, this.w2);\r\n this.$l.offset12 = pb.div(this.w2, pb.add(this.w1, this.w2));\r\n this.$l.texPos0 = pb.sub(this.texPos1, pb.vec2(1));\r\n this.$l.texPos3 = pb.add(this.texPos1, pb.vec2(2));\r\n this.$l.texPos12 = pb.add(this.texPos1, this.offset12);\r\n this.texPos0 = pb.div(this.texPos0, this.texSize);\r\n this.texPos3 = pb.div(this.texPos3, this.texSize);\r\n this.texPos12 = pb.div(this.texPos12, this.texSize);\r\n this.$l.result = pb.vec3(0);\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos0, 0).rgb, this.w0.x, this.w0.y)\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos12.x, this.texPos0.y), 0).rgb,\r\n this.w12.x,\r\n this.w0.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos3.x, this.texPos0.y), 0).rgb,\r\n this.w3.x,\r\n this.w0.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos0.x, this.texPos12.y), 0).rgb,\r\n this.w0.x,\r\n this.w12.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos12, 0).rgb, this.w12.x, this.w12.y)\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos3.x, this.texPos12.y), 0).rgb,\r\n this.w3.x,\r\n this.w12.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos0.x, this.texPos3.y), 0).rgb,\r\n this.w0.x,\r\n this.w3.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(\r\n pb.textureSampleLevel(historyColorTex, pb.vec2(this.texPos12.x, this.texPos3.y), 0).rgb,\r\n this.w12.x,\r\n this.w3.y\r\n )\r\n );\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(pb.textureSampleLevel(historyColorTex, this.texPos3, 0).rgb, this.w3.x, this.w3.y)\r\n );\r\n this.$return(pb.max(this.result, pb.vec3(0)));\r\n });\r\n pb.func('temporalResolve', [pb.vec2('screenUV'), pb.vec2('texSize')], function () {\r\n this.$l.velocitySample = pb.textureSampleLevel(motionVectorTex, this.screenUV, 0);\r\n this.$l.velocity = this.velocitySample.xy;\r\n this.$l.sampleColor = pb.textureSampleLevel(currentColorTex, this.screenUV, 0).rgb;\r\n this.$if(\r\n pb.and(pb.greaterThanEqual(this.velocity.x, 5e4), pb.greaterThanEqual(this.velocity.y, 5e4)),\r\n function () {\r\n this.$return(this.sampleColor);\r\n }\r\n );\r\n // Reproject with the depth-dilated (closest) velocity so silhouette pixels\r\n // follow the foreground geometry; using the center velocity causes edge\r\n // crawling/shimmer at object boundaries.\r\n this.$l.velocityClosest = this.getClosestVelocity(this.screenUV, this.texSize);\r\n this.$l.reprojectedUV = pb.sub(this.screenUV, this.velocityClosest.xy);\r\n //this.$l.historyColor = pb.textureSampleLevel(historyColorTex, this.reprojectedUV, 0).rgb;\r\n this.$l.historyColor = this.sampleHistoryColorCatmulRom9(this.reprojectedUV, this.texSize);\r\n this.$l.blendFactor = pb.div(this.velocityClosest.z, 50000);\r\n // Tonemap, then clip -- not the other way round. The neighbourhood box is\r\n // built in Reinhard space, so the history has to be in it as well; the\r\n // resolve stays there until the final reinhardInv below.\r\n this.prevColor = this.clipHistoryColor(\r\n this.screenUV,\r\n this.reinhard(this.historyColor),\r\n this.velocityClosest.xy,\r\n this.texSize\r\n );\r\n this.$l.screenFactor = this.$choice(\r\n pb.or(\r\n pb.any(pb.lessThan(this.reprojectedUV, pb.vec2(0))),\r\n pb.any(pb.greaterThan(this.reprojectedUV, pb.vec2(1)))\r\n ),\r\n pb.float(1),\r\n pb.float(0)\r\n );\r\n this.$l.disocclusionFactor = this.getDisocclusionFactor(\r\n this.reprojectedUV,\r\n this.velocityClosest.xy,\r\n this.texSize\r\n );\r\n this.$l.alpha = pb.clamp(pb.add(this.blendFactor, this.screenFactor, this.disocclusionFactor), 0, 1);\r\n //this.alpha = 0.1;\r\n // prevColor is already tonemapped (and clipped in that space) above.\r\n this.currentColor = this.reinhard(this.sampleColor);\r\n this.$l.currentLum = this.luminance(this.currentColor);\r\n this.$l.prevLum = this.luminance(this.prevColor);\r\n // Luminance is in Reinhard space (always < 1), so a 1.001 floor makes the\r\n // denominator constant and the ratio degenerates to an absolute difference,\r\n // leaving dark-area flicker almost undamped. Use a smaller floor so the\r\n // difference stays relative.\r\n this.$l.diff = pb.div(\r\n pb.abs(pb.sub(this.currentLum, this.prevLum)),\r\n pb.max(this.currentLum, pb.max(this.prevLum, 0.2))\r\n );\r\n this.diff = pb.sub(1, this.diff);\r\n this.diff = pb.mul(this.diff, this.diff);\r\n this.alpha = pb.clamp(pb.mix(0, this.alpha, this.diff), 0.05, 1);\r\n this.$l.resolvedColor = pb.vec3();\r\n if (debug === TAA_DEBUG_CURRENT_COLOR) {\r\n this.resolvedColor = this.currentColor.rgb;\r\n this.resolvedColor = this.reinhardInv(this.resolvedColor);\r\n } else if (debug === TAA_DEBUG_HISTORY_COLOR) {\r\n this.resolvedColor = this.prevColor.rgb;\r\n this.resolvedColor = this.reinhardInv(this.resolvedColor);\r\n } else if (debug === TAA_DEBUG_EDGE) {\r\n this.resolvedColor = pb.vec3(this.screenFactor);\r\n } else if (debug === TAA_DEBUG_ALAPH) {\r\n this.resolvedColor = pb.vec3(this.alpha);\r\n } else if (debug === TAA_DEBUG_VELOCITY) {\r\n this.resolvedColor = pb.abs(pb.sub(this.sampleColor, this.historyColor));\r\n } else if (debug === TAA_DEBUG_MOTION_VECTOR) {\r\n this.resolvedColor = pb.abs(pb.mul(this.velocityClosest, 20));\r\n } else if (debug === TAA_DEBUG_STRENGTH) {\r\n this.resolvedColor = pb.vec3(this.blendFactor);\r\n } else {\r\n this.resolvedColor = pb.mix(this.prevColor.rgb, this.currentColor.rgb, this.alpha);\r\n this.resolvedColor = this.reinhardInv(this.resolvedColor);\r\n }\r\n this.$return(this.resolvedColor);\r\n });\r\n return scope.temporalResolve(uv, workSize) as PBShaderExp;\r\n}\r\n"],"names":["TAA_DEBUG_NONE","TAA_DEBUG_CURRENT_COLOR","TAA_DEBUG_HISTORY_COLOR","TAA_DEBUG_VELOCITY","TAA_DEBUG_EDGE","TAA_DEBUG_ALAPH","TAA_DEBUG_MOTION_VECTOR","TAA_DEBUG_STRENGTH","FLT_MIN","FLT_MAX","TONEMAPPED_MAX","temporalResolve","scope","currentColorTex","historyColorTex","currentDepthTex","motionVectorTex","prevMotionVectorTex","uv","workSize","debug","pb","$builder","func","vec3","$l","c","max","hdr","$return","div","add","sdr","sub","dot","color","vec2","minDepth","float","closestUV","tmpDepth","tmpUV","i","j","texSize","textureSampleLevel","r","$if","lessThan","motionVector","xyz","q","p","rMax","aabbMax","rMin","aabbMin","greaterThan","x","mul","y","z","n","colorAvg","colorAvg2","reinhard","rgb","boxSize","mix","smoothStep","length","closestVelocity","dev","sqrt","abs","colorMin","colorMax","clipAABB","clamp","historyColor","prevVelocitySample","prevVelocity","xy","disocclusion","velocity","samplePos","texPos1","floor","f","w0","w1","w2","w3","w12","offset12","texPos0","texPos3","texPos12","result","velocitySample","screenUV","sampleColor","and","greaterThanEqual","velocityClosest","getClosestVelocity","reprojectedUV","sampleHistoryColorCatmulRom9","blendFactor","prevColor","clipHistoryColor","screenFactor","$choice","or","any","disocclusionFactor","getDisocclusionFactor","alpha","currentColor","currentLum","luminance","prevLum","diff","resolvedColor","reinhardInv"],"mappings":"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"}
|
package/dist/shaders/water.js
CHANGED
|
@@ -104,7 +104,6 @@ function getFragCoord(scope, useComputeShader) {
|
|
|
104
104
|
/** @internal */ function createProgramPostFFT2(useComputeShader = false, threadGroupSize, targetFormat = 'rgba32f', limit) {
|
|
105
105
|
function getComputeFunc(useComputeShader, fmt) {
|
|
106
106
|
return function(pb) {
|
|
107
|
-
this.N2 = pb.float().uniform(0);
|
|
108
107
|
if (useComputeShader) {
|
|
109
108
|
this.output = fmt === 'rgba32f' ? pb.texStorage2DArray.rgba32float().storage(0) : pb.texStorage2DArray.rgba16float().storage(0);
|
|
110
109
|
this.ifft = pb.tex2DArray().uniform(0);
|
|
@@ -132,8 +131,10 @@ function getFragCoord(scope, useComputeShader) {
|
|
|
132
131
|
pb.main(function() {
|
|
133
132
|
this.$l.fragPos = getFragCoord(this, useComputeShader);
|
|
134
133
|
this.$l.p = pb.float(pb.add(this.fragPos.x, this.fragPos.y));
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
// (-1)^(x+y) undoes the spectrum being centred at resolution/2. The
|
|
135
|
+
// transform is left unnormalized (see the butterfly passes), so this
|
|
136
|
+
// is the only factor applied here.
|
|
137
|
+
this.$l.m = pb.sub(pb.mul(pb.sub(1, pb.mod(this.p, 2)), 2), 1);
|
|
137
138
|
if (pb.getDevice().type === 'webgl') {
|
|
138
139
|
this.$l.uv = pb.div(pb.vec2(this.fragPos), this.ifftTexSize);
|
|
139
140
|
if (!limit || limit === 4) {
|
|
@@ -541,12 +542,6 @@ function getFragCoord(scope, useComputeShader) {
|
|
|
541
542
|
], function() {
|
|
542
543
|
this.$return(Complex(pb.sub(pb.mul(this.a.re, this.b.re), pb.mul(this.a.im, this.b.im)), pb.add(pb.mul(this.a.re, this.b.im), pb.mul(this.a.im, this.b.re))));
|
|
543
544
|
});
|
|
544
|
-
pb.func('scale', [
|
|
545
|
-
Complex('a'),
|
|
546
|
-
pb.float('v')
|
|
547
|
-
], function() {
|
|
548
|
-
this.$return(Complex(pb.mul(this.a.re, this.v), pb.mul(this.a.im, this.v)));
|
|
549
|
-
});
|
|
550
545
|
for(let x = 0; x <= 5; x++){
|
|
551
546
|
if (x < 4 && limit === 2) {
|
|
552
547
|
continue;
|
|
@@ -571,10 +566,17 @@ function getFragCoord(scope, useComputeShader) {
|
|
|
571
566
|
this.$l.w = Complex(this.texelButt.r, this.texelButt.g);
|
|
572
567
|
this.$l.a1 = Complex(this.texelA.x, this.texelA.y);
|
|
573
568
|
this.$l.b1 = Complex(this.texelB.x, this.texelB.y);
|
|
574
|
-
|
|
569
|
+
// Unnormalized butterfly. Scaling each stage by 0.5 and multiplying
|
|
570
|
+
// N^2 back after the transform is a net no-op in exact arithmetic,
|
|
571
|
+
// but the intermediate textures are fp16: at N=256 the last stage
|
|
572
|
+
// held values 1/65536 of the final ones, which put every slope
|
|
573
|
+
// component into the subnormal range and left it 4-6 bits of
|
|
574
|
+
// precision (or flushed it to zero). Without the per-stage scale the
|
|
575
|
+
// intermediates stay at metre scale, where fp16 is fine.
|
|
576
|
+
this.$l.r1 = this.add(this.a1, this.mul(this.b1, this.w));
|
|
575
577
|
this.$l.a2 = Complex(this.texelA.z, this.texelA.w);
|
|
576
578
|
this.$l.b2 = Complex(this.texelB.z, this.texelB.w);
|
|
577
|
-
this.$l.r2 = this.
|
|
579
|
+
this.$l.r2 = this.add(this.a2, this.mul(this.b2, this.w));
|
|
578
580
|
this.$return(pb.vec4(this.r1.re, this.r1.im, this.r2.re, this.r2.im));
|
|
579
581
|
});
|
|
580
582
|
}
|
|
@@ -677,12 +679,6 @@ function getFragCoord(scope, useComputeShader) {
|
|
|
677
679
|
], function() {
|
|
678
680
|
this.$return(Complex(pb.sub(pb.mul(this.a.re, this.b.re), pb.mul(this.a.im, this.b.im)), pb.add(pb.mul(this.a.re, this.b.im), pb.mul(this.a.im, this.b.re))));
|
|
679
681
|
});
|
|
680
|
-
pb.func('scale', [
|
|
681
|
-
Complex('a'),
|
|
682
|
-
pb.float('v')
|
|
683
|
-
], function() {
|
|
684
|
-
this.$return(Complex(pb.mul(this.a.re, this.v), pb.mul(this.a.im, this.v)));
|
|
685
|
-
});
|
|
686
682
|
for(let x = 0; x <= 5; x++){
|
|
687
683
|
if (x < 4 && limit === 2) {
|
|
688
684
|
continue;
|
|
@@ -707,10 +703,17 @@ function getFragCoord(scope, useComputeShader) {
|
|
|
707
703
|
this.$l.w = Complex(this.texelButt.r, this.texelButt.g);
|
|
708
704
|
this.$l.a1 = Complex(this.texelA.x, this.texelA.y);
|
|
709
705
|
this.$l.b1 = Complex(this.texelB.x, this.texelB.y);
|
|
710
|
-
|
|
706
|
+
// Unnormalized butterfly. Scaling each stage by 0.5 and multiplying
|
|
707
|
+
// N^2 back after the transform is a net no-op in exact arithmetic,
|
|
708
|
+
// but the intermediate textures are fp16: at N=256 the last stage
|
|
709
|
+
// held values 1/65536 of the final ones, which put every slope
|
|
710
|
+
// component into the subnormal range and left it 4-6 bits of
|
|
711
|
+
// precision (or flushed it to zero). Without the per-stage scale the
|
|
712
|
+
// intermediates stay at metre scale, where fp16 is fine.
|
|
713
|
+
this.$l.r1 = this.add(this.a1, this.mul(this.b1, this.w));
|
|
711
714
|
this.$l.a2 = Complex(this.texelA.z, this.texelA.w);
|
|
712
715
|
this.$l.b2 = Complex(this.texelB.z, this.texelB.w);
|
|
713
|
-
this.$l.r2 = this.
|
|
716
|
+
this.$l.r2 = this.add(this.a2, this.mul(this.b2, this.w));
|
|
714
717
|
this.$return(pb.vec4(this.r1.re, this.r1.im, this.r2.re, this.r2.im));
|
|
715
718
|
});
|
|
716
719
|
}
|