@meimu/mutracer 0.1.3 → 0.1.5
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/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +4155 -4052
- package/docs/api.md +13 -10
- package/docs/materials.md +17 -26
- package/docs/threejs.md +35 -9
- package/docs/viewer.md +36 -3
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +17 -9
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +8 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +323 -315
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +42 -41
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +476 -470
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -60
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const linearToSrgbDefine = /* wgsl */ `
|
|
2
|
-
fn
|
|
2
|
+
fn fN(color: vec3f) -> vec3f {
|
|
3
3
|
let linear = max(color, vec3f(0.0));
|
|
4
4
|
let low = linear * 12.92;
|
|
5
5
|
let high = 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055;
|
|
@@ -8,90 +8,90 @@ return select(high, low, linear <= vec3f(0.0031308));
|
|
|
8
8
|
`;
|
|
9
9
|
export const composeDefine = /* wgsl */ `
|
|
10
10
|
|
|
11
|
-
fn
|
|
11
|
+
fn jU(color: vec3f) -> vec3f {
|
|
12
12
|
return clamp(color, vec3f(0.0), vec3f(1.0));
|
|
13
13
|
}
|
|
14
|
-
fn
|
|
14
|
+
fn iP(color: vec3f) -> vec3f {
|
|
15
15
|
return clamp(color / (vec3f(1.0) + color), vec3f(0.0), vec3f(1.0));
|
|
16
16
|
}
|
|
17
|
-
fn
|
|
18
|
-
let color = max(vec3f(0.0),
|
|
17
|
+
fn jJ(jr: vec3f) -> vec3f {
|
|
18
|
+
let color = max(vec3f(0.0), jr - 0.004);
|
|
19
19
|
return pow((color * (6.2 * color + 0.5)) /
|
|
20
20
|
(color * (6.2 * color + 1.7) + 0.06), vec3f(2.2));
|
|
21
21
|
}
|
|
22
|
-
fn
|
|
23
|
-
let
|
|
22
|
+
fn oI(value: vec3f) -> vec3f {
|
|
23
|
+
let kO = value * (value + 0.0245786) - 0.000090537;
|
|
24
24
|
let ap = value * (0.983729 * value + 0.4329510) + 0.238081;
|
|
25
|
-
return
|
|
25
|
+
return kO / ap;
|
|
26
26
|
}
|
|
27
|
-
fn
|
|
28
|
-
let
|
|
27
|
+
fn lv(jr: vec3f) -> vec3f {
|
|
28
|
+
let pw = mat3x3f(
|
|
29
29
|
vec3f(0.59719, 0.07600, 0.02840),
|
|
30
30
|
vec3f(0.35458, 0.90834, 0.13383),
|
|
31
31
|
vec3f(0.04823, 0.01566, 0.83777)
|
|
32
32
|
);
|
|
33
|
-
let
|
|
33
|
+
let oD = mat3x3f(
|
|
34
34
|
vec3f(1.60475, -0.10208, -0.00327),
|
|
35
35
|
vec3f(-0.53108, 1.10813, -0.07276),
|
|
36
36
|
vec3f(-0.07367, -0.00605, 1.07602)
|
|
37
37
|
);
|
|
38
|
-
let color =
|
|
39
|
-
return clamp(
|
|
40
|
-
}
|
|
41
|
-
fn
|
|
42
|
-
let
|
|
43
|
-
let
|
|
44
|
-
return 15.5 *
|
|
45
|
-
+ 31.96 *
|
|
46
|
-
+ 0.4298 *
|
|
47
|
-
}
|
|
48
|
-
fn
|
|
49
|
-
let
|
|
38
|
+
let color = pw * (jr / 0.6);
|
|
39
|
+
return clamp(oD * oI(color), vec3f(0.0), vec3f(1.0));
|
|
40
|
+
}
|
|
41
|
+
fn fU(value: vec3f) -> vec3f {
|
|
42
|
+
let mN = value * value;
|
|
43
|
+
let qK = mN * mN;
|
|
44
|
+
return 15.5 * qK * mN - 40.14 * qK * value
|
|
45
|
+
+ 31.96 * qK - 6.868 * mN * value
|
|
46
|
+
+ 0.4298 * mN + 0.1191 * value - 0.00232;
|
|
47
|
+
}
|
|
48
|
+
fn mc(jr: vec3f) -> vec3f {
|
|
49
|
+
let mQ = mat3x3f(
|
|
50
50
|
vec3f(1.6605, -0.1246, -0.0182),
|
|
51
51
|
vec3f(-0.5876, 1.1329, -0.1006),
|
|
52
52
|
vec3f(-0.0728, -0.0083, 1.1187)
|
|
53
53
|
);
|
|
54
|
-
let
|
|
54
|
+
let mR = mat3x3f(
|
|
55
55
|
vec3f(0.6274, 0.0691, 0.0164),
|
|
56
56
|
vec3f(0.3293, 0.9195, 0.0880),
|
|
57
57
|
vec3f(0.0433, 0.0113, 0.8956)
|
|
58
58
|
);
|
|
59
|
-
let
|
|
59
|
+
let pH = mat3x3f(
|
|
60
60
|
vec3f(0.856627153315983, 0.137318972929847, 0.11189821299995),
|
|
61
61
|
vec3f(0.0951212405381588, 0.761241990602591, 0.0767994186031903),
|
|
62
62
|
vec3f(0.0482516061458583, 0.101439036467562, 0.811302368396859)
|
|
63
63
|
);
|
|
64
|
-
let
|
|
64
|
+
let oE = mat3x3f(
|
|
65
65
|
vec3f(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),
|
|
66
66
|
vec3f(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),
|
|
67
67
|
vec3f(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)
|
|
68
68
|
);
|
|
69
|
-
var color =
|
|
69
|
+
var color = pH * (mR * jr);
|
|
70
70
|
color = clamp((log2(max(color, vec3f(1e-10))) + 12.47393) / 16.5, vec3f(0.0), vec3f(1.0));
|
|
71
|
-
color =
|
|
71
|
+
color = oE * fU(color);
|
|
72
72
|
color = pow(max(color, vec3f(0.0)), vec3f(2.2));
|
|
73
|
-
return clamp(
|
|
73
|
+
return clamp(mQ * color, vec3f(0.0), vec3f(1.0));
|
|
74
74
|
}
|
|
75
75
|
fn cl(color: vec3f) -> vec3f {
|
|
76
76
|
let toneMappingMode = i32(toneMappingParams.x);
|
|
77
|
-
if (toneMappingMode == 1) { return
|
|
78
|
-
if (toneMappingMode == 2) { return
|
|
79
|
-
if (toneMappingMode == 3) { return
|
|
80
|
-
if (toneMappingMode == 4) { return
|
|
81
|
-
return
|
|
77
|
+
if (toneMappingMode == 1) { return lv(color); }
|
|
78
|
+
if (toneMappingMode == 2) { return jJ(color); }
|
|
79
|
+
if (toneMappingMode == 3) { return iP(color); }
|
|
80
|
+
if (toneMappingMode == 4) { return jU(color); }
|
|
81
|
+
return mc(color);
|
|
82
82
|
}
|
|
83
83
|
${linearToSrgbDefine}
|
|
84
|
-
fn
|
|
84
|
+
fn gc(jr: vec3f) -> vec3f {
|
|
85
85
|
let contrast = colorGradingParams.x;
|
|
86
86
|
let saturation = colorGradingParams.y;
|
|
87
87
|
let temperature = colorGradingParams.z;
|
|
88
88
|
let tint = colorGradingParams.w;
|
|
89
|
-
let
|
|
89
|
+
let tj = vec3f(
|
|
90
90
|
1.0 + temperature * 0.16 + tint * 0.04,
|
|
91
91
|
1.0 - tint * 0.12,
|
|
92
92
|
1.0 - temperature * 0.16 + tint * 0.04
|
|
93
93
|
);
|
|
94
|
-
var color = max(
|
|
94
|
+
var color = max(jr * tj, vec3f(0.0));
|
|
95
95
|
color = max((color - 0.18) * contrast + 0.18, vec3f(0.0));
|
|
96
96
|
let luminance = dot(color, vec3f(0.2126, 0.7152, 0.0722));
|
|
97
97
|
return max(mix(vec3f(luminance), color, saturation), vec3f(0.0));
|
|
@@ -100,54 +100,54 @@ return max(mix(vec3f(luminance), color, saturation), vec3f(0.0));
|
|
|
100
100
|
export const composeMain = /* wgsl */ `
|
|
101
101
|
|
|
102
102
|
var dY = load_colorTex(uv, 0);
|
|
103
|
-
var
|
|
103
|
+
var jl = vec4(0.0);
|
|
104
104
|
if (bloomIntensity > 0.0) {
|
|
105
|
-
|
|
106
|
-
dY = vec4f(dY.rgb +
|
|
105
|
+
jl = load_bloomTex(uv, 0) * bloomIntensity;
|
|
106
|
+
dY = vec4f(dY.rgb + jl.rgb, dY.a);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
var
|
|
110
|
-
let
|
|
111
|
-
|
|
112
|
-
let
|
|
113
|
-
if (!
|
|
114
|
-
|
|
109
|
+
var ll = gc(dY.rgb * exposure);
|
|
110
|
+
let iI = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));
|
|
111
|
+
ll *= 1.0 - toneMappingParams.y * iI;
|
|
112
|
+
let gC = hdrOutputEnabled > 0.5;
|
|
113
|
+
if (!gC) {
|
|
114
|
+
ll = cl(ll);
|
|
115
115
|
}
|
|
116
|
-
let
|
|
117
|
-
pow(max(
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
let ml = select(
|
|
117
|
+
pow(max(ll, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
118
|
+
fN(ll),
|
|
119
|
+
gC
|
|
120
120
|
);
|
|
121
|
-
var
|
|
121
|
+
var ob = ml;
|
|
122
122
|
if (flatBackgroundColor.a > 0.5) {
|
|
123
|
-
let
|
|
123
|
+
let jg = clamp(
|
|
124
124
|
load_flatBackgroundMaskTex(uv, 0).a,
|
|
125
125
|
0.0,
|
|
126
126
|
1.0
|
|
127
127
|
);
|
|
128
|
-
let
|
|
129
|
-
|
|
128
|
+
let pb = fN(max(flatBackgroundColor.rgb, vec3f(0.0)));
|
|
129
|
+
ob = mix(pb, ml, jg);
|
|
130
130
|
if (bloomIntensity > 0.0) {
|
|
131
|
-
var
|
|
132
|
-
max(dY.rgb -
|
|
131
|
+
var ir = gc(
|
|
132
|
+
max(dY.rgb - jl.rgb, vec3f(0.0))
|
|
133
133
|
* exposure
|
|
134
134
|
);
|
|
135
|
-
|
|
136
|
-
if (!
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
let
|
|
140
|
-
pow(max(
|
|
141
|
-
|
|
142
|
-
|
|
135
|
+
ir *= 1.0 - toneMappingParams.y * iI;
|
|
136
|
+
if (!gC) {
|
|
137
|
+
ir = cl(ir);
|
|
138
|
+
}
|
|
139
|
+
let rF = select(
|
|
140
|
+
pow(max(ir, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
141
|
+
fN(ir),
|
|
142
|
+
gC
|
|
143
143
|
);
|
|
144
|
-
|
|
145
|
-
* (1.0 -
|
|
144
|
+
ob += max(ml - rF, vec3f(0.0))
|
|
145
|
+
* (1.0 - jg);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
dY = vec4f(
|
|
148
|
+
dY = vec4f(ob, dY.a);
|
|
149
149
|
if (bloomIntensity > 0.0) {
|
|
150
|
-
dY.a = max(dY.a, min(dot(
|
|
150
|
+
dY.a = max(dY.a, min(dot(jl.rgb, vec3f(0.2125, 0.7154, 0.0721)), 1.0));
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
if (shadowCatcherEnabled > 0.5) {
|
|
@@ -161,36 +161,36 @@ let background = load_catcherBackgroundTex(uv, 0);
|
|
|
161
161
|
|
|
162
162
|
|
|
163
163
|
|
|
164
|
-
let
|
|
165
|
-
var bK =
|
|
166
|
-
var backgroundColor =
|
|
167
|
-
bK *= 1.0 - toneMappingParams.y *
|
|
168
|
-
backgroundColor *= 1.0 - toneMappingParams.y *
|
|
169
|
-
if (!
|
|
164
|
+
let kH = select(0.0, clamp(background.a - coverage, 0.0, 1.0 - coverage), flatBackgroundColor.a > 0.5);
|
|
165
|
+
var bK = gc((foreground.rgb + jl.rgb) * exposure);
|
|
166
|
+
var backgroundColor = gc((background.rgb / max(background.a, 0.000001) + jl.rgb) * exposure);
|
|
167
|
+
bK *= 1.0 - toneMappingParams.y * iI;
|
|
168
|
+
backgroundColor *= 1.0 - toneMappingParams.y * iI;
|
|
169
|
+
if (!gC) {
|
|
170
170
|
bK = cl(bK);
|
|
171
171
|
backgroundColor = cl(backgroundColor);
|
|
172
172
|
}
|
|
173
|
-
bK = select(pow(max(bK, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
174
|
-
backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
173
|
+
bK = select(pow(max(bK, vec3f(0.0)), vec3f(1.0 / 2.2)), fN(bK), gC);
|
|
174
|
+
backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), fN(backgroundColor), gC);
|
|
175
175
|
if (flatBackgroundColor.a > 0.5) {
|
|
176
|
-
var
|
|
177
|
-
|
|
178
|
-
if (!
|
|
179
|
-
let
|
|
180
|
-
let
|
|
181
|
-
backgroundColor =
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
let
|
|
186
|
-
let
|
|
187
|
-
let
|
|
188
|
-
let
|
|
189
|
-
let
|
|
190
|
-
let alpha =
|
|
191
|
-
let premultiplied = bK *
|
|
192
|
-
+ backgroundColor *
|
|
193
|
-
+ shadowCatcherColor *
|
|
176
|
+
var eP = gc(background.rgb / max(background.a, 0.000001) * exposure);
|
|
177
|
+
eP *= 1.0 - toneMappingParams.y * iI;
|
|
178
|
+
if (!gC) { eP = cl(eP); }
|
|
179
|
+
let mn = select(pow(max(eP, vec3f(0.0)), vec3f(1.0 / 2.2)), fN(eP), gC);
|
|
180
|
+
let uk = select(vec3f(0.0), max(backgroundColor - mn, vec3f(0.0)), bloomIntensity > 0.0);
|
|
181
|
+
backgroundColor = fN(max(flatBackgroundColor.rgb, vec3f(0.0))) + uk;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
let fS = coverage * opacity;
|
|
186
|
+
let mf = clamp(dot(jl.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
|
|
187
|
+
let hv = max(foreground.a, mf * (1.0 - coverage - kH));
|
|
188
|
+
let jd = max(background.a, mf * coverage);
|
|
189
|
+
let ku = (jd - kH) * (1.0 - opacity) + kH;
|
|
190
|
+
let alpha = hv + ku + fS;
|
|
191
|
+
let premultiplied = bK * hv
|
|
192
|
+
+ backgroundColor * ku
|
|
193
|
+
+ shadowCatcherColor * fS;
|
|
194
194
|
dY = vec4f(premultiplied / max(alpha, 0.000001), alpha);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
@@ -203,35 +203,35 @@ output.color = dY;
|
|
|
203
203
|
// linear-light image. Alpha is deliberately not used as a second color layer.
|
|
204
204
|
export const compositeDenoiseOutputMain = /* wgsl */ `
|
|
205
205
|
let encoded = max(dY.rgb, vec3f(0.0));
|
|
206
|
-
let
|
|
206
|
+
let sW = select(
|
|
207
207
|
pow(encoded, vec3f(2.2)),
|
|
208
208
|
select(pow((encoded + 0.055) / 1.055, vec3f(2.4)), encoded / 12.92,
|
|
209
209
|
encoded <= vec3f(0.04045)),
|
|
210
|
-
|
|
210
|
+
gC
|
|
211
211
|
);
|
|
212
|
-
output.denoiseColor = vec4f(
|
|
212
|
+
output.denoiseColor = vec4f(sW, dY.a);
|
|
213
213
|
|
|
214
214
|
|
|
215
215
|
|
|
216
216
|
|
|
217
217
|
|
|
218
218
|
let rawAlbedo = load_flatBackgroundMaskTex(uv, 0);
|
|
219
|
-
var
|
|
219
|
+
var oW = rawAlbedo.rgb;
|
|
220
220
|
if (shadowCatcherEnabled > 0.5 && flatBackgroundColor.a < 0.5) {
|
|
221
221
|
let coverage = clamp(load_shadowCatcherTex(uv, 0).r, 0.0, 1.0);
|
|
222
222
|
let background = load_catcherBackgroundTex(uv, 0);
|
|
223
223
|
if (coverage > 0.0 && background.a > 0.0) {
|
|
224
|
-
var
|
|
225
|
-
|
|
226
|
-
if (!
|
|
224
|
+
var iv = gc(background.rgb / background.a * exposure);
|
|
225
|
+
iv *= 1.0 - toneMappingParams.y * iI;
|
|
226
|
+
if (!gC) { iv = cl(iv); }
|
|
227
227
|
|
|
228
228
|
|
|
229
229
|
|
|
230
|
-
let
|
|
231
|
-
|
|
230
|
+
let rs = clamp(background.a, 0.0, coverage);
|
|
231
|
+
oW += rs * (clamp(iv, vec3f(0.0), vec3f(1.0)) - vec3f(1.0));
|
|
232
232
|
}
|
|
233
233
|
}
|
|
234
|
-
output.denoiseAlbedo = vec4f(clamp(
|
|
234
|
+
output.denoiseAlbedo = vec4f(clamp(oW, vec3f(0.0), vec3f(1.0)), rawAlbedo.a);
|
|
235
235
|
`;
|
|
236
236
|
export const compositeDenoiseDisplayMain = /* wgsl */ `
|
|
237
237
|
let denoised = load_colorTex(uv, 0);
|
|
@@ -240,7 +240,7 @@ let denoised = load_colorTex(uv, 0);
|
|
|
240
240
|
|
|
241
241
|
let alpha = select(load_composedTex(uv, 0).a, clamp(denoised.a, 0.0, 1.0), denoisedAlpha > 0.5);
|
|
242
242
|
let linear = max(denoised.rgb, vec3f(0.0));
|
|
243
|
-
let encoded = select(pow(linear, vec3f(1.0 / 2.2)),
|
|
243
|
+
let encoded = select(pow(linear, vec3f(1.0 / 2.2)), fN(linear), hdrOutputEnabled > 0.5);
|
|
244
244
|
output.color = vec4f(select(vec3f(0.0), encoded, alpha > 0.0), alpha);
|
|
245
245
|
`;
|
|
246
246
|
//# sourceMappingURL=compose.frag.wgsl.js.map
|
|
@@ -5,19 +5,19 @@ let filtered = load_filteredTex(uv, 0).rgb;
|
|
|
5
5
|
let foreground = load_foregroundTex(uv, 0);
|
|
6
6
|
let background = load_backgroundTex(uv, 0);
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
var
|
|
8
|
+
var mr = foreground;
|
|
9
|
+
var mq = background;
|
|
10
10
|
if (any(filtered != original)) {
|
|
11
|
-
let
|
|
12
|
-
let ap = select(vec3f(1.0), original,
|
|
13
|
-
let scale = select(vec3f(1.0), filtered / ap,
|
|
14
|
-
let
|
|
15
|
-
|
|
11
|
+
let uz = abs(original) > vec3f(0.000001);
|
|
12
|
+
let ap = select(vec3f(1.0), original, uz);
|
|
13
|
+
let scale = select(vec3f(1.0), filtered / ap, uz);
|
|
14
|
+
let ub = select(filtered - original, vec3f(0.0), uz);
|
|
15
|
+
mr = vec4f(foreground.rgb * scale + ub, foreground.a);
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
mq = vec4f(background.rgb * scale + ub * background.a, background.a);
|
|
18
18
|
}
|
|
19
|
-
output.foreground =
|
|
20
|
-
output.background =
|
|
19
|
+
output.foreground = mr;
|
|
20
|
+
output.background = mq;
|
|
21
21
|
`;
|
|
22
22
|
/** Custom output alpha is ignored; retain the input composition's coverage. */
|
|
23
23
|
export const customDenoiseCoverageMain = /* wgsl */ `
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** Extra entry point in the ray-tracing module; reuses its scene bindings. */
|
|
2
|
-
declare const _default: "\n@group(3) @binding(4) var<uniform> depthArea: vec4f;\n\n@compute @workgroup_size(7, 7)\nfn depthQuery(@builtin(global_invocation_id) id: vec3u) {\n let index = id.x + id.y * 7u;\n let offset = vec2f(id.xy) / 6.0 * 2.0 - 1.0;\n let uv = depthArea.xy + depthArea.zw * offset * vec2f(1.0, -1.0);\n outColor[index] = vec4f(0.0);\n if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }\n var ray = initCameraRay(uv);\n let eye = cameraUniform.viewInv[3].xyz;\n let forward = -normalize(cameraUniform.viewInv[2].xyz);\n var si: SurfaceInteraction;\n si.triangleIndex = -1;\n // Ignore invisible catchers and alpha-cutout holes, without stochastic DOF\n // or pixel jitter. A bounded continuation prevents coincident surfaces\n // from keeping the query alive indefinitely.\n for (var layer = 0; layer < 32; layer++) {\n intersectScene(ray, &si, 0, false, false);\n if (!si.hit) { return; }\n var material: OpenPbrResolvedMaterial;\n getMaterial(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex);\n if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {\n outColor[index] = vec4f(max(dot(si.position - eye, forward), 0.0), 0.0, 0.0, 0.0);\n return;\n }\n ray.o = si.position + ray.d * (EPS * 0.02);\n }\n}\n";
|
|
2
|
+
declare const _default: "\n@group(3) @binding(4) var<uniform> depthArea: vec4f;\n\n@compute @workgroup_size(7, 7)\nfn depthQuery(@builtin(global_invocation_id) id: vec3u) {\n let index = id.x + id.y * 7u;\n let offset = vec2f(id.xy) / 6.0 * 2.0 - 1.0;\n let uv = depthArea.xy + depthArea.zw * offset * vec2f(1.0, -1.0);\n outColor[index] = vec4f(0.0);\n if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }\n var ray = initCameraRay(uv);\n let eye = cameraUniform.viewInv[3].xyz;\n let forward = -normalize(cameraUniform.viewInv[2].xyz);\n var si: SurfaceInteraction;\n si.triangleIndex = -1;\n // Ignore invisible catchers and alpha-cutout holes, without stochastic DOF\n // or pixel jitter. A bounded continuation prevents coincident surfaces\n // from keeping the query alive indefinitely.\n for (var layer = 0; layer < 32; layer++) {\n intersectScene(ray, &si, 0, false, false);\n if (!si.hit) { return; }\n var material: OpenPbrResolvedMaterial;\n getMaterial(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);\n if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {\n outColor[index] = vec4f(max(dot(si.position - eye, forward), 0.0), 0.0, 0.0, 0.0);\n return;\n }\n ray.o = si.position + ray.d * (EPS * 0.02);\n }\n}\n";
|
|
3
3
|
export default _default;
|
|
@@ -10,21 +10,21 @@ let offset = vec2f(id.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;
|
|
|
10
10
|
let uv = depthArea.xy + depthArea.zw * offset * vec2f(1.0, -1.0);
|
|
11
11
|
outColor[index] = vec4f(0.0);
|
|
12
12
|
if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }
|
|
13
|
-
var ray =
|
|
13
|
+
var ray = hC(uv);
|
|
14
14
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
15
|
-
let
|
|
15
|
+
let oj = -normalize(cameraUniform.viewInv[2].xyz);
|
|
16
16
|
var si: ad;
|
|
17
17
|
si.triangleIndex = -1;
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
for (var layer = 0; layer < 32; layer++) {
|
|
22
|
-
|
|
22
|
+
cZ(ray, &si, 0, false, false);
|
|
23
23
|
if (!si.hit) { return; }
|
|
24
24
|
var material: J;
|
|
25
|
-
|
|
25
|
+
eX(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
26
26
|
if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {
|
|
27
|
-
outColor[index] = vec4f(max(dot(si.position - eye,
|
|
27
|
+
outColor[index] = vec4f(max(dot(si.position - eye, oj), 0.0), 0.0, 0.0, 0.0);
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
ray.o = si.position + ray.d * (EPS * 0.02);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"depthQuery.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/depthQuery.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,8EAA8E;AAC9E,eAAe,UAAU,CAAC;;;2BAGC,iBAAiB,KAAK,iBAAiB;;4BAEpC,iBAAiB;8BACf,iBAAiB,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBpD,CAAC","sourcesContent":["import { DEPTH_SAMPLE_GRID } from '../depthQuery.js';\n\n/** Extra entry point in the ray-tracing module; reuses its scene bindings. */\nexport default /* wgsl */ `\n@group(3) @binding(4) var<uniform> depthArea: vec4f;\n\n@compute @workgroup_size(${DEPTH_SAMPLE_GRID}, ${DEPTH_SAMPLE_GRID})\nfn depthQuery(@builtin(global_invocation_id) id: vec3u) {\n let index = id.x + id.y * ${DEPTH_SAMPLE_GRID}u;\n let offset = vec2f(id.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;\n let uv = depthArea.xy + depthArea.zw * offset * vec2f(1.0, -1.0);\n outColor[index] = vec4f(0.0);\n if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }\n var ray = initCameraRay(uv);\n let eye = cameraUniform.viewInv[3].xyz;\n let forward = -normalize(cameraUniform.viewInv[2].xyz);\n var si: SurfaceInteraction;\n si.triangleIndex = -1;\n // Ignore invisible catchers and alpha-cutout holes, without stochastic DOF\n // or pixel jitter. A bounded continuation prevents coincident surfaces\n // from keeping the query alive indefinitely.\n for (var layer = 0; layer < 32; layer++) {\n intersectScene(ray, &si, 0, false, false);\n if (!si.hit) { return; }\n var material: OpenPbrResolvedMaterial;\n getMaterial(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex);\n if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {\n outColor[index] = vec4f(max(dot(si.position - eye, forward), 0.0), 0.0, 0.0, 0.0);\n return;\n }\n ray.o = si.position + ray.d * (EPS * 0.02);\n }\n}\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"depthQuery.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/depthQuery.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,8EAA8E;AAC9E,eAAe,UAAU,CAAC;;;2BAGC,iBAAiB,KAAK,iBAAiB;;4BAEpC,iBAAiB;8BACf,iBAAiB,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBpD,CAAC","sourcesContent":["import { DEPTH_SAMPLE_GRID } from '../depthQuery.js';\n\n/** Extra entry point in the ray-tracing module; reuses its scene bindings. */\nexport default /* wgsl */ `\n@group(3) @binding(4) var<uniform> depthArea: vec4f;\n\n@compute @workgroup_size(${DEPTH_SAMPLE_GRID}, ${DEPTH_SAMPLE_GRID})\nfn depthQuery(@builtin(global_invocation_id) id: vec3u) {\n let index = id.x + id.y * ${DEPTH_SAMPLE_GRID}u;\n let offset = vec2f(id.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;\n let uv = depthArea.xy + depthArea.zw * offset * vec2f(1.0, -1.0);\n outColor[index] = vec4f(0.0);\n if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }\n var ray = initCameraRay(uv);\n let eye = cameraUniform.viewInv[3].xyz;\n let forward = -normalize(cameraUniform.viewInv[2].xyz);\n var si: SurfaceInteraction;\n si.triangleIndex = -1;\n // Ignore invisible catchers and alpha-cutout holes, without stochastic DOF\n // or pixel jitter. A bounded continuation prevents coincident surfaces\n // from keeping the query alive indefinitely.\n for (var layer = 0; layer < 32; layer++) {\n intersectScene(ray, &si, 0, false, false);\n if (!si.hit) { return; }\n var material: OpenPbrResolvedMaterial;\n getMaterial(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);\n if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {\n outColor[index] = vec4f(max(dot(si.position - eye, forward), 0.0), 0.0, 0.0, 0.0);\n return;\n }\n ray.o = si.position + ray.d * (EPS * 0.02);\n }\n}\n`;\n"]}
|
|
@@ -27,8 +27,8 @@ _padding: f32,
|
|
|
27
27
|
const LUMINANCE = vec3f(0.2126, 0.7152, 0.0722);
|
|
28
28
|
|
|
29
29
|
@compute @workgroup_size(64)
|
|
30
|
-
fn main(@builtin(global_invocation_id)
|
|
31
|
-
let tile =
|
|
30
|
+
fn main(@builtin(global_invocation_id) uq: vec3u) {
|
|
31
|
+
let tile = uq.x;
|
|
32
32
|
let tileCount = params.columns * params.rows;
|
|
33
33
|
if (tile >= tileCount) {
|
|
34
34
|
return;
|
|
@@ -36,18 +36,18 @@ return;
|
|
|
36
36
|
|
|
37
37
|
let tileX = tile % params.columns;
|
|
38
38
|
let tileY = tile / params.columns;
|
|
39
|
-
let
|
|
40
|
-
let
|
|
41
|
-
let
|
|
42
|
-
let
|
|
43
|
-
var
|
|
44
|
-
var
|
|
39
|
+
let ux = tileX * params.tileSize;
|
|
40
|
+
let uy = tileY * params.tileSize;
|
|
41
|
+
let wl = min(ux + params.tileSize, params.width);
|
|
42
|
+
let wm = min(uy + params.tileSize, params.height);
|
|
43
|
+
var mY = 0.0;
|
|
44
|
+
var je = 0.0;
|
|
45
45
|
var count = 0u;
|
|
46
46
|
|
|
47
|
-
for (var y =
|
|
48
|
-
for (var x =
|
|
49
|
-
let
|
|
50
|
-
let offset =
|
|
47
|
+
for (var y = uy; y < wm; y++) {
|
|
48
|
+
for (var x = ux; x < wl; x++) {
|
|
49
|
+
let fQ = y * params.width + x;
|
|
50
|
+
let offset = fQ * 4u;
|
|
51
51
|
let samples = pilotMoments[offset + 3u];
|
|
52
52
|
if (samples <= 0.0) {
|
|
53
53
|
continue;
|
|
@@ -60,28 +60,28 @@ pilotColor[offset + 2u]
|
|
|
60
60
|
),
|
|
61
61
|
LUMINANCE
|
|
62
62
|
) / samples;
|
|
63
|
-
let
|
|
64
|
-
let
|
|
65
|
-
var variance =
|
|
63
|
+
let tK = pilotMoments[offset] / samples;
|
|
64
|
+
let pi = max(tK - mean * mean, 0.0);
|
|
65
|
+
var variance = pi;
|
|
66
66
|
if (samples > 1.0) {
|
|
67
|
-
variance =
|
|
67
|
+
variance = pi * samples / (samples - 1.0);
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
mY += mean;
|
|
70
|
+
je = max(je, variance);
|
|
71
71
|
count += 1u;
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
let mean =
|
|
76
|
-
var
|
|
75
|
+
let mean = mY / f32(max(count, 1u));
|
|
76
|
+
var oX = 0.0;
|
|
77
77
|
if (params.hasPrevious != 0u) {
|
|
78
|
-
|
|
78
|
+
oX = previousVariance[tile];
|
|
79
79
|
}
|
|
80
|
-
let
|
|
81
|
-
let
|
|
80
|
+
let sj = max(je, oX);
|
|
81
|
+
let tf = params.absoluteError + params.relativeError * abs(mean);
|
|
82
82
|
let required = ceil(
|
|
83
|
-
params.confidence * params.confidence *
|
|
84
|
-
max(
|
|
83
|
+
params.confidence * params.confidence * sj /
|
|
84
|
+
max(tf * tf, 1e-16)
|
|
85
85
|
);
|
|
86
86
|
let targetSamples = u32(min(
|
|
87
87
|
f32(params.maxSamples),
|
|
@@ -91,11 +91,11 @@ max(f32(params.minSamples), required)
|
|
|
91
91
|
tileMeans[tile] = mean;
|
|
92
92
|
|
|
93
93
|
|
|
94
|
-
tileVariances[tile] =
|
|
94
|
+
tileVariances[tile] = je;
|
|
95
95
|
tileTargets[tile] = targetSamples;
|
|
96
96
|
|
|
97
|
-
for (var y =
|
|
98
|
-
for (var x =
|
|
97
|
+
for (var y = uy; y < wm; y++) {
|
|
98
|
+
for (var x = ux; x < wl; x++) {
|
|
99
99
|
textureStore(
|
|
100
100
|
targetTexture,
|
|
101
101
|
vec2i(i32(x), i32(y)),
|