@meimu/mutracer 0.1.4 → 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 +1425 -1421
- package/docs/api.md +2 -1
- package/docs/materials.md +17 -26
- package/docs/threejs.md +5 -5
- package/docs/viewer.md +36 -3
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
- package/lib/renderer/WGPURayTraceOutput.js +4 -4
- package/lib/renderer/WGPURayTracePass.js +5 -3
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +7 -7
- package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
- package/lib/renderer/WebGLRayTracePass.js +1 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
- package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
- package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/rayTrace.frag.js +67 -67
- package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
- package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
- package/lib/renderer/scratchSampling.js +16 -16
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
- package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
- package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
- 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/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,18 +11,18 @@ export default /*wgsl*/ `
|
|
|
11
11
|
const SHADOW_CATCHER_LIGHT_SAMPLES = 4u;
|
|
12
12
|
|
|
13
13
|
fn sampleShadowCatcher(si: ad, bounce: i32, aa: ptr<function, Path>) {
|
|
14
|
-
let
|
|
14
|
+
let oS = -(*aa).ray.d;
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
if (rtUniform.lightChoiceCount > 0) {
|
|
18
18
|
var shadow = 0.0;
|
|
19
19
|
for (var candidate = 0u; candidate < SHADOW_CATCHER_LIGHT_SAMPLES; candidate++) {
|
|
20
20
|
var lightSample: LightSampleRec;
|
|
21
|
-
let ln = vec3f(
|
|
21
|
+
let ln = vec3f(fp(rd(candidate, 1u)), dz(rd(candidate, 0u)));
|
|
22
22
|
sampleLight(si.position, ln, &lightSample, false);
|
|
23
23
|
let lightDir = lightSample.direction;
|
|
24
24
|
let cosThetaL = dot(si.normal, lightDir);
|
|
25
|
-
let pM = dot(si.normal,
|
|
25
|
+
let pM = dot(si.normal, oS) * cosThetaL;
|
|
26
26
|
if (lightSample.pdf > 0.0 && pM >= 0.0) {
|
|
27
27
|
var ray: Ray;
|
|
28
28
|
iC(&ray, si.position + EPS * lightDir, lightDir);
|
|
@@ -5,27 +5,27 @@ export default /*wgsl*/ `
|
|
|
5
5
|
|
|
6
6
|
fn aQ(view: vec3f, alpha: vec2f, samplePoint: vec2f) -> vec3f {
|
|
7
7
|
let rm = vec3f(alpha, 1.0);
|
|
8
|
-
let
|
|
9
|
-
let uh = min(
|
|
8
|
+
let gk = normalize(rm * view);
|
|
9
|
+
let uh = min(gk.z, 1.0);
|
|
10
10
|
let qQ = 1.0 + uh;
|
|
11
11
|
let rh = (1.0 - samplePoint.y) * qQ;
|
|
12
12
|
let rR = samplePoint.y * qQ;
|
|
13
13
|
let sI = rh + (1.0 - uh);
|
|
14
14
|
let fl = sqrt(max(0.0, sI * rR));
|
|
15
15
|
let br = TWOPI * samplePoint.x;
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
let lI = vec3f(
|
|
17
|
+
gk.x + fl * cos(br),
|
|
18
|
+
gk.y + fl * sin(br),
|
|
19
19
|
rh
|
|
20
20
|
);
|
|
21
|
-
return normalize(rm *
|
|
21
|
+
return normalize(rm * lI);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
fn
|
|
24
|
+
fn gL(oo: vec3f, alpha: vec2f) -> f32 {
|
|
25
25
|
let hr = vec3f(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
oo.x / alpha.x,
|
|
27
|
+
oo.y / alpha.y,
|
|
28
|
+
oo.z
|
|
29
29
|
);
|
|
30
30
|
let ap = dot(hr, hr);
|
|
31
31
|
return 1.0 / (
|
|
@@ -39,9 +39,9 @@ if (eF <= 1e-8) {
|
|
|
39
39
|
return 0.0;
|
|
40
40
|
}
|
|
41
41
|
let ic = alpha * direction.xy;
|
|
42
|
-
let
|
|
42
|
+
let lJ = dot(ic, ic)
|
|
43
43
|
/ (eF * eF);
|
|
44
|
-
return 2.0 / (1.0 + sqrt(1.0 +
|
|
44
|
+
return 2.0 / (1.0 + sqrt(1.0 + lJ));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
fn aE(au: f32) -> f32 {
|
|
@@ -57,17 +57,17 @@ if (kl >= 1.0) {
|
|
|
57
57
|
return 1.0;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
let
|
|
61
|
-
let ba = (iA - cJ *
|
|
62
|
-
/ max(iA + cJ *
|
|
63
|
-
let pN = (cJ * iA -
|
|
64
|
-
/ max(cJ * iA +
|
|
60
|
+
let lT = sqrt(max(0.0, 1.0 - kl));
|
|
61
|
+
let ba = (iA - cJ * lT)
|
|
62
|
+
/ max(iA + cJ * lT, 1e-8);
|
|
63
|
+
let pN = (cJ * iA - lT)
|
|
64
|
+
/ max(cJ * iA + lT, 1e-8);
|
|
65
65
|
return 0.5 * (
|
|
66
66
|
ba * ba + pN * pN
|
|
67
67
|
);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
fn
|
|
70
|
+
fn gi(samplePoint: vec2f) -> vec2f {
|
|
71
71
|
let offset = 2.0 * samplePoint - vec2f(1.0);
|
|
72
72
|
if (offset.x == 0.0 && offset.y == 0.0) {
|
|
73
73
|
return vec2f(0.0);
|
|
@@ -87,21 +87,21 @@ return radius * vec2f(cos(angle), sin(angle));
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
fn bi(samplePoint: vec2f) -> vec3f {
|
|
90
|
-
let kF =
|
|
90
|
+
let kF = gi(samplePoint);
|
|
91
91
|
return vec3f(
|
|
92
92
|
kF,
|
|
93
93
|
sqrt(max(0.0, 1.0 - dot(kF, kF)))
|
|
94
94
|
);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
fn aG(pr: f32,
|
|
98
|
-
let scale = max(pr,
|
|
97
|
+
fn aG(pr: f32, nN: f32) -> f32 {
|
|
98
|
+
let scale = max(pr, nN);
|
|
99
99
|
if (scale <= 0.0) {
|
|
100
100
|
return 0.0;
|
|
101
101
|
}
|
|
102
|
-
let normalized = vec2f(pr,
|
|
103
|
-
let
|
|
104
|
-
return
|
|
102
|
+
let normalized = vec2f(pr, nN) / scale;
|
|
103
|
+
let oO = normalized * normalized;
|
|
104
|
+
return oO.x / (oO.x + oO.y);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
fn aL(
|
|
@@ -139,12 +139,12 @@ return vec3f(0.0, 0.0, rgb.b);
|
|
|
139
139
|
|
|
140
140
|
fn eN(
|
|
141
141
|
wavelength: f32,
|
|
142
|
-
|
|
142
|
+
hh: f32,
|
|
143
143
|
hp: f32,
|
|
144
144
|
qs: f32
|
|
145
145
|
) -> f32 {
|
|
146
146
|
if (wavelength == 0.0 || hp <= 0.0) {
|
|
147
|
-
return
|
|
147
|
+
return hh;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
let FRAUNHOFER_C = 656.3;
|
|
@@ -154,15 +154,15 @@ let jR = 1.0 / (
|
|
|
154
154
|
1.0 / (FRAUNHOFER_F * FRAUNHOFER_F)
|
|
155
155
|
- 1.0 / (FRAUNHOFER_C * FRAUNHOFER_C)
|
|
156
156
|
);
|
|
157
|
-
let
|
|
158
|
-
let qR = (
|
|
159
|
-
let tl =
|
|
157
|
+
let ng = max(qs / hp, 1e-6);
|
|
158
|
+
let qR = (hh - 1.0) * jR / ng;
|
|
159
|
+
let tl = hh
|
|
160
160
|
- qR / (FRAUNHOFER_D * FRAUNHOFER_D);
|
|
161
161
|
return tl + qR / (wavelength * wavelength);
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
fn
|
|
165
|
-
|
|
164
|
+
fn fq(
|
|
165
|
+
gz: vec3f,
|
|
166
166
|
anisotropy: f32,
|
|
167
167
|
samplePoint: vec2f
|
|
168
168
|
) -> vec3f {
|
|
@@ -182,10 +182,10 @@ let ud = sqrt(max(0.0, 1.0 - au * au));
|
|
|
182
182
|
let br = TWOPI * samplePoint.x;
|
|
183
183
|
var tangent: vec3f;
|
|
184
184
|
var bitangent: vec3f;
|
|
185
|
-
aL(
|
|
185
|
+
aL(gz, &tangent, &bitangent);
|
|
186
186
|
return tangent * (ud * cos(br))
|
|
187
187
|
+ bitangent * (ud * sin(br))
|
|
188
|
-
+
|
|
188
|
+
+ gz * au;
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
fn bD(au: f32, anisotropy: f32) -> f32 {
|
|
@@ -99,18 +99,18 @@ return cw(9u + (candidate - 1u) * 3u + slot);
|
|
|
99
99
|
|
|
100
100
|
var<private> hl: vec4u;
|
|
101
101
|
var<private> hm: u32;
|
|
102
|
-
var<private>
|
|
102
|
+
var<private> fC: bool = false;
|
|
103
103
|
var<private> dg: bool = false;
|
|
104
104
|
var<private> dF: u32;
|
|
105
|
-
var<private>
|
|
105
|
+
var<private> gv: u32;
|
|
106
106
|
var<private> eQ: vec2f;
|
|
107
107
|
fn dw(dim: u32) {
|
|
108
108
|
|
|
109
109
|
let kd = bc.x + bc.y * u32(rtUniform.outputSize.x);
|
|
110
110
|
let key = vec4u(dim, bd, kd, rtUniform.sequenceSeed);
|
|
111
|
-
if (
|
|
111
|
+
if (fC && all(hl == key) && hm == rtUniform.zSobolLogSPP) { return; }
|
|
112
112
|
hl = key; hm = rtUniform.zSobolLogSPP;
|
|
113
|
-
|
|
113
|
+
fC = true; dg = false;
|
|
114
114
|
var ij = aq(aq(kd, dim), rtUniform.sequenceSeed);
|
|
115
115
|
var index = bd;
|
|
116
116
|
if (SAMPLING_PATTERN == 1) {
|
|
@@ -129,14 +129,14 @@ if (bd != 0u) { jb += 1u; }
|
|
|
129
129
|
ij = aq(ij, jb);
|
|
130
130
|
}
|
|
131
131
|
dF = sK(index, aq(ij, 0u));
|
|
132
|
-
|
|
132
|
+
gv = ij;
|
|
133
133
|
let x = reverseBits(iE(dF, aq(ij, 1u)));
|
|
134
134
|
eQ.x = f32(x >> 8u) * (1.0 / 16777216.0);
|
|
135
135
|
}
|
|
136
136
|
fn kS(dim: u32) -> vec2f {
|
|
137
137
|
dw(dim);
|
|
138
138
|
if (!dg) {
|
|
139
|
-
let y = sK(rl(dF), aq(
|
|
139
|
+
let y = sK(rl(dF), aq(gv, 2u));
|
|
140
140
|
eQ.y = f32(y >> 8u) * (1.0 / 16777216.0);
|
|
141
141
|
dg = true;
|
|
142
142
|
}
|
|
@@ -147,7 +147,7 @@ if (SAMPLING_PATTERN == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
|
|
|
147
147
|
dw(dim);
|
|
148
148
|
return EPS + (1.0 - 2.0*EPS) * eQ.x;
|
|
149
149
|
}
|
|
150
|
-
fn
|
|
150
|
+
fn fp(dim: u32) -> vec2f {
|
|
151
151
|
if (SAMPLING_PATTERN == 2) {
|
|
152
152
|
let x = dz(dim); let y = dz(dim);
|
|
153
153
|
return vec2f(x,y);
|
|
@@ -28,7 +28,7 @@ let theta = atan2(pos.z, pos.x) / (2.0 * PI) + 0.5;
|
|
|
28
28
|
return vec2f(theta, pos.y);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
fn
|
|
31
|
+
fn gI(fk: i32, pos: vec3f, normal: vec3f) -> vec2f {
|
|
32
32
|
if (fk == ${uvProjectionConstants.triplanar}) {
|
|
33
33
|
return iR(pos, normal);
|
|
34
34
|
} else if (fk == ${uvProjectionConstants.spherical}) {
|
|
@@ -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;
|
|
@@ -19,7 +19,7 @@ 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
|
|
22
|
+
fn oI(value: vec3f) -> vec3f {
|
|
23
23
|
let kO = value * (value + 0.0245786) - 0.000090537;
|
|
24
24
|
let ap = value * (0.983729 * value + 0.4329510) + 0.238081;
|
|
25
25
|
return kO / ap;
|
|
@@ -30,28 +30,28 @@ 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
38
|
let color = pw * (jr / 0.6);
|
|
39
|
-
return clamp(
|
|
39
|
+
return clamp(oD * oI(color), vec3f(0.0), vec3f(1.0));
|
|
40
40
|
}
|
|
41
|
-
fn
|
|
42
|
-
let
|
|
43
|
-
let qK =
|
|
44
|
-
return 15.5 * qK *
|
|
45
|
-
+ 31.96 * qK - 6.868 *
|
|
46
|
-
+ 0.4298 *
|
|
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
47
|
}
|
|
48
|
-
fn
|
|
49
|
-
let
|
|
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)
|
|
@@ -61,16 +61,16 @@ 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 = pH * (
|
|
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);
|
|
@@ -78,10 +78,10 @@ if (toneMappingMode == 1) { return lv(color); }
|
|
|
78
78
|
if (toneMappingMode == 2) { return jJ(color); }
|
|
79
79
|
if (toneMappingMode == 3) { return iP(color); }
|
|
80
80
|
if (toneMappingMode == 4) { return jU(color); }
|
|
81
|
-
return
|
|
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;
|
|
@@ -106,46 +106,46 @@ jl = load_bloomTex(uv, 0) * bloomIntensity;
|
|
|
106
106
|
dY = vec4f(dY.rgb + jl.rgb, dY.a);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
var ll =
|
|
109
|
+
var ll = gc(dY.rgb * exposure);
|
|
110
110
|
let iI = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));
|
|
111
111
|
ll *= 1.0 - toneMappingParams.y * iI;
|
|
112
|
-
let
|
|
113
|
-
if (!
|
|
112
|
+
let gC = hdrOutputEnabled > 0.5;
|
|
113
|
+
if (!gC) {
|
|
114
114
|
ll = cl(ll);
|
|
115
115
|
}
|
|
116
|
-
let
|
|
116
|
+
let ml = select(
|
|
117
117
|
pow(max(ll, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
fN(ll),
|
|
119
|
+
gC
|
|
120
120
|
);
|
|
121
|
-
var
|
|
121
|
+
var ob = ml;
|
|
122
122
|
if (flatBackgroundColor.a > 0.5) {
|
|
123
123
|
let jg = clamp(
|
|
124
124
|
load_flatBackgroundMaskTex(uv, 0).a,
|
|
125
125
|
0.0,
|
|
126
126
|
1.0
|
|
127
127
|
);
|
|
128
|
-
let pb =
|
|
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 ir =
|
|
131
|
+
var ir = gc(
|
|
132
132
|
max(dY.rgb - jl.rgb, vec3f(0.0))
|
|
133
133
|
* exposure
|
|
134
134
|
);
|
|
135
135
|
ir *= 1.0 - toneMappingParams.y * iI;
|
|
136
|
-
if (!
|
|
136
|
+
if (!gC) {
|
|
137
137
|
ir = cl(ir);
|
|
138
138
|
}
|
|
139
139
|
let rF = select(
|
|
140
140
|
pow(max(ir, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
fN(ir),
|
|
142
|
+
gC
|
|
143
143
|
);
|
|
144
|
-
|
|
144
|
+
ob += max(ml - rF, vec3f(0.0))
|
|
145
145
|
* (1.0 - jg);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
dY = vec4f(
|
|
148
|
+
dY = vec4f(ob, dY.a);
|
|
149
149
|
if (bloomIntensity > 0.0) {
|
|
150
150
|
dY.a = max(dY.a, min(dot(jl.rgb, vec3f(0.2125, 0.7154, 0.0721)), 1.0));
|
|
151
151
|
}
|
|
@@ -162,35 +162,35 @@ let background = load_catcherBackgroundTex(uv, 0);
|
|
|
162
162
|
|
|
163
163
|
|
|
164
164
|
let kH = select(0.0, clamp(background.a - coverage, 0.0, 1.0 - coverage), flatBackgroundColor.a > 0.5);
|
|
165
|
-
var bK =
|
|
166
|
-
var backgroundColor =
|
|
165
|
+
var bK = gc((foreground.rgb + jl.rgb) * exposure);
|
|
166
|
+
var backgroundColor = gc((background.rgb / max(background.a, 0.000001) + jl.rgb) * exposure);
|
|
167
167
|
bK *= 1.0 - toneMappingParams.y * iI;
|
|
168
168
|
backgroundColor *= 1.0 - toneMappingParams.y * iI;
|
|
169
|
-
if (!
|
|
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 eP =
|
|
176
|
+
var eP = gc(background.rgb / max(background.a, 0.000001) * exposure);
|
|
177
177
|
eP *= 1.0 - toneMappingParams.y * iI;
|
|
178
|
-
if (!
|
|
179
|
-
let
|
|
180
|
-
let uk = select(vec3f(0.0), max(backgroundColor -
|
|
181
|
-
backgroundColor =
|
|
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
182
|
}
|
|
183
183
|
|
|
184
184
|
|
|
185
|
-
let
|
|
186
|
-
let
|
|
187
|
-
let hv = max(foreground.a,
|
|
188
|
-
let jd = max(background.a,
|
|
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
189
|
let ku = (jd - kH) * (1.0 - opacity) + kH;
|
|
190
|
-
let alpha = hv + ku +
|
|
190
|
+
let alpha = hv + ku + fS;
|
|
191
191
|
let premultiplied = bK * hv
|
|
192
192
|
+ backgroundColor * ku
|
|
193
|
-
+ shadowCatcherColor *
|
|
193
|
+
+ shadowCatcherColor * fS;
|
|
194
194
|
dY = vec4f(premultiplied / max(alpha, 0.000001), alpha);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
@@ -207,7 +207,7 @@ 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
212
|
output.denoiseColor = vec4f(sW, dY.a);
|
|
213
213
|
|
|
@@ -221,9 +221,9 @@ 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 iv =
|
|
224
|
+
var iv = gc(background.rgb / background.a * exposure);
|
|
225
225
|
iv *= 1.0 - toneMappingParams.y * iI;
|
|
226
|
-
if (!
|
|
226
|
+
if (!gC) { iv = cl(iv); }
|
|
227
227
|
|
|
228
228
|
|
|
229
229
|
|
|
@@ -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
11
|
let uz = abs(original) > vec3f(0.000001);
|
|
12
12
|
let ap = select(vec3f(1.0), original, uz);
|
|
13
13
|
let scale = select(vec3f(1.0), filtered / ap, uz);
|
|
14
14
|
let ub = select(filtered - original, vec3f(0.0), uz);
|
|
15
|
-
|
|
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 */ `
|
|
@@ -12,7 +12,7 @@ outColor[index] = vec4f(0.0);
|
|
|
12
12
|
if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }
|
|
13
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
|
|
|
@@ -24,7 +24,7 @@ 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);
|
|
@@ -40,14 +40,14 @@ let ux = tileX * params.tileSize;
|
|
|
40
40
|
let uy = tileY * params.tileSize;
|
|
41
41
|
let wl = min(ux + params.tileSize, params.width);
|
|
42
42
|
let wm = min(uy + params.tileSize, params.height);
|
|
43
|
-
var
|
|
43
|
+
var mY = 0.0;
|
|
44
44
|
var je = 0.0;
|
|
45
45
|
var count = 0u;
|
|
46
46
|
|
|
47
47
|
for (var y = uy; y < wm; y++) {
|
|
48
48
|
for (var x = ux; x < wl; x++) {
|
|
49
|
-
let
|
|
50
|
-
let offset =
|
|
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;
|
|
@@ -66,13 +66,13 @@ var variance = pi;
|
|
|
66
66
|
if (samples > 1.0) {
|
|
67
67
|
variance = pi * samples / (samples - 1.0);
|
|
68
68
|
}
|
|
69
|
-
|
|
69
|
+
mY += mean;
|
|
70
70
|
je = max(je, variance);
|
|
71
71
|
count += 1u;
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
let mean =
|
|
75
|
+
let mean = mY / f32(max(count, 1u));
|
|
76
76
|
var oX = 0.0;
|
|
77
77
|
if (params.hasPrevious != 0u) {
|
|
78
78
|
oX = previousVariance[tile];
|