@meimu/mutracer 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +1425 -1421
- package/docs/api.md +2 -1
- package/docs/materials.md +17 -26
- package/docs/threejs.md +5 -5
- package/docs/viewer.md +36 -3
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
- package/lib/renderer/WGPURayTraceOutput.js +4 -4
- package/lib/renderer/WGPURayTracePass.js +5 -3
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +7 -7
- package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
- package/lib/renderer/WebGLRayTracePass.js +1 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
- package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
- package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/rayTrace.frag.js +67 -67
- package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
- package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
- package/lib/renderer/scratchSampling.js +16 -16
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
- package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
- package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -94,20 +94,20 @@ bS: ptr<function, f32>
|
|
|
94
94
|
*bS = -INF;
|
|
95
95
|
|
|
96
96
|
let wd = maxDimension(abs(iO));
|
|
97
|
-
let
|
|
97
|
+
let gQ = mu(iO, wd);
|
|
98
98
|
var tt: f32;
|
|
99
99
|
|
|
100
|
-
tt =
|
|
100
|
+
tt = fM(
|
|
101
101
|
pP, iO,
|
|
102
|
-
|
|
102
|
+
fB(pC, pB, pA), wd, gQ, INF
|
|
103
103
|
).t;
|
|
104
104
|
if (tt > 0.0) {
|
|
105
105
|
*bT = min(*bT, tt);
|
|
106
106
|
*bS = max(*bS, tt);
|
|
107
107
|
}
|
|
108
|
-
tt =
|
|
108
|
+
tt = fM(
|
|
109
109
|
pP, iO,
|
|
110
|
-
|
|
110
|
+
fB(pD, pE, pF), wd, gQ, INF
|
|
111
111
|
).t;
|
|
112
112
|
if (tt > 0.0) {
|
|
113
113
|
*bT = min(*bT, tt);
|
|
@@ -145,7 +145,7 @@ export default /* wgsl */ `
|
|
|
145
145
|
|
|
146
146
|
${displacementCommon}
|
|
147
147
|
|
|
148
|
-
fn
|
|
148
|
+
fn lP(p: vec3f, p0: vec3f, p1: vec3f, p2: vec3f) -> vec3f {
|
|
149
149
|
let v0 = p1 - p0;
|
|
150
150
|
let v1 = p2 - p0;
|
|
151
151
|
let v2 = p - p0;
|
|
@@ -265,7 +265,7 @@ var step = 0;
|
|
|
265
265
|
|
|
266
266
|
while (true) {
|
|
267
267
|
|
|
268
|
-
let b =
|
|
268
|
+
let b = lP(s, c0, c1, c2);
|
|
269
269
|
|
|
270
270
|
tF = _pA * b.x + _pB * b.y + _pC * b.z;
|
|
271
271
|
|
|
@@ -274,7 +274,7 @@ tS = distance(tF, s);
|
|
|
274
274
|
var uv: vec2f;
|
|
275
275
|
if (uvProjection > 0) {
|
|
276
276
|
let n = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
|
|
277
|
-
uv =
|
|
277
|
+
uv = gI(uvProjection, tF - (_nA * b.x + _nB * b.y + _nC * b.z) * uJ, n) * uvScale;
|
|
278
278
|
}
|
|
279
279
|
else {
|
|
280
280
|
uv = vG * b.x + vH * b.y + vI * b.z;
|
|
@@ -309,7 +309,7 @@ let dtt = dt * (abs(qZ) / (abs(pY) + abs(qZ) + EPS));
|
|
|
309
309
|
t = t - dtt;
|
|
310
310
|
|
|
311
311
|
let wO = qr + qM * t;
|
|
312
|
-
let b =
|
|
312
|
+
let b = lP(wO, c0, c1, c2);
|
|
313
313
|
|
|
314
314
|
let N = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
|
|
315
315
|
|
|
@@ -325,9 +325,9 @@ if (uvProjection > 0) {
|
|
|
325
325
|
let NA = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
|
|
326
326
|
let NB = normalize(_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx));
|
|
327
327
|
let NC = normalize(_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby));
|
|
328
|
-
wg =
|
|
329
|
-
wh =
|
|
330
|
-
wi =
|
|
328
|
+
wg = gI(uvProjection, p_a - (_nA * b.x + _nB * b.y + _nC * b.z) * uJ, NA) * uvScale;
|
|
329
|
+
wh = gI(uvProjection, p_b - (_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx)) * uJ, NB) * uvScale;
|
|
330
|
+
wi = gI(uvProjection, p_c - (_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby)) * uJ, NC) * uvScale;
|
|
331
331
|
}
|
|
332
332
|
else {
|
|
333
333
|
wg = vG * b.x + vH * b.y + vI * b.z;
|
|
@@ -282,11 +282,11 @@ return packed[ls % 4];
|
|
|
282
282
|
|
|
283
283
|
fn kR(dV: i32, uv: vec2f) -> f32 {
|
|
284
284
|
if (dV < 0) { return 1.0; }
|
|
285
|
-
let
|
|
286
|
-
let x0 = i32(floor(
|
|
287
|
-
let y0 = i32(floor(
|
|
288
|
-
let fx = fract(
|
|
289
|
-
let fy = fract(
|
|
285
|
+
let fQ = fract(uv) * 128.0 - vec2f(0.5);
|
|
286
|
+
let x0 = i32(floor(fQ.x));
|
|
287
|
+
let y0 = i32(floor(fQ.y));
|
|
288
|
+
let fx = fract(fQ.x);
|
|
289
|
+
let fy = fract(fQ.y);
|
|
290
290
|
let xa = select(x0, 127, x0 < 0);
|
|
291
291
|
let xb = select(x0 + 1, 0, x0 >= 127);
|
|
292
292
|
let ya = select(y0, 127, y0 < 0);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE, LIGHT_CHOICE_ENVIRONMENT } from '../../lightSampling.js';
|
|
2
2
|
export default /*wgsl */ `
|
|
3
|
-
fn eM(light: Light,
|
|
4
|
-
let iw = light.position -
|
|
3
|
+
fn eM(light: Light, ft: vec3f, iZ: vec2f, lightSample: ptr<function, LightSampleRec>) {
|
|
4
|
+
let iw = light.position - ft;
|
|
5
5
|
let aj = length(iw);
|
|
6
6
|
if (light.radiusOrSpread <= 0.0) {
|
|
7
7
|
|
|
@@ -27,13 +27,13 @@ return;
|
|
|
27
27
|
}
|
|
28
28
|
let radius = max(light.radiusOrSpread, 1e-6);
|
|
29
29
|
(*lightSample).isDelta = false;
|
|
30
|
-
var
|
|
30
|
+
var gK: vec3f;
|
|
31
31
|
|
|
32
32
|
if (aj <= radius) {
|
|
33
33
|
let z = 1.0 - 2.0 * iZ.x;
|
|
34
34
|
let fl = sqrt(max(0.0, 1.0 - z * z));
|
|
35
35
|
let br = TWOPI * iZ.y;
|
|
36
|
-
|
|
36
|
+
gK = vec3f(
|
|
37
37
|
fl * cos(br),
|
|
38
38
|
fl * sin(br),
|
|
39
39
|
z
|
|
@@ -53,7 +53,7 @@ let br = TWOPI * iZ.y;
|
|
|
53
53
|
var tangent: vec3f;
|
|
54
54
|
var bitangent: vec3f;
|
|
55
55
|
aL(sS, &tangent, &bitangent);
|
|
56
|
-
|
|
56
|
+
gK = sS * cc
|
|
57
57
|
+ tangent * (sinTheta * cos(br))
|
|
58
58
|
+ bitangent * (sinTheta * sin(br));
|
|
59
59
|
(*lightSample).pdf = 1.0 / max(
|
|
@@ -62,15 +62,15 @@ TWOPI * (1.0 - cosThetaMax),
|
|
|
62
62
|
);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
let iz = dot(
|
|
65
|
+
let iz = dot(gK, iw);
|
|
66
66
|
let qc = dot(iw, iw);
|
|
67
67
|
let ej = iz * iz
|
|
68
68
|
- qc + radius * radius;
|
|
69
69
|
let cN = iz - sqrt(max(0.0, ej));
|
|
70
70
|
let cC = iz + sqrt(max(0.0, ej));
|
|
71
71
|
(*lightSample).dist = select(cC, cN, cN > 1e-6);
|
|
72
|
-
(*lightSample).direction =
|
|
73
|
-
let sd =
|
|
72
|
+
(*lightSample).direction = gK;
|
|
73
|
+
let sd = ft + gK * (*lightSample).dist;
|
|
74
74
|
(*lightSample).normal = normalize(sd - light.position);
|
|
75
75
|
(*lightSample).emission = light.emission;
|
|
76
76
|
}
|
|
@@ -105,8 +105,8 @@ let lowerLeft = light.position - 0.5 * (light.u + light.v);
|
|
|
105
105
|
let spread = clamp(light.radiusOrSpread, 0.0, 1.0);
|
|
106
106
|
|
|
107
107
|
if (spread <= 0.001) {
|
|
108
|
-
let
|
|
109
|
-
let surfacePoint = shadingPoint - normal *
|
|
108
|
+
let gg = dot(normal, shadingPoint - light.position);
|
|
109
|
+
let surfacePoint = shadingPoint - normal * gg;
|
|
110
110
|
let ib = surfacePoint - lowerLeft;
|
|
111
111
|
let width = length(light.u);
|
|
112
112
|
let height = length(light.v);
|
|
@@ -114,13 +114,13 @@ let uv = vec2f(
|
|
|
114
114
|
dot(ib, light.u / width) / width,
|
|
115
115
|
dot(ib, light.v / height) / height
|
|
116
116
|
);
|
|
117
|
-
if (
|
|
117
|
+
if (gg <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
|
|
118
118
|
(*result).emission = vec3f(0.0);
|
|
119
119
|
(*result).pdf = 0.0;
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
122
|
(*result).direction = -normal;
|
|
123
|
-
(*result).dist =
|
|
123
|
+
(*result).dist = gg;
|
|
124
124
|
(*result).normal = normal;
|
|
125
125
|
(*result).emission = light.emission;
|
|
126
126
|
(*result).pdf = 1.0;
|
|
@@ -137,19 +137,19 @@ let hq = dot(offset, offset);
|
|
|
137
137
|
(*result).dist = sqrt(hq);
|
|
138
138
|
(*result).direction = offset / (*result).dist;
|
|
139
139
|
(*result).normal = normal;
|
|
140
|
-
let
|
|
141
|
-
let
|
|
142
|
-
if (
|
|
140
|
+
let ga = dot(-(*result).direction, normal);
|
|
141
|
+
let oN = cos(0.5 * PI * spread);
|
|
142
|
+
if (ga <= 0.0 || ga < oN) {
|
|
143
143
|
(*result).emission = vec3f(0.0);
|
|
144
144
|
(*result).pdf = 0.0;
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
147
|
(*result).emission = light.emission;
|
|
148
|
-
(*result).pdf = hq / max(light.area *
|
|
148
|
+
(*result).pdf = hq / max(light.area * ga, 1e-8);
|
|
149
149
|
da(light, surfacePoint, lowerLeft, result);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
fn
|
|
152
|
+
fn gd(
|
|
153
153
|
light: Light,
|
|
154
154
|
result: ptr<function, LightSampleRec>
|
|
155
155
|
) {
|
|
@@ -193,13 +193,13 @@ jT(light, shadingPoint, samplePoint, result);
|
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
195
195
|
if (dP == DIRECTIONAL_LIGHT) {
|
|
196
|
-
|
|
196
|
+
gd(light, result);
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
fn
|
|
200
|
+
fn mG(iZ: vec2f, lightSample: ptr<function, LightSampleRec>) {
|
|
201
201
|
var uv: vec2f;
|
|
202
|
-
(*lightSample).direction =
|
|
202
|
+
(*lightSample).direction = oL(iZ, &uv, &(*lightSample).pdf);
|
|
203
203
|
(*lightSample).emission = textureLinear(envMap, uv).rgb;
|
|
204
204
|
(*lightSample).dist = INF;
|
|
205
205
|
}
|
|
@@ -240,11 +240,11 @@ bitcast<i32>(data.w)
|
|
|
240
240
|
);
|
|
241
241
|
}
|
|
242
242
|
|
|
243
|
-
fn jB(
|
|
244
|
-
return sp(
|
|
243
|
+
fn jB(nd: i32, index: i32) -> pe {
|
|
244
|
+
return sp(nd + index);
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
-
fn
|
|
247
|
+
fn mS(
|
|
248
248
|
rnd: vec3f,
|
|
249
249
|
ca: u32,
|
|
250
250
|
aV: u32
|
|
@@ -256,9 +256,9 @@ f32(count);
|
|
|
256
256
|
return sU;
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
-
fn
|
|
259
|
+
fn lW(
|
|
260
260
|
triangle: EmissiveTriangle,
|
|
261
|
-
|
|
261
|
+
ft: vec3f,
|
|
262
262
|
iZ: vec2f,
|
|
263
263
|
lightSample: ptr<function, LightSampleRec>
|
|
264
264
|
) {
|
|
@@ -281,7 +281,7 @@ barycentric.x * triangle.secondaryUv0 +
|
|
|
281
281
|
barycentric.y * triangle.secondaryUv1 +
|
|
282
282
|
barycentric.z * triangle.secondaryUv2;
|
|
283
283
|
let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));
|
|
284
|
-
(*lightSample).direction = sZ -
|
|
284
|
+
(*lightSample).direction = sZ - ft;
|
|
285
285
|
(*lightSample).dist = length((*lightSample).direction);
|
|
286
286
|
if ((*lightSample).dist <= EPS) {
|
|
287
287
|
(*lightSample).emission = vec3f(0.0);
|
|
@@ -296,7 +296,7 @@ if (pm <= 0.0) {
|
|
|
296
296
|
(*lightSample).pdf = 0.0;
|
|
297
297
|
return;
|
|
298
298
|
}
|
|
299
|
-
(*lightSample).emission =
|
|
299
|
+
(*lightSample).emission = lN(
|
|
300
300
|
i32(triangle.materialIndex), uv, cX
|
|
301
301
|
);
|
|
302
302
|
(*lightSample).selectionPmf = triangle.selectionPmf;
|
|
@@ -306,11 +306,11 @@ max(triangle.area * pm, 1e-8);
|
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
fn ki(
|
|
309
|
-
|
|
309
|
+
ft: vec3f,
|
|
310
310
|
rnd: vec3f,
|
|
311
|
-
|
|
311
|
+
nd: i32,
|
|
312
312
|
pl: i32,
|
|
313
|
-
|
|
313
|
+
mZ: f32,
|
|
314
314
|
lightSample: ptr<function, LightSampleRec>
|
|
315
315
|
) {
|
|
316
316
|
(*lightSample).emission = vec3f(0.0);
|
|
@@ -326,17 +326,17 @@ return;
|
|
|
326
326
|
|
|
327
327
|
let rj = rnd.z * f32(pl);
|
|
328
328
|
let column = min(i32(rj), pl - 1);
|
|
329
|
-
let qS = jB(
|
|
329
|
+
let qS = jB(nd, column);
|
|
330
330
|
let lc = select(
|
|
331
331
|
qS.aliasIndex,
|
|
332
332
|
column,
|
|
333
333
|
fract(rj) < qS.probability
|
|
334
334
|
);
|
|
335
|
-
let pk = jB(
|
|
335
|
+
let pk = jB(nd, lc);
|
|
336
336
|
if (pk.sourceType == ${LIGHT_CHOICE_ENVIRONMENT}) {
|
|
337
337
|
(*lightSample).sourceType = 0u;
|
|
338
338
|
(*lightSample).sourceIndex = u32(pk.sourceIndex);
|
|
339
|
-
|
|
339
|
+
mG(rnd.xy, lightSample);
|
|
340
340
|
(*lightSample).selectionPmf = rtUniform.envLightPmf;
|
|
341
341
|
(*lightSample).pdf *= rtUniform.envLightPmf;
|
|
342
342
|
}
|
|
@@ -344,32 +344,32 @@ else if (pk.sourceType == ${LIGHT_CHOICE_ANALYTIC}) {
|
|
|
344
344
|
(*lightSample).sourceType = 2u;
|
|
345
345
|
(*lightSample).sourceIndex = u32(pk.sourceIndex);
|
|
346
346
|
let light = analyticLights[pk.sourceIndex];
|
|
347
|
-
iQ(light,
|
|
347
|
+
iQ(light, ft, rnd.xy, lightSample);
|
|
348
348
|
(*lightSample).selectionPmf = light.selectionPmf;
|
|
349
349
|
(*lightSample).pdf *= light.selectionPmf;
|
|
350
350
|
}
|
|
351
351
|
else if (pk.sourceType == ${LIGHT_CHOICE_EMISSIVE_TRIANGLE}) {
|
|
352
352
|
(*lightSample).sourceType = 1u;
|
|
353
353
|
(*lightSample).sourceIndex = u32(pk.sourceIndex);
|
|
354
|
-
|
|
354
|
+
lW(
|
|
355
355
|
qd(pk.sourceIndex),
|
|
356
|
-
|
|
356
|
+
ft,
|
|
357
357
|
rnd.xy,
|
|
358
358
|
lightSample
|
|
359
359
|
);
|
|
360
360
|
}
|
|
361
|
-
(*lightSample).selectionPmf *=
|
|
362
|
-
(*lightSample).pdf *=
|
|
361
|
+
(*lightSample).selectionPmf *= mZ;
|
|
362
|
+
(*lightSample).pdf *= mZ;
|
|
363
363
|
}
|
|
364
364
|
|
|
365
365
|
fn sampleLight(
|
|
366
|
-
|
|
366
|
+
ft: vec3f,
|
|
367
367
|
rnd: vec3f,
|
|
368
368
|
lightSample: ptr<function, LightSampleRec>,
|
|
369
369
|
sc: bool
|
|
370
370
|
) {
|
|
371
371
|
ki(
|
|
372
|
-
|
|
372
|
+
ft,
|
|
373
373
|
rnd,
|
|
374
374
|
0,
|
|
375
375
|
rtUniform.lightChoiceCount,
|
|
@@ -380,16 +380,16 @@ lightSample
|
|
|
380
380
|
|
|
381
381
|
|
|
382
382
|
|
|
383
|
-
fn
|
|
384
|
-
|
|
383
|
+
fn mH(
|
|
384
|
+
ft: vec3f,
|
|
385
385
|
rnd: vec3f,
|
|
386
386
|
ca: u32,
|
|
387
387
|
aV: u32,
|
|
388
388
|
lightSample: ptr<function, LightSampleRec>
|
|
389
389
|
) {
|
|
390
390
|
ki(
|
|
391
|
-
|
|
392
|
-
|
|
391
|
+
ft,
|
|
392
|
+
mS(rnd, ca, aV),
|
|
393
393
|
0,
|
|
394
394
|
rtUniform.lightChoiceCount,
|
|
395
395
|
1.0,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
export function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
|
|
5
5
|
return /* wgsl */ `
|
|
6
6
|
|
|
7
|
-
struct
|
|
7
|
+
struct ne {
|
|
8
8
|
ray: Ray,
|
|
9
9
|
maxDistance: f32,
|
|
10
10
|
triangleIndex: i32,
|
|
@@ -22,18 +22,18 @@ ma: J,
|
|
|
22
22
|
prepared: ag,
|
|
23
23
|
aa: ptr<function, Path>,
|
|
24
24
|
ffnormal: vec3f,
|
|
25
|
-
|
|
25
|
+
gF: bool,
|
|
26
26
|
ca: u32,
|
|
27
27
|
aV: u32,
|
|
28
|
-
|
|
28
|
+
gj: ptr<function, ne>
|
|
29
29
|
) -> bool {
|
|
30
|
-
(*
|
|
31
|
-
(*
|
|
32
|
-
(*
|
|
33
|
-
let ln = vec3f(
|
|
30
|
+
(*gj).valid = false;
|
|
31
|
+
(*gj).lightSelectionPmf = 0.0;
|
|
32
|
+
(*gj).risTarget = 0.0;
|
|
33
|
+
let ln = vec3f(fp(rd(ca, 1u)), dz(rd(ca, 0u)));
|
|
34
34
|
|
|
35
35
|
var lightSample: LightSampleRec;
|
|
36
|
-
|
|
36
|
+
mH(
|
|
37
37
|
(*si).position,
|
|
38
38
|
ln,
|
|
39
39
|
ca,
|
|
@@ -43,13 +43,13 @@ aV,
|
|
|
43
43
|
var Li = lightSample.emission;
|
|
44
44
|
|
|
45
45
|
let lightDir = lightSample.direction;
|
|
46
|
-
let
|
|
46
|
+
let oS = -(*aa).ray.d;
|
|
47
47
|
let fg = lightSample.pdf;
|
|
48
48
|
let lightSelectionPmf = lightSample.selectionPmf;
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
${hasCoatNormals ? /* wgsl */ `var cosThetaL = dot(ffnormal, lightDir);
|
|
52
|
-
if (
|
|
52
|
+
if (gF && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}
|
|
53
53
|
|
|
54
54
|
if (fg <= 0.0 || lightSelectionPmf <= 0.0 ||
|
|
55
55
|
max(max(Li.x, Li.y), Li.z) <= 0.0) {
|
|
@@ -58,7 +58,7 @@ return false;
|
|
|
58
58
|
|
|
59
59
|
var scatteringPdf = 0.0;
|
|
60
60
|
var f = vec3f(0.0);
|
|
61
|
-
if (
|
|
61
|
+
if (gF) {
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
if (cosThetaL <= 0.0 && ma.transmissionWeight <= 0.0 && ma.subsurfaceWeight <= 0.0) {
|
|
@@ -68,7 +68,7 @@ f = bI(prepared, lightDir, &scatteringPdf);
|
|
|
68
68
|
}
|
|
69
69
|
else {
|
|
70
70
|
scatteringPdf = bD(
|
|
71
|
-
dot(
|
|
71
|
+
dot(oS, lightDir),
|
|
72
72
|
(*si).mediumAnisotropy
|
|
73
73
|
);
|
|
74
74
|
f = vec3f(scatteringPdf);
|
|
@@ -78,9 +78,9 @@ if (scatteringPdf <= 0.0 || max(max(f.x, f.y), f.z) <= 0.0) {
|
|
|
78
78
|
return false;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
var
|
|
81
|
+
var mz: Ray;
|
|
82
82
|
var hi = (*si).position + EPS * lightDir;
|
|
83
|
-
if (
|
|
83
|
+
if (gF) {
|
|
84
84
|
hi = rQ((*si).position, (*si).faceNormal, lightDir);
|
|
85
85
|
let bZ = 0.1;
|
|
86
86
|
var dr = dot((*si).normal, lightDir);
|
|
@@ -92,7 +92,7 @@ dr < 0.0
|
|
|
92
92
|
);
|
|
93
93
|
dr = abs(dr);
|
|
94
94
|
let hS = dot(geometricNormal, lightDir);
|
|
95
|
-
let
|
|
95
|
+
let oB = select(
|
|
96
96
|
clamp(1.0 - hS / bZ, 0.0, 1.0),
|
|
97
97
|
clamp(
|
|
98
98
|
2.0 - (hS + dr) / bZ,
|
|
@@ -101,29 +101,29 @@ clamp(
|
|
|
101
101
|
),
|
|
102
102
|
dr < bZ
|
|
103
103
|
);
|
|
104
|
-
hi += (*si).shadowOffset *
|
|
104
|
+
hi += (*si).shadowOffset * oB;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
var
|
|
111
|
-
var
|
|
110
|
+
var lQ = lightDir;
|
|
111
|
+
var mO = lightSample.dist - EPS;
|
|
112
112
|
if (lightSample.sourceType == 1u) {
|
|
113
113
|
let sY =
|
|
114
114
|
(*si).position + lightSample.direction * lightSample.dist;
|
|
115
115
|
let qe = sY + EPS * lightSample.normal;
|
|
116
116
|
let qp = qe - hi;
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
mO = length(qp);
|
|
118
|
+
lQ = normalize(qp);
|
|
119
119
|
}
|
|
120
|
-
iC(&
|
|
120
|
+
iC(&mz, hi, lQ);
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
|
|
125
|
-
if (
|
|
126
|
-
let background = hH(
|
|
125
|
+
if (gF && cosThetaL < 0.0 && lightSample.sourceType == 0u) {
|
|
126
|
+
let background = hH(mz);
|
|
127
127
|
Li = background.rgb * background.a;
|
|
128
128
|
}
|
|
129
129
|
if (SPECTRAL) {
|
|
@@ -139,40 +139,40 @@ lightSample.isDelta
|
|
|
139
139
|
);
|
|
140
140
|
if (fa > 0.0) {
|
|
141
141
|
let kq = Li * f / fg * (*aa).beta;
|
|
142
|
-
(*
|
|
142
|
+
(*gj).risTarget = max(
|
|
143
143
|
dot(max(kq * lightSelectionPmf, vec3f(0.0)), luminance),
|
|
144
144
|
0.0
|
|
145
145
|
);
|
|
146
|
-
(*
|
|
147
|
-
(*
|
|
148
|
-
(*
|
|
149
|
-
(*
|
|
150
|
-
(*
|
|
151
|
-
(*
|
|
146
|
+
(*gj).ray = mz;
|
|
147
|
+
(*gj).maxDistance = mO;
|
|
148
|
+
(*gj).triangleIndex = (*si).triangleIndex;
|
|
149
|
+
(*gj).contribution = fa * kq;
|
|
150
|
+
(*gj).lightSelectionPmf = lightSelectionPmf;
|
|
151
|
+
(*gj).valid = true;
|
|
152
152
|
return true;
|
|
153
153
|
}
|
|
154
154
|
return false;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
fn
|
|
157
|
+
fn mT(
|
|
158
158
|
si: ptr<function, ad>,
|
|
159
159
|
ma: J,
|
|
160
160
|
prepared: ag,
|
|
161
161
|
aa: ptr<function, Path>,
|
|
162
162
|
ffnormal: vec3f,
|
|
163
|
-
|
|
163
|
+
gF: bool
|
|
164
164
|
) {
|
|
165
165
|
let aV = jX();
|
|
166
|
-
var selected:
|
|
166
|
+
var selected: ne;
|
|
167
167
|
selected.valid = false;
|
|
168
|
-
var
|
|
169
|
-
var
|
|
168
|
+
var mI = 0.0;
|
|
169
|
+
var lH = 0.0;
|
|
170
170
|
|
|
171
171
|
|
|
172
172
|
for (var ca = 0u; ca < aV; ca++) {
|
|
173
|
-
var candidate:
|
|
173
|
+
var candidate: ne;
|
|
174
174
|
let pj = qq(
|
|
175
|
-
si, ma, prepared, aa, ffnormal,
|
|
175
|
+
si, ma, prepared, aa, ffnormal, gF,
|
|
176
176
|
ca, aV, &candidate);
|
|
177
177
|
if (aV == 1u) {
|
|
178
178
|
if (!pj) { return; }
|
|
@@ -182,20 +182,20 @@ break;
|
|
|
182
182
|
if (!pj) { continue; }
|
|
183
183
|
let kj = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
|
|
184
184
|
if (!(kj > 0.0) || kj != kj) { continue; }
|
|
185
|
-
|
|
185
|
+
lH += kj;
|
|
186
186
|
if (!selected.valid ||
|
|
187
|
-
pK(ca) *
|
|
187
|
+
pK(ca) * lH <= kj) {
|
|
188
188
|
selected = candidate;
|
|
189
|
-
|
|
189
|
+
mI = candidate.risTarget;
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
var qP = 1.0;
|
|
193
193
|
if (aV > 1u) {
|
|
194
|
-
if (!selected.valid ||
|
|
194
|
+
if (!selected.valid || mI <= 0.0) { return; }
|
|
195
195
|
|
|
196
196
|
|
|
197
|
-
qP = selected.lightSelectionPmf *
|
|
198
|
-
(f32(aV) *
|
|
197
|
+
qP = selected.lightSelectionPmf * lH /
|
|
198
|
+
(f32(aV) * mI);
|
|
199
199
|
}
|
|
200
200
|
if (selected.valid &&
|
|
201
201
|
!ex(selected.ray, selected.maxDistance, selected.triangleIndex)) {
|
|
@@ -222,13 +222,13 @@ return 1.0;
|
|
|
222
222
|
let rY = distance((*si).position, (*aa).ray.o);
|
|
223
223
|
let fg = samplingLuminance / rtUniform.lightWeightTotal *
|
|
224
224
|
rY * rY / max(pm, 1e-8);
|
|
225
|
-
return
|
|
225
|
+
return fX((*aa).scatteringPdf, fg);
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
${hasCoatNormals ? /* wgsl */ `
|
|
229
229
|
|
|
230
230
|
|
|
231
|
-
fn
|
|
231
|
+
fn fF(input: vec3f, tq: vec3f, view: vec3f) -> vec3f {
|
|
232
232
|
let qY = dot(tq, view) >= 0.0;
|
|
233
233
|
let uo = select(-tq, tq, qY);
|
|
234
234
|
let qX = select(-input, input, qY);
|
|
@@ -236,14 +236,14 @@ if (dot(input, tq) <= 0.0 || dot(qX, view) <= 1e-6) { return uo; }
|
|
|
236
236
|
return qX;
|
|
237
237
|
}
|
|
238
238
|
` : ''}
|
|
239
|
-
fn
|
|
239
|
+
fn mb(
|
|
240
240
|
si: ptr<function, ad>,
|
|
241
241
|
ma: ptr<function, J>,
|
|
242
242
|
aa: ptr<function, Path>
|
|
243
243
|
) {
|
|
244
244
|
${hasCoatNormals ? /* wgsl */ `
|
|
245
245
|
let bC = (*si).faceNormal;
|
|
246
|
-
let
|
|
246
|
+
let mE = (*si).normal;
|
|
247
247
|
` : ''}
|
|
248
248
|
var rN: f32 = -dot((*si).faceNormal, (*aa).ray.d);
|
|
249
249
|
var sG: f32 = -dot((*si).normal, (*aa).ray.d);
|
|
@@ -271,12 +271,12 @@ var ffnormal = select(-N, N, ndv >= 0.0);
|
|
|
271
271
|
${hasCoatNormals ? /* wgsl */ `
|
|
272
272
|
if ((*ma).coatNormalEnabled) {
|
|
273
273
|
let view = -(*aa).ray.d;
|
|
274
|
-
let
|
|
275
|
-
(*ma).geometricNormal = select(-bC, bC,
|
|
276
|
-
ffnormal =
|
|
277
|
-
(*ma).coatNormal =
|
|
278
|
-
(*ma).inside =
|
|
279
|
-
(*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor,
|
|
274
|
+
let gb = dot(bC, view);
|
|
275
|
+
(*ma).geometricNormal = select(-bC, bC, gb >= 0.0);
|
|
276
|
+
ffnormal = fF(mE, bC, view);
|
|
277
|
+
(*ma).coatNormal = fF((*si).coatNormal, bC, view);
|
|
278
|
+
(*ma).inside = gb <= 0.0 && !(*ma).thinWalled;
|
|
279
|
+
(*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, gb > 0.0 || (*ma).thinWalled);
|
|
280
280
|
}
|
|
281
281
|
` : ''}
|
|
282
282
|
|
|
@@ -290,36 +290,36 @@ var cG: vec3f;
|
|
|
290
290
|
|
|
291
291
|
if (HAS_MEDIUM) {
|
|
292
292
|
let d = distance((*si).position, (*aa).ray.o);
|
|
293
|
-
let
|
|
293
|
+
let nu = (*aa).ray.o;
|
|
294
294
|
let extinction = (*si).mediumExtinction;
|
|
295
295
|
let scattering = min((*si).mediumScattering, extinction);
|
|
296
296
|
let sC = max(max(extinction.x, extinction.y), extinction.z);
|
|
297
297
|
if (mediumType > 0 && sC > 0.0) {
|
|
298
298
|
|
|
299
299
|
|
|
300
|
-
let
|
|
301
|
-
let
|
|
300
|
+
let nj = min(i32(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
|
|
301
|
+
let fE = extinction[nj];
|
|
302
302
|
let ih = select(
|
|
303
303
|
d,
|
|
304
|
-
min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) /
|
|
305
|
-
|
|
304
|
+
min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fE, d),
|
|
305
|
+
fE > 0.0
|
|
306
306
|
);
|
|
307
307
|
bl = ih < d;
|
|
308
308
|
let ew = exp(-extinction * ih);
|
|
309
|
-
let
|
|
309
|
+
let nZ = select(
|
|
310
310
|
ew,
|
|
311
311
|
extinction * ew,
|
|
312
312
|
bl
|
|
313
313
|
);
|
|
314
|
-
let
|
|
314
|
+
let nK = max((nZ.x + nZ.y + nZ.z) / 3.0, 1e-8);
|
|
315
315
|
if (bl) {
|
|
316
|
-
(*aa).beta *= ew * scattering /
|
|
316
|
+
(*aa).beta *= ew * scattering / nK;
|
|
317
317
|
|
|
318
|
-
(*aa).ray.o =
|
|
318
|
+
(*aa).ray.o = nu + ih * (*aa).ray.d;
|
|
319
319
|
(*si).position = (*aa).ray.o;
|
|
320
320
|
}
|
|
321
321
|
else {
|
|
322
|
-
(*aa).beta *= ew /
|
|
322
|
+
(*aa).beta *= ew / nK;
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
325
|
}
|
|
@@ -343,13 +343,13 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
343
343
|
` : /* wgsl */ ``}
|
|
344
344
|
prepared = eH((*si).tangent, *ma, -(*aa).ray.d, ffnormal);
|
|
345
345
|
}
|
|
346
|
-
|
|
346
|
+
mT(si, *ma, prepared, aa, ffnormal, !bl);
|
|
347
347
|
if (bl) {
|
|
348
348
|
|
|
349
|
-
cG =
|
|
349
|
+
cG = fq(
|
|
350
350
|
-(*aa).ray.d,
|
|
351
351
|
(*si).mediumAnisotropy,
|
|
352
|
-
|
|
352
|
+
fp(cw(PHASE_DIRECTION))
|
|
353
353
|
);
|
|
354
354
|
scatteringPdf = bD(
|
|
355
355
|
dot(cG, -(*aa).ray.d),
|
|
@@ -364,8 +364,8 @@ var aS = false;
|
|
|
364
364
|
var bE = true;
|
|
365
365
|
var aR = u32(OPENPBR_LOBE_DIFFUSE);
|
|
366
366
|
var qI = 0.0;
|
|
367
|
-
let ur = vec3f(
|
|
368
|
-
var
|
|
367
|
+
let ur = vec3f(fp(cw(BSDF_DIRECTION)), dz(cw(BSDF_LOBE)));
|
|
368
|
+
var gY = vec3f(0.0);
|
|
369
369
|
let f = dv(
|
|
370
370
|
prepared,
|
|
371
371
|
ur,
|
|
@@ -377,7 +377,7 @@ ur,
|
|
|
377
377
|
&bE,
|
|
378
378
|
&aR,
|
|
379
379
|
&qI,
|
|
380
|
-
&
|
|
380
|
+
&gY
|
|
381
381
|
);
|
|
382
382
|
|
|
383
383
|
|