@meimu/mutracer 0.1.2 → 0.1.4
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 +4475 -4337
- package/docs/api.md +11 -9
- package/docs/threejs.md +30 -4
- 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 +68 -68
- package/lib/renderer/WGPURayTraceOutput.js +16 -14
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +13 -7
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +24 -22
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +68 -68
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +7 -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 +69 -57
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +153 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +540 -540
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +40 -39
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +71 -71
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +13 -13
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +65 -65
- 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 +165 -165
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +14 -14
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +56 -56
- package/lib/renderer/lightsUtil.js +7 -5
- 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 +475 -469
- 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 -61
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +562 -562
- 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 +128 -128
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +143 -143
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +75 -75
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
- package/lib/renderer/wgsl/compose.frag.wgsl.js +130 -102
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- 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 +289 -277
- 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/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 +5 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const linearToSrgbDefine = /* wgsl */ `
|
|
2
|
-
fn
|
|
2
|
+
fn fM(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 oJ(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 oE = 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(oE * oJ(color), vec3f(0.0), vec3f(1.0));
|
|
40
|
+
}
|
|
41
|
+
fn fT(value: vec3f) -> vec3f {
|
|
42
|
+
let mO = value * value;
|
|
43
|
+
let qK = mO * mO;
|
|
44
|
+
return 15.5 * qK * mO - 40.14 * qK * value
|
|
45
|
+
+ 31.96 * qK - 6.868 * mO * value
|
|
46
|
+
+ 0.4298 * mO + 0.1191 * value - 0.00232;
|
|
47
|
+
}
|
|
48
|
+
fn me(jr: vec3f) -> vec3f {
|
|
49
|
+
let mR = 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 mS = 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 oF = 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 * (mS * 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 = oF * fT(color);
|
|
72
72
|
color = pow(max(color, vec3f(0.0)), vec3f(2.2));
|
|
73
|
-
return clamp(
|
|
73
|
+
return clamp(mR * color, vec3f(0.0), vec3f(1.0));
|
|
74
74
|
}
|
|
75
|
-
fn
|
|
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 me(color);
|
|
82
82
|
}
|
|
83
83
|
${linearToSrgbDefine}
|
|
84
|
-
fn
|
|
84
|
+
fn gb(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,91 +100,97 @@ 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
|
-
|
|
115
|
-
}
|
|
116
|
-
let
|
|
117
|
-
pow(max(
|
|
118
|
-
|
|
119
|
-
|
|
109
|
+
var ll = gb(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 gA = hdrOutputEnabled > 0.5;
|
|
113
|
+
if (!gA) {
|
|
114
|
+
ll = cl(ll);
|
|
115
|
+
}
|
|
116
|
+
let mn = select(
|
|
117
|
+
pow(max(ll, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
118
|
+
fM(ll),
|
|
119
|
+
gA
|
|
120
120
|
);
|
|
121
|
-
var
|
|
121
|
+
var oc = mn;
|
|
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 = fM(max(flatBackgroundColor.rgb, vec3f(0.0)));
|
|
129
|
+
oc = mix(pb, mn, jg);
|
|
130
130
|
if (bloomIntensity > 0.0) {
|
|
131
|
-
var
|
|
132
|
-
max(dY.rgb -
|
|
131
|
+
var ir = gb(
|
|
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 (!gA) {
|
|
137
|
+
ir = cl(ir);
|
|
138
|
+
}
|
|
139
|
+
let rF = select(
|
|
140
|
+
pow(max(ir, vec3f(0.0)), vec3f(1.0 / 2.2)),
|
|
141
|
+
fM(ir),
|
|
142
|
+
gA
|
|
143
143
|
);
|
|
144
|
-
|
|
145
|
-
* (1.0 -
|
|
144
|
+
oc += max(mn - rF, vec3f(0.0))
|
|
145
|
+
* (1.0 - jg);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
dY = vec4f(
|
|
148
|
+
dY = vec4f(oc, 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) {
|
|
154
154
|
let shadowCatcher = load_shadowCatcherTex(uv, 0);
|
|
155
155
|
let coverage = clamp(shadowCatcher.r, 0.0, 1.0);
|
|
156
156
|
let opacity = max(clamp(shadowCatcher.a / max(coverage, 0.000001), 0.0, 1.0) - (1.0 - shadowCatcherAlpha), 0.0);
|
|
157
|
-
if (coverage > 0.0) {
|
|
157
|
+
if (coverage > 0.0 || flatBackgroundColor.a > 0.5) {
|
|
158
158
|
let foreground = load_foregroundTex(uv, 0);
|
|
159
159
|
let background = load_catcherBackgroundTex(uv, 0);
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
bK =
|
|
166
|
-
backgroundColor =
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
let kH = select(0.0, clamp(background.a - coverage, 0.0, 1.0 - coverage), flatBackgroundColor.a > 0.5);
|
|
165
|
+
var bK = gb((foreground.rgb + jl.rgb) * exposure);
|
|
166
|
+
var backgroundColor = gb((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 (!gA) {
|
|
170
|
+
bK = cl(bK);
|
|
171
|
+
backgroundColor = cl(backgroundColor);
|
|
172
|
+
}
|
|
173
|
+
bK = select(pow(max(bK, vec3f(0.0)), vec3f(1.0 / 2.2)), fM(bK), gA);
|
|
174
|
+
backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), fM(backgroundColor), gA);
|
|
170
175
|
if (flatBackgroundColor.a > 0.5) {
|
|
171
|
-
var
|
|
172
|
-
|
|
173
|
-
if (!
|
|
174
|
-
let
|
|
175
|
-
let
|
|
176
|
-
backgroundColor =
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
let
|
|
181
|
-
let
|
|
182
|
-
let
|
|
183
|
-
let
|
|
184
|
-
let
|
|
185
|
-
let
|
|
186
|
-
|
|
187
|
-
+
|
|
176
|
+
var eP = gb(background.rgb / max(background.a, 0.000001) * exposure);
|
|
177
|
+
eP *= 1.0 - toneMappingParams.y * iI;
|
|
178
|
+
if (!gA) { eP = cl(eP); }
|
|
179
|
+
let mo = select(pow(max(eP, vec3f(0.0)), vec3f(1.0 / 2.2)), fM(eP), gA);
|
|
180
|
+
let uk = select(vec3f(0.0), max(backgroundColor - mo, vec3f(0.0)), bloomIntensity > 0.0);
|
|
181
|
+
backgroundColor = fM(max(flatBackgroundColor.rgb, vec3f(0.0))) + uk;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
let fR = coverage * opacity;
|
|
186
|
+
let mg = clamp(dot(jl.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
|
|
187
|
+
let hv = max(foreground.a, mg * (1.0 - coverage - kH));
|
|
188
|
+
let jd = max(background.a, mg * coverage);
|
|
189
|
+
let ku = (jd - kH) * (1.0 - opacity) + kH;
|
|
190
|
+
let alpha = hv + ku + fR;
|
|
191
|
+
let premultiplied = bK * hv
|
|
192
|
+
+ backgroundColor * ku
|
|
193
|
+
+ shadowCatcherColor * fR;
|
|
188
194
|
dY = vec4f(premultiplied / max(alpha, 0.000001), alpha);
|
|
189
195
|
}
|
|
190
196
|
}
|
|
@@ -197,13 +203,35 @@ output.color = dY;
|
|
|
197
203
|
// linear-light image. Alpha is deliberately not used as a second color layer.
|
|
198
204
|
export const compositeDenoiseOutputMain = /* wgsl */ `
|
|
199
205
|
let encoded = max(dY.rgb, vec3f(0.0));
|
|
200
|
-
let
|
|
206
|
+
let sW = select(
|
|
201
207
|
pow(encoded, vec3f(2.2)),
|
|
202
208
|
select(pow((encoded + 0.055) / 1.055, vec3f(2.4)), encoded / 12.92,
|
|
203
209
|
encoded <= vec3f(0.04045)),
|
|
204
|
-
|
|
210
|
+
gA
|
|
205
211
|
);
|
|
206
|
-
output.denoiseColor = vec4f(
|
|
212
|
+
output.denoiseColor = vec4f(sW, dY.a);
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
let rawAlbedo = load_flatBackgroundMaskTex(uv, 0);
|
|
219
|
+
var oW = rawAlbedo.rgb;
|
|
220
|
+
if (shadowCatcherEnabled > 0.5 && flatBackgroundColor.a < 0.5) {
|
|
221
|
+
let coverage = clamp(load_shadowCatcherTex(uv, 0).r, 0.0, 1.0);
|
|
222
|
+
let background = load_catcherBackgroundTex(uv, 0);
|
|
223
|
+
if (coverage > 0.0 && background.a > 0.0) {
|
|
224
|
+
var iv = gb(background.rgb / background.a * exposure);
|
|
225
|
+
iv *= 1.0 - toneMappingParams.y * iI;
|
|
226
|
+
if (!gA) { iv = cl(iv); }
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
let rs = clamp(background.a, 0.0, coverage);
|
|
231
|
+
oW += rs * (clamp(iv, vec3f(0.0), vec3f(1.0)) - vec3f(1.0));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
output.denoiseAlbedo = vec4f(clamp(oW, vec3f(0.0), vec3f(1.0)), rawAlbedo.a);
|
|
207
235
|
`;
|
|
208
236
|
export const compositeDenoiseDisplayMain = /* wgsl */ `
|
|
209
237
|
let denoised = load_colorTex(uv, 0);
|
|
@@ -212,7 +240,7 @@ let denoised = load_colorTex(uv, 0);
|
|
|
212
240
|
|
|
213
241
|
let alpha = select(load_composedTex(uv, 0).a, clamp(denoised.a, 0.0, 1.0), denoisedAlpha > 0.5);
|
|
214
242
|
let linear = max(denoised.rgb, vec3f(0.0));
|
|
215
|
-
let encoded = select(pow(linear, vec3f(1.0 / 2.2)),
|
|
243
|
+
let encoded = select(pow(linear, vec3f(1.0 / 2.2)), fM(linear), hdrOutputEnabled > 0.5);
|
|
216
244
|
output.color = vec4f(select(vec3f(0.0), encoded, alpha > 0.0), alpha);
|
|
217
245
|
`;
|
|
218
246
|
//# sourceMappingURL=compose.frag.wgsl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.frag.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/compose.frag.wgsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;CAO5C,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0EtC,kBAAkB;;;;;;;;;;;;;;;;CAgBnB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+FrC,CAAC;AAEF,6EAA6E;AAC7E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;CASpD,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAC;;;;;;;;;CASrD,CAAC","sourcesContent":["export const linearToSrgbDefine = /* wgsl */ `\nfn linearToSrgb(color: vec3f) -> vec3f {\n let linear = max(color, vec3f(0.0));\n let low = linear * 12.92;\n let high = 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055;\n return select(high, low, linear <= vec3f(0.0031308));\n}\n`;\n\nexport const composeDefine = /* wgsl */ `\n\nfn linearToneMapping(color: vec3f) -> vec3f {\n return clamp(color, vec3f(0.0), vec3f(1.0));\n}\nfn reinhardToneMapping(color: vec3f) -> vec3f {\n return clamp(color / (vec3f(1.0) + color), vec3f(0.0), vec3f(1.0));\n}\nfn cineonToneMapping(inputColor: vec3f) -> vec3f {\n let color = max(vec3f(0.0), inputColor - 0.004);\n return pow((color * (6.2 * color + 0.5)) /\n (color * (6.2 * color + 1.7) + 0.06), vec3f(2.2));\n}\nfn rrtAndOdtFit(value: vec3f) -> vec3f {\n let numerator = value * (value + 0.0245786) - 0.000090537;\n let denominator = value * (0.983729 * value + 0.4329510) + 0.238081;\n return numerator / denominator;\n}\nfn acesToneMapping(inputColor: vec3f) -> vec3f {\n let inputMatrix = mat3x3f(\n vec3f(0.59719, 0.07600, 0.02840),\n vec3f(0.35458, 0.90834, 0.13383),\n vec3f(0.04823, 0.01566, 0.83777)\n );\n let outputMatrix = mat3x3f(\n vec3f(1.60475, -0.10208, -0.00327),\n vec3f(-0.53108, 1.10813, -0.07276),\n vec3f(-0.07367, -0.00605, 1.07602)\n );\n let color = inputMatrix * (inputColor / 0.6);\n return clamp(outputMatrix * rrtAndOdtFit(color), vec3f(0.0), vec3f(1.0));\n}\nfn agxDefaultContrastApprox(value: vec3f) -> vec3f {\n let value2 = value * value;\n let value4 = value2 * value2;\n return 15.5 * value4 * value2 - 40.14 * value4 * value\n + 31.96 * value4 - 6.868 * value2 * value\n + 0.4298 * value2 + 0.1191 * value - 0.00232;\n}\nfn agxToneMapping(inputColor: vec3f) -> vec3f {\n let linearRec2020ToLinearSrgb = mat3x3f(\n vec3f(1.6605, -0.1246, -0.0182),\n vec3f(-0.5876, 1.1329, -0.1006),\n vec3f(-0.0728, -0.0083, 1.1187)\n );\n let linearSrgbToLinearRec2020 = mat3x3f(\n vec3f(0.6274, 0.0691, 0.0164),\n vec3f(0.3293, 0.9195, 0.0880),\n vec3f(0.0433, 0.0113, 0.8956)\n );\n let insetMatrix = mat3x3f(\n vec3f(0.856627153315983, 0.137318972929847, 0.11189821299995),\n vec3f(0.0951212405381588, 0.761241990602591, 0.0767994186031903),\n vec3f(0.0482516061458583, 0.101439036467562, 0.811302368396859)\n );\n let outsetMatrix = mat3x3f(\n vec3f(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),\n vec3f(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),\n vec3f(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)\n );\n var color = insetMatrix * (linearSrgbToLinearRec2020 * inputColor);\n color = clamp((log2(max(color, vec3f(1e-10))) + 12.47393) / 16.5, vec3f(0.0), vec3f(1.0));\n color = outsetMatrix * agxDefaultContrastApprox(color);\n color = pow(max(color, vec3f(0.0)), vec3f(2.2));\n return clamp(linearRec2020ToLinearSrgb * color, vec3f(0.0), vec3f(1.0));\n}\nfn applyToneMapping(color: vec3f) -> vec3f {\n let toneMappingMode = i32(toneMappingParams.x);\n if (toneMappingMode == 1) { return acesToneMapping(color); }\n if (toneMappingMode == 2) { return cineonToneMapping(color); }\n if (toneMappingMode == 3) { return reinhardToneMapping(color); }\n if (toneMappingMode == 4) { return linearToneMapping(color); }\n return agxToneMapping(color);\n}\n${linearToSrgbDefine}\nfn gradeColor(inputColor: vec3f) -> vec3f {\n let contrast = colorGradingParams.x;\n let saturation = colorGradingParams.y;\n let temperature = colorGradingParams.z;\n let tint = colorGradingParams.w;\n let balance = vec3f(\n 1.0 + temperature * 0.16 + tint * 0.04,\n 1.0 - tint * 0.12,\n 1.0 - temperature * 0.16 + tint * 0.04\n );\n var color = max(inputColor * balance, vec3f(0.0));\n color = max((color - 0.18) * contrast + 0.18, vec3f(0.0));\n let luminance = dot(color, vec3f(0.2126, 0.7152, 0.0722));\n return max(mix(vec3f(luminance), color, saturation), vec3f(0.0));\n}\n`;\n\nexport const composeMain = /* wgsl */ `\n\nvar finalColor = load_colorTex(uv, 0);\nvar bloomTexel = vec4(0.0);\nif (bloomIntensity > 0.0) {\n bloomTexel = load_bloomTex(uv, 0) * bloomIntensity;\n finalColor = vec4f(finalColor.rgb + bloomTexel.rgb, finalColor.a);\n}\n\nvar gradedColor = gradeColor(finalColor.rgb * exposure);\nlet vignetteEdge = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));\ngradedColor *= 1.0 - toneMappingParams.y * vignetteEdge;\nlet hdrOutput = hdrOutputEnabled > 0.5;\nif (!hdrOutput) {\n gradedColor = applyToneMapping(gradedColor);\n}\nlet encodedDisplay = select(\n pow(max(gradedColor, vec3f(0.0)), vec3f(1.0 / 2.2)),\n linearToSrgb(gradedColor),\n hdrOutput\n);\nvar displayColor = encodedDisplay;\nif (flatBackgroundColor.a > 0.5) {\n let surfaceCoverage = clamp(\n load_flatBackgroundMaskTex(uv, 0).a,\n 0.0,\n 1.0\n );\n let flatBackgroundDisplay = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0)));\n displayColor = mix(flatBackgroundDisplay, encodedDisplay, surfaceCoverage);\n if (bloomIntensity > 0.0) {\n var unbloomedColor = gradeColor(\n max(finalColor.rgb - bloomTexel.rgb, vec3f(0.0))\n * exposure\n );\n unbloomedColor *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) {\n unbloomedColor = applyToneMapping(unbloomedColor);\n }\n let encodedUnbloomed = select(\n pow(max(unbloomedColor, vec3f(0.0)), vec3f(1.0 / 2.2)),\n linearToSrgb(unbloomedColor),\n hdrOutput\n );\n displayColor += max(encodedDisplay - encodedUnbloomed, vec3f(0.0))\n * (1.0 - surfaceCoverage);\n }\n}\nfinalColor = vec4f(displayColor, finalColor.a);\nif (bloomIntensity > 0.0) {\n finalColor.a = max(finalColor.a, min(dot(bloomTexel.rgb, vec3f(0.2125, 0.7154, 0.0721)), 1.0));\n}\n\nif (shadowCatcherEnabled > 0.5) {\n let shadowCatcher = load_shadowCatcherTex(uv, 0);\n let coverage = clamp(shadowCatcher.r, 0.0, 1.0);\n let opacity = max(clamp(shadowCatcher.a / max(coverage, 0.000001), 0.0, 1.0) - (1.0 - shadowCatcherAlpha), 0.0);\n if (coverage > 0.0) {\n let foreground = load_foregroundTex(uv, 0);\n let background = load_catcherBackgroundTex(uv, 0);\n var foregroundColor = gradeColor((foreground.rgb + bloomTexel.rgb) * exposure);\n var backgroundColor = gradeColor((background.rgb / max(background.a, 0.000001) + bloomTexel.rgb) * exposure);\n foregroundColor *= 1.0 - toneMappingParams.y * vignetteEdge;\n backgroundColor *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) {\n foregroundColor = applyToneMapping(foregroundColor);\n backgroundColor = applyToneMapping(backgroundColor);\n }\n foregroundColor = select(pow(max(foregroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), linearToSrgb(foregroundColor), hdrOutput);\n backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), linearToSrgb(backgroundColor), hdrOutput);\n if (flatBackgroundColor.a > 0.5) {\n var unbloomedBackground = gradeColor(background.rgb / max(background.a, 0.000001) * exposure);\n unbloomedBackground *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) { unbloomedBackground = applyToneMapping(unbloomedBackground); }\n let encodedUnbloomedBackground = select(pow(max(unbloomedBackground, vec3f(0.0)), vec3f(1.0 / 2.2)), linearToSrgb(unbloomedBackground), hdrOutput);\n let bloomSpill = select(vec3f(0.0), max(backgroundColor - encodedUnbloomedBackground, vec3f(0.0)), bloomIntensity > 0.0);\n backgroundColor = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0))) + bloomSpill;\n }\n // Foreground and catcher are disjoint primary samples, not overlapping\n // alpha layers. Shadow only the catcher background before averaging.\n let shadowAlpha = coverage * opacity;\n let bloomAlpha = clamp(dot(bloomTexel.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);\n let foregroundAlpha = max(foreground.a, bloomAlpha * (1.0 - coverage));\n let backgroundAlpha = max(background.a, bloomAlpha * coverage);\n let alpha = foregroundAlpha + backgroundAlpha * (1.0 - opacity) + shadowAlpha;\n let premultiplied = foregroundColor * foregroundAlpha\n + backgroundColor * backgroundAlpha * (1.0 - opacity)\n + shadowCatcherColor * shadowAlpha;\n finalColor = vec4f(premultiplied / max(alpha, 0.000001), alpha);\n }\n}\n\noutput.color = finalColor;\n\n// output.color = load_bloomTex(uv, 0) * bloomIntensity;\n`;\n\n// Preserve the existing display composition, but give OIDN a floating-point,\n// linear-light image. Alpha is deliberately not used as a second color layer.\nexport const compositeDenoiseOutputMain = /* wgsl */ `\nlet encoded = max(finalColor.rgb, vec3f(0.0));\nlet displayLinear = select(\n pow(encoded, vec3f(2.2)),\n select(pow((encoded + 0.055) / 1.055, vec3f(2.4)), encoded / 12.92,\n encoded <= vec3f(0.04045)),\n hdrOutput\n);\noutput.denoiseColor = vec4f(displayLinear, finalColor.a);\n`;\n\nexport const compositeDenoiseDisplayMain = /* wgsl */ `\nlet denoised = load_colorTex(uv, 0);\n// Keep the original primary coverage, including transparency. OIDN only\n// filters RGB; filtering coverage separately reintroduces silhouette seams.\n// The built-in filter weights color and coverage together and may replace it.\nlet alpha = select(load_composedTex(uv, 0).a, clamp(denoised.a, 0.0, 1.0), denoisedAlpha > 0.5);\nlet linear = max(denoised.rgb, vec3f(0.0));\nlet encoded = select(pow(linear, vec3f(1.0 / 2.2)), linearToSrgb(linear), hdrOutputEnabled > 0.5);\noutput.color = vec4f(select(vec3f(0.0), encoded, alpha > 0.0), alpha);\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"compose.frag.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/compose.frag.wgsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;CAO5C,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0EtC,kBAAkB;;;;;;;;;;;;;;;;CAgBnB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGrC,CAAC;AAEF,6EAA6E;AAC7E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BpD,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAC;;;;;;;;;CASrD,CAAC","sourcesContent":["export const linearToSrgbDefine = /* wgsl */ `\nfn linearToSrgb(color: vec3f) -> vec3f {\n let linear = max(color, vec3f(0.0));\n let low = linear * 12.92;\n let high = 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055;\n return select(high, low, linear <= vec3f(0.0031308));\n}\n`;\n\nexport const composeDefine = /* wgsl */ `\n\nfn linearToneMapping(color: vec3f) -> vec3f {\n return clamp(color, vec3f(0.0), vec3f(1.0));\n}\nfn reinhardToneMapping(color: vec3f) -> vec3f {\n return clamp(color / (vec3f(1.0) + color), vec3f(0.0), vec3f(1.0));\n}\nfn cineonToneMapping(inputColor: vec3f) -> vec3f {\n let color = max(vec3f(0.0), inputColor - 0.004);\n return pow((color * (6.2 * color + 0.5)) /\n (color * (6.2 * color + 1.7) + 0.06), vec3f(2.2));\n}\nfn rrtAndOdtFit(value: vec3f) -> vec3f {\n let numerator = value * (value + 0.0245786) - 0.000090537;\n let denominator = value * (0.983729 * value + 0.4329510) + 0.238081;\n return numerator / denominator;\n}\nfn acesToneMapping(inputColor: vec3f) -> vec3f {\n let inputMatrix = mat3x3f(\n vec3f(0.59719, 0.07600, 0.02840),\n vec3f(0.35458, 0.90834, 0.13383),\n vec3f(0.04823, 0.01566, 0.83777)\n );\n let outputMatrix = mat3x3f(\n vec3f(1.60475, -0.10208, -0.00327),\n vec3f(-0.53108, 1.10813, -0.07276),\n vec3f(-0.07367, -0.00605, 1.07602)\n );\n let color = inputMatrix * (inputColor / 0.6);\n return clamp(outputMatrix * rrtAndOdtFit(color), vec3f(0.0), vec3f(1.0));\n}\nfn agxDefaultContrastApprox(value: vec3f) -> vec3f {\n let value2 = value * value;\n let value4 = value2 * value2;\n return 15.5 * value4 * value2 - 40.14 * value4 * value\n + 31.96 * value4 - 6.868 * value2 * value\n + 0.4298 * value2 + 0.1191 * value - 0.00232;\n}\nfn agxToneMapping(inputColor: vec3f) -> vec3f {\n let linearRec2020ToLinearSrgb = mat3x3f(\n vec3f(1.6605, -0.1246, -0.0182),\n vec3f(-0.5876, 1.1329, -0.1006),\n vec3f(-0.0728, -0.0083, 1.1187)\n );\n let linearSrgbToLinearRec2020 = mat3x3f(\n vec3f(0.6274, 0.0691, 0.0164),\n vec3f(0.3293, 0.9195, 0.0880),\n vec3f(0.0433, 0.0113, 0.8956)\n );\n let insetMatrix = mat3x3f(\n vec3f(0.856627153315983, 0.137318972929847, 0.11189821299995),\n vec3f(0.0951212405381588, 0.761241990602591, 0.0767994186031903),\n vec3f(0.0482516061458583, 0.101439036467562, 0.811302368396859)\n );\n let outsetMatrix = mat3x3f(\n vec3f(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),\n vec3f(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),\n vec3f(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)\n );\n var color = insetMatrix * (linearSrgbToLinearRec2020 * inputColor);\n color = clamp((log2(max(color, vec3f(1e-10))) + 12.47393) / 16.5, vec3f(0.0), vec3f(1.0));\n color = outsetMatrix * agxDefaultContrastApprox(color);\n color = pow(max(color, vec3f(0.0)), vec3f(2.2));\n return clamp(linearRec2020ToLinearSrgb * color, vec3f(0.0), vec3f(1.0));\n}\nfn applyToneMapping(color: vec3f) -> vec3f {\n let toneMappingMode = i32(toneMappingParams.x);\n if (toneMappingMode == 1) { return acesToneMapping(color); }\n if (toneMappingMode == 2) { return cineonToneMapping(color); }\n if (toneMappingMode == 3) { return reinhardToneMapping(color); }\n if (toneMappingMode == 4) { return linearToneMapping(color); }\n return agxToneMapping(color);\n}\n${linearToSrgbDefine}\nfn gradeColor(inputColor: vec3f) -> vec3f {\n let contrast = colorGradingParams.x;\n let saturation = colorGradingParams.y;\n let temperature = colorGradingParams.z;\n let tint = colorGradingParams.w;\n let balance = vec3f(\n 1.0 + temperature * 0.16 + tint * 0.04,\n 1.0 - tint * 0.12,\n 1.0 - temperature * 0.16 + tint * 0.04\n );\n var color = max(inputColor * balance, vec3f(0.0));\n color = max((color - 0.18) * contrast + 0.18, vec3f(0.0));\n let luminance = dot(color, vec3f(0.2126, 0.7152, 0.0722));\n return max(mix(vec3f(luminance), color, saturation), vec3f(0.0));\n}\n`;\n\nexport const composeMain = /* wgsl */ `\n\nvar finalColor = load_colorTex(uv, 0);\nvar bloomTexel = vec4(0.0);\nif (bloomIntensity > 0.0) {\n bloomTexel = load_bloomTex(uv, 0) * bloomIntensity;\n finalColor = vec4f(finalColor.rgb + bloomTexel.rgb, finalColor.a);\n}\n\nvar gradedColor = gradeColor(finalColor.rgb * exposure);\nlet vignetteEdge = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));\ngradedColor *= 1.0 - toneMappingParams.y * vignetteEdge;\nlet hdrOutput = hdrOutputEnabled > 0.5;\nif (!hdrOutput) {\n gradedColor = applyToneMapping(gradedColor);\n}\nlet encodedDisplay = select(\n pow(max(gradedColor, vec3f(0.0)), vec3f(1.0 / 2.2)),\n linearToSrgb(gradedColor),\n hdrOutput\n);\nvar displayColor = encodedDisplay;\nif (flatBackgroundColor.a > 0.5) {\n let surfaceCoverage = clamp(\n load_flatBackgroundMaskTex(uv, 0).a,\n 0.0,\n 1.0\n );\n let flatBackgroundDisplay = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0)));\n displayColor = mix(flatBackgroundDisplay, encodedDisplay, surfaceCoverage);\n if (bloomIntensity > 0.0) {\n var unbloomedColor = gradeColor(\n max(finalColor.rgb - bloomTexel.rgb, vec3f(0.0))\n * exposure\n );\n unbloomedColor *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) {\n unbloomedColor = applyToneMapping(unbloomedColor);\n }\n let encodedUnbloomed = select(\n pow(max(unbloomedColor, vec3f(0.0)), vec3f(1.0 / 2.2)),\n linearToSrgb(unbloomedColor),\n hdrOutput\n );\n displayColor += max(encodedDisplay - encodedUnbloomed, vec3f(0.0))\n * (1.0 - surfaceCoverage);\n }\n}\nfinalColor = vec4f(displayColor, finalColor.a);\nif (bloomIntensity > 0.0) {\n finalColor.a = max(finalColor.a, min(dot(bloomTexel.rgb, vec3f(0.2125, 0.7154, 0.0721)), 1.0));\n}\n\nif (shadowCatcherEnabled > 0.5) {\n let shadowCatcher = load_shadowCatcherTex(uv, 0);\n let coverage = clamp(shadowCatcher.r, 0.0, 1.0);\n let opacity = max(clamp(shadowCatcher.a / max(coverage, 0.000001), 0.0, 1.0) - (1.0 - shadowCatcherAlpha), 0.0);\n if (coverage > 0.0 || flatBackgroundColor.a > 0.5) {\n let foreground = load_foregroundTex(uv, 0);\n let background = load_catcherBackgroundTex(uv, 0);\n // An opaque flat backdrop also owns primary misses outside the receiver.\n // Its alpha contains catcher coverage plus miss coverage; only the catcher\n // fraction receives shadow. These weights come from the accumulation,\n // independently of the quantized denoising/albedo guide.\n let flatMissCoverage = select(0.0, clamp(background.a - coverage, 0.0, 1.0 - coverage), flatBackgroundColor.a > 0.5);\n var foregroundColor = gradeColor((foreground.rgb + bloomTexel.rgb) * exposure);\n var backgroundColor = gradeColor((background.rgb / max(background.a, 0.000001) + bloomTexel.rgb) * exposure);\n foregroundColor *= 1.0 - toneMappingParams.y * vignetteEdge;\n backgroundColor *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) {\n foregroundColor = applyToneMapping(foregroundColor);\n backgroundColor = applyToneMapping(backgroundColor);\n }\n foregroundColor = select(pow(max(foregroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), linearToSrgb(foregroundColor), hdrOutput);\n backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), linearToSrgb(backgroundColor), hdrOutput);\n if (flatBackgroundColor.a > 0.5) {\n var unbloomedBackground = gradeColor(background.rgb / max(background.a, 0.000001) * exposure);\n unbloomedBackground *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) { unbloomedBackground = applyToneMapping(unbloomedBackground); }\n let encodedUnbloomedBackground = select(pow(max(unbloomedBackground, vec3f(0.0)), vec3f(1.0 / 2.2)), linearToSrgb(unbloomedBackground), hdrOutput);\n let bloomSpill = select(vec3f(0.0), max(backgroundColor - encodedUnbloomedBackground, vec3f(0.0)), bloomIntensity > 0.0);\n backgroundColor = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0))) + bloomSpill;\n }\n // Foreground and catcher are disjoint primary samples, not overlapping\n // alpha layers. Shadow only the catcher background before averaging.\n let shadowAlpha = coverage * opacity;\n let bloomAlpha = clamp(dot(bloomTexel.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);\n let foregroundAlpha = max(foreground.a, bloomAlpha * (1.0 - coverage - flatMissCoverage));\n let backgroundAlpha = max(background.a, bloomAlpha * coverage);\n let visibleBackgroundAlpha = (backgroundAlpha - flatMissCoverage) * (1.0 - opacity) + flatMissCoverage;\n let alpha = foregroundAlpha + visibleBackgroundAlpha + shadowAlpha;\n let premultiplied = foregroundColor * foregroundAlpha\n + backgroundColor * visibleBackgroundAlpha\n + shadowCatcherColor * shadowAlpha;\n finalColor = vec4f(premultiplied / max(alpha, 0.000001), alpha);\n }\n}\n\noutput.color = finalColor;\n\n// output.color = load_bloomTex(uv, 0) * bloomIntensity;\n`;\n\n// Preserve the existing display composition, but give OIDN a floating-point,\n// linear-light image. Alpha is deliberately not used as a second color layer.\nexport const compositeDenoiseOutputMain = /* wgsl */ `\nlet encoded = max(finalColor.rgb, vec3f(0.0));\nlet displayLinear = select(\n pow(encoded, vec3f(2.2)),\n select(pow((encoded + 0.055) / 1.055, vec3f(2.4)), encoded / 12.92,\n encoded <= vec3f(0.04045)),\n hdrOutput\n);\noutput.denoiseColor = vec4f(displayLinear, finalColor.a);\n\n// The receiver is invisible: its visible texture is the displayed background,\n// not the neutral reflectance used for its lighting estimate. Match the beauty\n// reconstruction filter, including mixed foreground/receiver primary samples.\n// Exclude the stochastic shadow and bloom so neither is preserved as texture.\nlet rawAlbedo = load_flatBackgroundMaskTex(uv, 0);\nvar compositeAlbedo = rawAlbedo.rgb;\nif (shadowCatcherEnabled > 0.5 && flatBackgroundColor.a < 0.5) {\n let coverage = clamp(load_shadowCatcherTex(uv, 0).r, 0.0, 1.0);\n let background = load_catcherBackgroundTex(uv, 0);\n if (coverage > 0.0 && background.a > 0.0) {\n var backgroundAlbedo = gradeColor(background.rgb / background.a * exposure);\n backgroundAlbedo *= 1.0 - toneMappingParams.y * vignetteEdge;\n if (!hdrOutput) { backgroundAlbedo = applyToneMapping(backgroundAlbedo); }\n // Background alpha already includes primary catcher coverage. Retain the\n // neutral receiver for its transparent part, without counting coverage twice\n // or adding the stochastic shadow opacity to the texture guide.\n let backgroundWeight = clamp(background.a, 0.0, coverage);\n compositeAlbedo += backgroundWeight * (clamp(backgroundAlbedo, vec3f(0.0), vec3f(1.0)) - vec3f(1.0));\n }\n}\noutput.denoiseAlbedo = vec4f(clamp(compositeAlbedo, vec3f(0.0), vec3f(1.0)), rawAlbedo.a);\n`;\n\nexport const compositeDenoiseDisplayMain = /* wgsl */ `\nlet denoised = load_colorTex(uv, 0);\n// Keep the original primary coverage, including transparency. OIDN only\n// filters RGB; filtering coverage separately reintroduces silhouette seams.\n// The built-in filter weights color and coverage together and may replace it.\nlet alpha = select(load_composedTex(uv, 0).a, clamp(denoised.a, 0.0, 1.0), denoisedAlpha > 0.5);\nlet linear = max(denoised.rgb, vec3f(0.0));\nlet encoded = select(pow(linear, vec3f(1.0 / 2.2)), linearToSrgb(linear), hdrOutputEnabled > 0.5);\noutput.color = vec4f(select(vec3f(0.0), encoded, alpha > 0.0), alpha);\n`;\n"]}
|
|
@@ -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 mt = foreground;
|
|
9
|
+
var mr = 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
|
+
mt = vec4f(foreground.rgb * scale + ub, foreground.a);
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
mr = vec4f(background.rgb * scale + ub * background.a, background.a);
|
|
18
18
|
}
|
|
19
|
-
output.foreground =
|
|
20
|
-
output.background =
|
|
19
|
+
output.foreground = mt;
|
|
20
|
+
output.background = mr;
|
|
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 ol = -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, ol), 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 mZ = 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 fP = y * params.width + x;
|
|
50
|
+
let offset = fP * 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
|
+
mZ += mean;
|
|
70
|
+
je = max(je, variance);
|
|
71
71
|
count += 1u;
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
let mean =
|
|
76
|
-
var
|
|
75
|
+
let mean = mZ / 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)),
|