@meimu/mutracer 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +3525 -3484
  3. package/docs/materials.md +27 -7
  4. package/docs/threejs.md +13 -2
  5. package/docs/viewer.md +53 -0
  6. package/lib/oidn.d.ts +1 -1
  7. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  8. package/lib/renderer/MaterialTable.d.ts +1 -0
  9. package/lib/renderer/MaterialTable.js +2 -1
  10. package/lib/renderer/MaterialTable.js.map +1 -1
  11. package/lib/renderer/WGPUBloomPass.js +18 -18
  12. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  13. package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
  14. package/lib/renderer/WGPURayTraceOutput.js +14 -12
  15. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  16. package/lib/renderer/WGPURayTracePass.js +2 -2
  17. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  18. package/lib/renderer/WGPURenderingPipeline.js +20 -18
  19. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  20. package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
  21. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  22. package/lib/renderer/WebGLRayTracePass.js +3 -1
  23. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  24. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  25. package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
  26. package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
  27. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
  28. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
  29. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  30. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  31. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
  32. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
  33. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
  34. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
  36. package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
  37. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  38. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
  39. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  40. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  41. package/lib/renderer/glsl/rayTrace.frag.js +128 -128
  42. package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
  43. package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
  44. package/lib/renderer/lightsUtil.js +1 -1
  45. package/lib/renderer/lightsUtil.js.map +1 -1
  46. package/lib/renderer/materialComparison.generated.js +5 -0
  47. package/lib/renderer/materialComparison.generated.js.map +1 -1
  48. package/lib/renderer/materialLayout.js +2 -1
  49. package/lib/renderer/materialLayout.js.map +1 -1
  50. package/lib/renderer/prepareMeshBVH.d.ts +4 -2
  51. package/lib/renderer/prepareMeshBVH.js +44 -20
  52. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  53. package/lib/renderer/scratchSampling.js +6 -6
  54. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  55. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
  56. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
  57. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  58. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
  59. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
  60. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
  61. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  62. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
  63. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  64. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  65. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
  66. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
  67. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
  68. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
  69. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
  70. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  71. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  72. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  73. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
  74. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
  75. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  76. package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
  77. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  79. package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
  80. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  81. package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
  82. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  83. package/lib/scene/OpenPBRMaterial.d.ts +4 -2
  84. package/lib/scene/OpenPBRMaterial.js +4 -2
  85. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  86. package/lib/scene/openPbrSchema.d.ts +7 -2
  87. package/lib/scene/openPbrSchema.js +2 -1
  88. package/lib/scene/openPbrSchema.js.map +1 -1
  89. package/lib/util/fromTHREE.d.ts +1 -0
  90. package/lib/util/fromTHREE.js +24 -6
  91. package/lib/util/fromTHREE.js.map +1 -1
  92. package/lib/version.d.ts +1 -1
  93. package/lib/version.js +1 -1
  94. package/lib/version.js.map +1 -1
  95. package/package.json +5 -4
@@ -8,90 +8,90 @@ return select(high, low, linear <= vec3f(0.0031308));
8
8
  `;
9
9
  export const composeDefine = /* wgsl */ `
10
10
 
