@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
@@ -45,27 +45,27 @@ void main() {
45
45
  ivec2 p = ivec2(gl_FragCoord.xy);
46
46
  ivec2 size = rawGuideTexRegion();
47
47
  vec2 center = load_rawGuideTex(p, 0).xy;
48
- float lg = 0.0;
49
- float iX = 0.0;
50
- float mL = 0.0;
51
- float iR = 0.0;
48
+ float lk = 0.0;
49
+ float iY = 0.0;
50
+ float mO = 0.0;
51
+ float iS = 0.0;
52
52
  for (int dy = -1; dy <= 1; dy++) {
53
53
  for (int dx = -1; dx <= 1; dx++) {
54
54
  vec2 value = load_rawGuideTex(clamp(p + ivec2(dx, dy), ivec2(0), size - 1), 0).xy;
55
- mL += value.x;
56
- iR += value.x * value.x;
55
+ mO += value.x;
56
+ iS += value.x * value.x;
57
57
  if (value.y >= 0.0) {
58
- lg += value.y;
59
- iX += 1.0;
58
+ lk += value.y;
59
+ iY += 1.0;
60
60
  }
61
61
  }
62
62
  }
63
63
  float variance;
64
64
  if (center.y >= 0.0) {
65
- variance = lg / iX;
65
+ variance = lk / iY;
66
66
  } else {
67
- float lf = mL / 9.0;
68
- variance = max(iR / 9.0 - lf * lf, 0.0) * 9.0 / 8.0;
67
+ float lj = mO / 9.0;
68
+ variance = max(iS / 9.0 - lj * lj, 0.0) * 9.0 / 8.0;
69
69
  }
70
70
  out_guide = vec4(center.x, variance, 0.0, 1.0);
71
71
  }`
@@ -105,29 +105,29 @@ const filterFragment = new FragmentShader({
105
105
 
106
106
  ivec2 imageSize;
107
107
 
108
- vec2 nq(ivec2 p) {
108
+ vec2 nt(ivec2 p) {
109
109
  return load_guideTex(clamp(p, ivec2(0), imageSize - 1), 0).xy;
110
110
  }
111
111
 
112
112
 
113
- vec4 rv(ivec2 p) {
113
+ vec4 rD(ivec2 p) {
114
114
  vec4 c = load_colorTex(p, 0);
115
115
  if (decodeInput) c.rgb = pow(max(c.rgb, 0.0), vec3(2.2));
116
116
  return vec4(c.rgb * c.a, c.a);
117
117
  }
118
118
 
119
- float lk(ivec2 q, vec4 bs, vec3 gM) {
119
+ float ln(ivec2 q, vec4 bs, vec3 gO) {
120
120
  vec4 albedo = load_albedoTex(q, 0);
121
121
 
122
122
 
123
- vec3 oS = max((albedo.rgb + bs.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));
124
- vec3 kR = (albedo.rgb - bs.rgb) / oS;
125
- float iO = albedo.a - bs.a;
126
- vec3 lb = load_normalTex(q, 0).rgb - gM;
123
+ vec3 oW = max((albedo.rgb + bs.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));
124
+ vec3 kU = (albedo.rgb - bs.rgb) / oW;
125
+ float iP = albedo.a - bs.a;
126
+ vec3 le = load_normalTex(q, 0).rgb - gO;
127
127
  return max(
128
- dot(kR, kR) * INV_ALBEDO_BANDWIDTH2
129
- + iO * iO * INV_COVERAGE_BANDWIDTH2,
130
- dot(lb, lb) * INV_NORMAL_BANDWIDTH2
128
+ dot(kU, kU) * INV_ALBEDO_BANDWIDTH2
129
+ + iP * iP * INV_COVERAGE_BANDWIDTH2,
130
+ dot(le, le) * INV_NORMAL_BANDWIDTH2
131
131
  );
132
132
  }
133
133
 
@@ -136,37 +136,37 @@ imageSize = guideTexRegion();
136
136
  ivec2 p = ivec2(gl_FragCoord.xy);
137
137
  vec4 bs = load_albedoTex(p, 0);
138
138
  vec4 fw = load_normalTex(p, 0);
139
- vec3 gM = fw.rgb;
139
+ vec3 gO = fw.rgb;
140
140
 
141
141
 
142
142
  if (fw.a <= 0.0 && load_shadowCatcherTex(p, 0).r <= 0.0) {
143
- vec4 c = rv(p);
143
+ vec4 c = rD(p);
144
144
  vec3 rgb = c.rgb / max(c.a, 1e-6);
145
145
  if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));
146
146
  out_color = vec4(rgb, c.a);
147
- out_guide = vec4(nq(p), 0.0, 1.0);
147
+ out_guide = vec4(nt(p), 0.0, 1.0);
148
148
  return;
149
149
  }
150
150
 
151
- vec2 kT[PATCH_SIZE];
151
+ vec2 kW[PATCH_SIZE];
152
152
  int k = 0;
153
153
  for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
154
154
  for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
155
- kT[k] = nq(p + ivec2(dx, dy) * dilation);
155
+ kW[k] = nt(p + ivec2(dx, dy) * dilation);
156
156
  k++;
157
157
  }
158
158
  }
159
159
  float k2 = colorSensitivity * colorSensitivity;
160
160
 
161
161
  vec4 sum = vec4(0.0);
162
- vec3 gP = max(bs.rgb, vec3(${JNLM_ALBEDO_FLOOR}));
163
- vec3 mb = vec3(0.0);
164
- vec3 gs = vec3(0.0);
162
+ vec3 gR = max(bs.rgb, vec3(${JNLM_ALBEDO_FLOOR}));
163
+ vec3 mf = vec3(0.0);
164
+ vec3 gt = vec3(0.0);
165
165
  vec3 hn = vec3(0.0);
166
- float pg = 0.0;
167
- float gu = 0.0;
168
- float nH = 0.0;
169
- float kA = 0.0;
166
+ float pk = 0.0;
167
+ float gv = 0.0;
168
+ float nK = 0.0;
169
+ float kD = 0.0;
170
170
  for (int sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {
171
171
  for (int sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {
172
172
  ivec2 q = p + ivec2(sx, sy) * dilation;
@@ -174,17 +174,17 @@ if (
174
174
  (sx == 0 && sy == 0) ||
175
175
  q.x < 0 || q.y < 0 || q.x >= imageSize.x || q.y >= imageSize.y
176
176
  ) continue;
177
- float features = lk(q, bs, gM);
177
+ float features = ln(q, bs, gO);
178
178
  if (features > 16.0) continue;
179
179
 
180
180
  float fT = 0.0;
181
181
  k = 0;
182
182
  for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
183
183
  for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
184
- vec2 a = kT[k];
185
- vec2 b = nq(q + ivec2(dx, dy) * dilation);
186
- float qH = a.x - b.x;
187
- fT += (qH * qH
184
+ vec2 a = kW[k];
185
+ vec2 b = nt(q + ivec2(dx, dy) * dilation);
186
+ float qL = a.x - b.x;
187
+ fT += (qL * qL
188
188
  - VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))
189
189
  / (1e-10 + k2 * (a.y + b.y));
190
190
  k++;
@@ -193,49 +193,49 @@ k++;
193
193
  fT /= float(PATCH_SIZE);
194
194
 
195
195
  float weight = exp(-max(max(fT, 0.0), features));
196
- vec2 g = nq(q);
196
+ vec2 g = nt(q);
197
197
 
198
- vec3 a = (load_albedoTex(q, 0).rgb - bs.rgb) / gP;
199
- vec4 value = rv(q);
198
+ vec3 a = (load_albedoTex(q, 0).rgb - bs.rgb) / gR;
199
+ vec4 value = rD(q);
200
200
  sum += value * weight;
201
- mb += a * weight;
202
- gs += a * a * weight;
201
+ mf += a * weight;
202
+ gt += a * a * weight;
203
203
  hn += a * value.rgb * weight;
204
- pg += g.x * weight;
205
- gu += g.y * weight * weight;
206
- nH += weight;
207
- kA = max(kA, weight);
204
+ pk += g.x * weight;
205
+ gv += g.y * weight * weight;
206
+ nK += weight;
207
+ kD = max(kD, weight);
208
208
  }
209
209
  }
210
210
 
211
211
 
212
212
 
213
- vec4 center = rv(p);
214
- vec2 kS = nq(p);
215
- float dF = max(kA, CENTER_WEIGHT_MIN);
216
- float totalWeight = nH + dF;
213
+ vec4 center = rD(p);
214
+ vec2 kV = nt(p);
215
+ float dF = max(kD, CENTER_WEIGHT_MIN);
216
+ float totalWeight = nK + dF;
217
217
  vec4 mean = (sum + center * dF) / totalWeight;
218
218
 
219
219
 
220
- vec3 ez = mb / totalWeight;
221
- vec3 ll = max(gs / totalWeight - ez * ez, vec3(0.0));
222
- vec3 qi = hn / totalWeight - ez * mean.rgb;
220
+ vec3 ez = mf / totalWeight;
221
+ vec3 lo = max(gt / totalWeight - ez * ez, vec3(0.0));
222
+ vec3 qm = hn / totalWeight - ez * mean.rgb;
223
223
 
224
224
 
225
225
 
226
- vec3 qs = bs.rgb + ez * gP;
227
- vec3 ol = mean.rgb * gP / max(qs, vec3(${JNLM_ALBEDO_FLOOR}));
228
- vec3 vk = clamp(qi / (ll + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), ol);
229
- vec3 rn = mean.rgb - vk * ez;
230
- vec4 filtered = vec4(max(rn, vec3(0.0)), max(mean.a, 0.0));
226
+ vec3 qw = bs.rgb + ez * gR;
227
+ vec3 oq = mean.rgb * gR / max(qw, vec3(${JNLM_ALBEDO_FLOOR}));
228
+ vec3 vs = clamp(qm / (lo + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), oq);
229
+ vec3 rs = mean.rgb - vs * ez;
230
+ vec4 filtered = vec4(max(rs, vec3(0.0)), max(mean.a, 0.0));
231
231
  vec3 rgb = filtered.a > 1e-6
232
232
  ? filtered.rgb / max(filtered.a, 1e-6)
233
233
  : center.rgb / max(center.a, 1e-6);
234
234
  if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));
235
235
  out_color = vec4(rgb, filtered.a);
236
236
  out_guide = vec4(
237
- (pg + kS.x * dF) / totalWeight,
238
- (gu + kS.y * dF * dF)
237
+ (pk + kV.x * dF) / totalWeight,
238
+ (gv + kV.y * dF * dF)
239
239
  / (totalWeight * totalWeight),
240
240
  0.0,
241
241
  1.0
@@ -42,11 +42,11 @@ vec4 mask = sample_shadowCatcherTex(v_Texcoord);
42
42
  vec4 background = sample_catcherBackgroundTex(v_Texcoord);
43
43
  float hit = sample_albedoTex(v_Texcoord).a;
44
44
 
45
- float pW = max(sample_normalTex(v_Texcoord).a, 1.0) / sampleCount;
46
- float iP = max(hit - mask.b * pW, 0.0);
45
+ float qa = max(sample_normalTex(v_Texcoord).a, 1.0) / sampleCount;
46
+ float iQ = max(hit - mask.b * qa, 0.0);
47
47
  out_foreground = vec4(
48
- (light.rgb - background.rgb * pW)
49
- / (iP > 0.0 ? iP : sampleCount),
48
+ (light.rgb - background.rgb * qa)
49
+ / (iQ > 0.0 ? iQ : sampleCount),
50
50
  clamp((light.a - background.a) / sampleCount, 0.0, 1.0)
51
51
  );
52
52
  out_catcherBackground = background / sampleCount;
@@ -397,7 +397,9 @@ class WebGLRayTracePass {
397
397
  _updateMeshData() {
398
398
  this._pendingGeometryUpdates.clear();
399
399
  this._needsUpdateMeshData = false;
400
- const res = updateMeshInstances(this._meshes);
400
+ // GLSL intersects the original triangles, so its BVH must bound those
401
+ // triangles rather than WebGPU's displaced height prisms.
402
+ const res = updateMeshInstances(this._meshes, { displacement: false });
401
403
  this._preparedMeshData = res;
402
404
  this._membershipCache.capture(res);
403
405
  this._pendingMembershipData = undefined;