11
- fn jL(color: vec3f) -> vec3f {
11
+ fn jN(color: vec3f) -> vec3f {
12
12
  return clamp(color, vec3f(0.0), vec3f(1.0));
13
13
  }
14
- fn iJ(color: vec3f) -> vec3f {
14
+ fn iK(color: vec3f) -> vec3f {
15
15
  return clamp(color / (vec3f(1.0) + color), vec3f(0.0), vec3f(1.0));
16
16
  }
17
- fn jC(jk: vec3f) -> vec3f {
18
- let color = max(vec3f(0.0), jk - 0.004);
17
+ fn jE(jm: vec3f) -> vec3f {
18
+ let color = max(vec3f(0.0), jm - 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 ox(value: vec3f) -> vec3f {
23
- let kC = value * (value + 0.0245786) - 0.000090537;
22
+ fn oA(value: vec3f) -> vec3f {
23
+ let kF = value * (value + 0.0245786) - 0.000090537;
24
24
  let ap = value * (0.983729 * value + 0.4329510) + 0.238081;
25
- return kC / ap;
25
+ return kF / ap;
26
26
  }
27
- fn lh(jk: vec3f) -> vec3f {
28
- let pj = mat3x3f(
27
+ fn ll(jm: vec3f) -> vec3f {
28
+ let pn = 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 os = mat3x3f(
33
+ let ov = 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 = pj * (jk / 0.6);
39
- return clamp(os * ox(color), vec3f(0.0), vec3f(1.0));
38
+ let color = pn * (jm / 0.6);
39
+ return clamp(ov * oA(color), vec3f(0.0), vec3f(1.0));
40
40
  }
41
41
  fn fP(value: vec3f) -> vec3f {
42
- let mB = value * value;
43
- let qy = mB * mB;
44
- return 15.5 * qy * mB - 40.14 * qy * value
45
- + 31.96 * qy - 6.868 * mB * value
46
- + 0.4298 * mB + 0.1191 * value - 0.00232;
47
- }
48
- fn lP(jk: vec3f) -> vec3f {
49
- let mD = mat3x3f(
42
+ let mE = value * value;
43
+ let qC = mE * mE;
44
+ return 15.5 * qC * mE - 40.14 * qC * value
45
+ + 31.96 * qC - 6.868 * mE * value
46
+ + 0.4298 * mE + 0.1191 * value - 0.00232;
47
+ }
48
+ fn lS(jm: vec3f) -> vec3f {
49
+ let mG = 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 mE = mat3x3f(
54
+ let mH = 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 pl = mat3x3f(
59
+ let pp = 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 ot = mat3x3f(
64
+ let ow = 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 = pl * (mE * jk);
69
+ var color = pp * (mH * jm);
70
70
  color = clamp((log2(max(color, vec3f(1e-10))) + 12.47393) / 16.5, vec3f(0.0), vec3f(1.0));
71
- color = ot * fP(color);
71
+ color = ow * fP(color);
72
72
  color = pow(max(color, vec3f(0.0)), vec3f(2.2));
73
- return clamp(mD * color, vec3f(0.0), vec3f(1.0));
73
+ return clamp(mG * color, vec3f(0.0), vec3f(1.0));
74
74
  }
75
- fn cH(color: vec3f) -> vec3f {
75
+ fn cl(color: vec3f) -> vec3f {
76
76
  let toneMappingMode = i32(toneMappingParams.x);
77
- if (toneMappingMode == 1) { return lh(color); }
78
- if (toneMappingMode == 2) { return jC(color); }
79
- if (toneMappingMode == 3) { return iJ(color); }
80
- if (toneMappingMode == 4) { return jL(color); }
81
- return lP(color);
77
+ if (toneMappingMode == 1) { return ll(color); }
78
+ if (toneMappingMode == 2) { return jE(color); }
79
+ if (toneMappingMode == 3) { return iK(color); }
80
+ if (toneMappingMode == 4) { return jN(color); }
81
+ return lS(color);
82
82
  }
83
83
  ${linearToSrgbDefine}
84
- fn gS(jk: vec3f) -> vec3f {
84
+ fn fX(jm: 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 sW = vec3f(
89
+ let tb = 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(jk * sW, vec3f(0.0));
94
+ var color = max(jm * tb, 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,90 +100,96 @@ 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 jf = vec4(0.0);
103
+ var jh = vec4(0.0);
104
104
  if (bloomIntensity > 0.0) {
105
- jf = load_bloomTex(uv, 0) * bloomIntensity;
106
- dY = vec4f(dY.rgb + jf.rgb, dY.a);
105
+ jh = load_bloomTex(uv, 0) * bloomIntensity;
106
+ dY = vec4f(dY.rgb + jh.rgb, dY.a);
107
107
  }
108
108
 
109
- var kX = gS(dY.rgb * exposure);
110
- let kj = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));
111
- kX *= 1.0 - toneMappingParams.y * kj;
112
- let hx = hdrOutputEnabled > 0.5;
113
- if (!hx) {
114
- kX = cH(kX);
115
- }
116
- let lX = select(
117
- pow(max(kX, vec3f(0.0)), vec3f(1.0 / 2.2)),
118
- fJ(kX),
119
- hx
109
+ var la = fX(dY.rgb * exposure);
110
+ let iE = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));
111
+ la *= 1.0 - toneMappingParams.y * iE;
112
+ let gw = hdrOutputEnabled > 0.5;
113
+ if (!gw) {
114
+ la = cl(la);
115
+ }
116
+ let mb = select(
117
+ pow(max(la, vec3f(0.0)), vec3f(1.0 / 2.2)),
118
+ fJ(la),
119
+ gw
120
120
  );
121
- var nO = lX;
121
+ var nR = mb;
122
122
  if (flatBackgroundColor.a > 0.5) {
123
- let ja = clamp(
123
+ let jc = clamp(
124
124
  load_flatBackgroundMaskTex(uv, 0).a,
125
125
  0.0,
126
126
  1.0
127
127
  );
128
- let oO = fJ(max(flatBackgroundColor.rgb, vec3f(0.0)));
129
- nO = mix(oO, lX, ja);
128
+ let oS = fJ(max(flatBackgroundColor.rgb, vec3f(0.0)));
129
+ nR = mix(oS, mb, jc);
130
130
  if (bloomIntensity > 0.0) {
131
- var il = gS(
132
- max(dY.rgb - jf.rgb, vec3f(0.0))
131
+ var ik = fX(
132
+ max(dY.rgb - jh.rgb, vec3f(0.0))
133
133
  * exposure
134
134
  );
135
- il *= 1.0 - toneMappingParams.y * kj;
136
- if (!hx) {
137
- il = cH(il);
138
- }
139
- let rp = select(
140
- pow(max(il, vec3f(0.0)), vec3f(1.0 / 2.2)),
141
- fJ(il),
142
- hx
135
+ ik *= 1.0 - toneMappingParams.y * iE;
136
+ if (!gw) {
137
+ ik = cl(ik);
138
+ }
139
+ let ru = select(
140
+ pow(max(ik, vec3f(0.0)), vec3f(1.0 / 2.2)),
141
+ fJ(ik),
142
+ gw
143
143
  );
144
- nO += max(lX - rp, vec3f(0.0))
145
- * (1.0 - ja);
144
+ nR += max(mb - ru, vec3f(0.0))
145
+ * (1.0 - jc);
146
146
  }
147
147
  }
148
- dY = vec4f(nO, dY.a);
148
+ dY = vec4f(nR, dY.a);
149
149
  if (bloomIntensity > 0.0) {
150
- dY.a = max(dY.a, min(dot(jf.rgb, vec3f(0.2125, 0.7154, 0.0721)), 1.0));
150
+ dY.a = max(dY.a, min(dot(jh.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
- var bK = gS((foreground.rgb + jf.rgb) * exposure);
161
- var backgroundColor = gS((background.rgb / max(background.a, 0.000001) + jf.rgb) * exposure);
162
- bK *= 1.0 - toneMappingParams.y * kj;
163
- backgroundColor *= 1.0 - toneMappingParams.y * kj;
164
- if (!hx) {
165
- bK = cH(bK);
166
- backgroundColor = cH(backgroundColor);
167
- }
168
- bK = select(pow(max(bK, vec3f(0.0)), vec3f(1.0 / 2.2)), fJ(bK), hx);
169
- backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), fJ(backgroundColor), hx);
160
+
161
+
162
+
163
+
164
+ let kz = select(0.0, clamp(background.a - coverage, 0.0, 1.0 - coverage), flatBackgroundColor.a > 0.5);
165
+ var bK = fX((foreground.rgb + jh.rgb) * exposure);
166
+ var backgroundColor = fX((background.rgb / max(background.a, 0.000001) + jh.rgb) * exposure);
167
+ bK *= 1.0 - toneMappingParams.y * iE;
168
+ backgroundColor *= 1.0 - toneMappingParams.y * iE;
169
+ if (!gw) {
170
+ bK = cl(bK);
171
+ backgroundColor = cl(backgroundColor);
172
+ }
173
+ bK = select(pow(max(bK, vec3f(0.0)), vec3f(1.0 / 2.2)), fJ(bK), gw);
174
+ backgroundColor = select(pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2)), fJ(backgroundColor), gw);
170
175
  if (flatBackgroundColor.a > 0.5) {
171
- var eM = gS(background.rgb / max(background.a, 0.000001) * exposure);
172
- eM *= 1.0 - toneMappingParams.y * kj;
173
- if (!hx) { eM = cH(eM); }
174
- let lY = select(pow(max(eM, vec3f(0.0)), vec3f(1.0 / 2.2)), fJ(eM), hx);
175
- let tX = select(vec3f(0.0), max(backgroundColor - lY, vec3f(0.0)), bloomIntensity > 0.0);
176
- backgroundColor = fJ(max(flatBackgroundColor.rgb, vec3f(0.0))) + tX;
176
+ var eM = fX(background.rgb / max(background.a, 0.000001) * exposure);
177
+ eM *= 1.0 - toneMappingParams.y * iE;
178
+ if (!gw) { eM = cl(eM); }
179
+ let mc = select(pow(max(eM, vec3f(0.0)), vec3f(1.0 / 2.2)), fJ(eM), gw);
180
+ let ud = select(vec3f(0.0), max(backgroundColor - mc, vec3f(0.0)), bloomIntensity > 0.0);
181
+ backgroundColor = fJ(max(flatBackgroundColor.rgb, vec3f(0.0))) + ud;
177
182
  }
178
183
 
179
184
 
180
185
  let fO = coverage * opacity;
181
- let lR = clamp(dot(jf.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
182
- let hr = max(foreground.a, lR * (1.0 - coverage));
183
- let hg = max(background.a, lR * coverage);
184
- let alpha = hr + hg * (1.0 - opacity) + fO;
186
+ let lU = clamp(dot(jh.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
187
+ let hr = max(foreground.a, lU * (1.0 - coverage - kz));
188
+ let iZ = max(background.a, lU * coverage);
189
+ let kl = (iZ - kz) * (1.0 - opacity) + kz;
190
+ let alpha = hr + kl + fO;
185
191
  let premultiplied = bK * hr
186
- + backgroundColor * hg * (1.0 - opacity)
192
+ + backgroundColor * kl
187
193
  + shadowCatcherColor * fO;
188
194
  dY = vec4f(premultiplied / max(alpha, 0.000001), alpha);
189
195
  }
@@ -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 sK = select(
206
+ let sP = 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
- hx
210
+ gw
205
211
  );
206
- output.denoiseColor = vec4f(sK, dY.a);
212
+ output.denoiseColor = vec4f(sP, dY.a);
213
+
214
+
215
+
216
+
217
+
218
+ let rawAlbedo = load_flatBackgroundMaskTex(uv, 0);
219
+ var oN = 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 im = fX(background.rgb / background.a * exposure);
225
+ im *= 1.0 - toneMappingParams.y * iE;
226
+ if (!gw) { im = cl(im); }
227
+
228
+
229
+
230
+ let rk = clamp(background.a, 0.0, coverage);
231
+ oN += rk * (clamp(im, vec3f(0.0), vec3f(1.0)) - vec3f(1.0));
232
+ }
233
+ }
234
+ output.denoiseAlbedo = vec4f(clamp(oN, vec3f(0.0), vec3f(1.0)), rawAlbedo.a);
207
235
  `;
208
236
  export const compositeDenoiseDisplayMain = /* wgsl */ `
209
237
  let denoised = load_colorTex(uv, 0);
@@ -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 me = foreground;
9
- var mc = background;
8
+ var mh = foreground;
9
+ var mg = background;
10
10
  if (any(filtered != original)) {
11
- let uj = abs(original) > vec3f(0.000001);
12
- let ap = select(vec3f(1.0), original, uj);
13
- let scale = select(vec3f(1.0), filtered / ap, uj);
14
- let tP = select(filtered - original, vec3f(0.0), uj);
15
- me = vec4f(foreground.rgb * scale + tP, foreground.a);
11
+ let uq = abs(original) > vec3f(0.000001);
12
+ let ap = select(vec3f(1.0), original, uq);
13
+ let scale = select(vec3f(1.0), filtered / ap, uq);
14
+ let tU = select(filtered - original, vec3f(0.0), uq);
15
+ mh = vec4f(foreground.rgb * scale + tU, foreground.a);
16
16
 
17
- mc = vec4f(background.rgb * scale + tP * background.a, background.a);
17
+ mg = vec4f(background.rgb * scale + tU * background.a, background.a);
18
18
  }
19
- output.foreground = me;
20
- output.background = mc;
19
+ output.foreground = mh;
20
+ output.background = mg;
21
21
  `;
22
22
  /** Custom output alpha is ignored; retain the input composition's coverage. */
23
23
  export const customDenoiseCoverageMain = /* wgsl */ `
@@ -10,9 +10,9 @@ 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 = hz(uv);
13
+ var ray = hy(uv);
14
14
  let eye = cameraUniform.viewInv[3].xyz;
15
- let nV = -normalize(cameraUniform.viewInv[2].xyz);
15
+ let nY = -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
  eT(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex);
26
26
  if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {
27
- outColor[index] = vec4f(max(dot(si.position - eye, nV), 0.0), 0.0, 0.0, 0.0);
27
+ outColor[index] = vec4f(max(dot(si.position - eye, nY), 0.0), 0.0, 0.0, 0.0);
28
28
  return;
29
29
  }
30
30
  ray.o = si.position + ray.d * (EPS * 0.02);
@@ -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) uc: vec3u) {
31
- let tile = uc.x;
30
+ fn main(@builtin(global_invocation_id) ui: vec3u) {
31
+ let tile = ui.x;
32
32
  let tileCount = params.columns * params.rows;
33
33
  if (tile >= tileCount) {
34
34
  return;
@@ -36,16 +36,16 @@ return;
36
36
 
37
37
  let tileX = tile % params.columns;
38
38
  let tileY = tile / params.columns;
39
- let uh = tileX * params.tileSize;
40
- let ui = tileY * params.tileSize;
41
- let vX = min(uh + params.tileSize, params.width);
42
- let vY = min(ui + params.tileSize, params.height);
43
- var mL = 0.0;
44
- var iY = 0.0;
39
+ let un = tileX * params.tileSize;
40
+ let uo = tileY * params.tileSize;
41
+ let wd = min(un + params.tileSize, params.width);
42
+ let wf = min(uo + params.tileSize, params.height);
43
+ var mO = 0.0;
44
+ var ja = 0.0;
45
45
  var count = 0u;
46
46
 
47
- for (var y = ui; y < vY; y++) {
48
- for (var x = uh; x < vX; x++) {
47
+ for (var y = uo; y < wf; y++) {
48
+ for (var x = un; x < wd; x++) {
49
49
  let fM = y * params.width + x;
50
50
  let offset = fM * 4u;
51
51
  let samples = pilotMoments[offset + 3u];
@@ -60,28 +60,28 @@ pilotColor[offset + 2u]
60
60
  ),
61
61
  LUMINANCE
62
62
  ) / samples;
63
- let tv = pilotMoments[offset] / samples;
64
- let oV = max(tv - mean * mean, 0.0);
65
- var variance = oV;
63
+ let tD = pilotMoments[offset] / samples;
64
+ let oZ = max(tD - mean * mean, 0.0);
65
+ var variance = oZ;
66
66
  if (samples > 1.0) {
67
- variance = oV * samples / (samples - 1.0);
67
+ variance = oZ * samples / (samples - 1.0);
68
68
  }
69
- mL += mean;
70
- iY = max(iY, variance);
69
+ mO += mean;
70
+ ja = max(ja, variance);
71
71
  count += 1u;
72
72
  }
73
73
  }
74
74
 
75
- let mean = mL / f32(max(count, 1u));
76
- var oK = 0.0;
75
+ let mean = mO / f32(max(count, 1u));
76
+ var oO = 0.0;
77
77
  if (params.hasPrevious != 0u) {
78
- oK = previousVariance[tile];
78
+ oO = previousVariance[tile];
79
79
  }
80
- let rV = max(iY, oK);
81
- let sT = params.absoluteError + params.relativeError * abs(mean);
80
+ let sa = max(ja, oO);
81
+ let sY = params.absoluteError + params.relativeError * abs(mean);
82
82
  let required = ceil(
83
- params.confidence * params.confidence * rV /
84
- max(sT * sT, 1e-16)
83
+ params.confidence * params.confidence * sa /
84
+ max(sY * sY, 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] = iY;
94
+ tileVariances[tile] = ja;
95
95
  tileTargets[tile] = targetSamples;
96
96
 
97
- for (var y = ui; y < vY; y++) {
98
- for (var x = uh; x < vX; x++) {
97
+ for (var y = uo; y < wf; y++) {
98
+ for (var x = un; x < wd; x++) {
99
99
  textureStore(
100
100
  targetTexture,
101
101
  vec2i(i32(x), i32(y)),