@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
|
@@ -32,7 +32,7 @@ return;
|
|
|
32
32
|
// So here the code are injected separately.
|
|
33
33
|
const bounceCodeOnIntelMac = glsl `
|
|
34
34
|
|
|
35
|
-
for(int
|
|
35
|
+
for(int vU = 0; vU < BOUNCES; vU++) {{
|
|
36
36
|
if (aa.abort) {
|
|
37
37
|
return vec4(aa.li, aa.alpha);
|
|
38
38
|
}
|
|
@@ -40,10 +40,10 @@ bounce(aa, depth, si, mat, outAux);
|
|
|
40
40
|
}}
|
|
41
41
|
`;
|
|
42
42
|
const bounceCodeOnOther = glsl `
|
|
43
|
-
bool
|
|
44
|
-
int
|
|
43
|
+
bool vg = !si.isTransparency;
|
|
44
|
+
int qO = min(BOUNCES, bounceLimit);
|
|
45
45
|
for(int idx = 0; idx < min(BOUNCES * 3, ${MAX_PATH_EVENTS}); idx++) {
|
|
46
|
-
if (
|
|
46
|
+
if (vg && idx > qO) {
|
|
47
47
|
aa.abort = true;
|
|
48
48
|
}
|
|
49
49
|
if (aa.abort) {
|
|
@@ -93,7 +93,7 @@ ${envMap.main}
|
|
|
93
93
|
${samplingGlsl}
|
|
94
94
|
${openPbrBsdfGlsl}
|
|
95
95
|
|
|
96
|
-
float
|
|
96
|
+
float mw;
|
|
97
97
|
float bf;
|
|
98
98
|
|
|
99
99
|
${sampleLightGlsl}
|
|
@@ -110,7 +110,7 @@ bool isShadowCatcher;
|
|
|
110
110
|
};
|
|
111
111
|
|
|
112
112
|
void bounce(inout Path aa, inout int depth, inout ad si, inout J mat, inout RayTraceAuxiliary outAux) {
|
|
113
|
-
|
|
113
|
+
cF = uint(max(depth, 0));
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
|
|
@@ -135,26 +135,26 @@ if (aa.isNextRefraction) {
|
|
|
135
135
|
|
|
136
136
|
|
|
137
137
|
|
|
138
|
-
vec4 bg =
|
|
138
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
139
139
|
bg.rgb = ai(bg.rgb, bf);
|
|
140
140
|
float cT = aa.scatteringIsDelta ? 1.0
|
|
141
|
-
:
|
|
142
|
-
|
|
141
|
+
: aG(aa.scatteringPdf,
|
|
142
|
+
iB(cY(aa.ray.d)) * envLightSelectionPmf);
|
|
143
143
|
aa.li += cT * aa.beta * bg.rgb * bg.a;
|
|
144
144
|
aa.alpha = max(aa.alpha, bg.a);
|
|
145
145
|
}
|
|
146
146
|
else {
|
|
147
|
-
vec2
|
|
148
|
-
vec3 emission = textureLinear(envMap,
|
|
147
|
+
vec2 tQ = cY(aa.ray.d);
|
|
148
|
+
vec3 emission = textureLinear(envMap, tQ).rgb;
|
|
149
149
|
emission = ai(emission, bf);
|
|
150
150
|
aa.li += aa.beta * emission *
|
|
151
|
-
|
|
151
|
+
aG(
|
|
152
152
|
aa.scatteringPdf,
|
|
153
|
-
|
|
153
|
+
iB(tQ) * envLightSelectionPmf
|
|
154
154
|
);
|
|
155
155
|
}
|
|
156
156
|
#else
|
|
157
|
-
vec4 bg =
|
|
157
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
158
158
|
bg.rgb = ai(bg.rgb, bf);
|
|
159
159
|
aa.li += aa.beta * bg.rgb * bg.a;
|
|
160
160
|
#endif
|
|
@@ -165,7 +165,7 @@ return;
|
|
|
165
165
|
|
|
166
166
|
if (!si.hit) {
|
|
167
167
|
|
|
168
|
-
vec4 bg =
|
|
168
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
|
|
@@ -177,10 +177,10 @@ aa.alpha = bg.a;
|
|
|
177
177
|
outAux.isBlank = bg.a < 0.01;
|
|
178
178
|
}
|
|
179
179
|
else {
|
|
180
|
-
Ray cam =
|
|
181
|
-
bool
|
|
180
|
+
Ray cam = hC(v_Texcoord + sa());
|
|
181
|
+
bool mM = dot(cam.d, aa.ray.d) > 0.0;
|
|
182
182
|
if (transmissiveOutputAlphaMin < 1.0) {
|
|
183
|
-
if (
|
|
183
|
+
if (mM) {
|
|
184
184
|
aa.alpha = max(aa.alpha, bg.a);
|
|
185
185
|
} else {
|
|
186
186
|
aa.alpha = 1.0;
|
|
@@ -188,8 +188,8 @@ aa.alpha = 1.0;
|
|
|
188
188
|
}
|
|
189
189
|
#if !defined(USE_ENVMAP)
|
|
190
190
|
|
|
191
|
-
if (
|
|
192
|
-
aa.li = aa.beta *
|
|
191
|
+
if (mM) {
|
|
192
|
+
aa.li = aa.beta * aG(aa.scatteringPdf, 1.0) * bg.rgb;
|
|
193
193
|
}
|
|
194
194
|
#endif
|
|
195
195
|
}
|
|
@@ -197,7 +197,7 @@ aa.abort = true;
|
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
bool
|
|
200
|
+
bool cH = false;
|
|
201
201
|
if ((mat.materialType == STANDARD || mat.materialType == UNLIT)) {
|
|
202
202
|
if (transmissiveOutputAlphaMin < 1.0) {
|
|
203
203
|
|
|
@@ -210,18 +210,18 @@ if (alpha < 1.0) {
|
|
|
210
210
|
|
|
211
211
|
aa.alpha = max(aa.alpha, alpha);
|
|
212
212
|
if (eo(3u) > alpha) {
|
|
213
|
-
|
|
213
|
+
cH = true;
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
-
if (!
|
|
217
|
-
|
|
216
|
+
if (!cH) {
|
|
217
|
+
mc(si, mat, aa);
|
|
218
218
|
}
|
|
219
219
|
else {
|
|
220
220
|
aa.ray.o = si.position + aa.ray.d * EPS;
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
if (!si.albedoSampled && !
|
|
224
|
+
if (!si.albedoSampled && !cH) {
|
|
225
225
|
|
|
226
226
|
if ((mat.materialType == STANDARD || mat.materialType == UNLIT) &&
|
|
227
227
|
!(mat.transmissionWeight > 0.5 ||
|
|
@@ -243,11 +243,11 @@ si.albedoSampled = true;
|
|
|
243
243
|
|
|
244
244
|
|
|
245
245
|
#ifdef USE_RR
|
|
246
|
-
if (depth >= RR_MAX && !
|
|
246
|
+
if (depth >= RR_MAX && !cH) {
|
|
247
247
|
|
|
248
|
-
float
|
|
249
|
-
float q = max(0.0, 1.0 -
|
|
250
|
-
if (dz(
|
|
248
|
+
float oz = max(max(aa.beta.x, aa.beta.y), aa.beta.z);
|
|
249
|
+
float q = max(0.0, 1.0 - oz);
|
|
250
|
+
if (dz(cw(RUSSIAN_ROULETTE)) < q) {
|
|
251
251
|
|
|
252
252
|
|
|
253
253
|
aa.alpha = 1.0;
|
|
@@ -264,18 +264,18 @@ return;
|
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
|
|
267
|
-
|
|
268
|
-
|
|
267
|
+
cZ(aa.ray, si, true);
|
|
268
|
+
eX(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
269
269
|
si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
|
|
270
270
|
|
|
271
271
|
|
|
272
272
|
|
|
273
273
|
|
|
274
274
|
if (dispersionWavelengths == 1 && si.hit && mat.transmissionWeight > 0.001 && mat.transmissionDispersionScale > 0.001) {
|
|
275
|
-
bf =
|
|
275
|
+
bf = mw;
|
|
276
276
|
}
|
|
277
277
|
if (mat.transmissionWeight > 0.001 && bf > 0.0) {
|
|
278
|
-
mat.specularIor =
|
|
278
|
+
mat.specularIor = eN(
|
|
279
279
|
bf,
|
|
280
280
|
mat.specularIor,
|
|
281
281
|
mat.transmissionDispersionScale,
|
|
@@ -283,24 +283,24 @@ mat.dispersionAbbeNumber
|
|
|
283
283
|
);
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
-
if (
|
|
286
|
+
if (cH) {
|
|
287
287
|
return;
|
|
288
288
|
}
|
|
289
289
|
|
|
290
|
-
bool
|
|
290
|
+
bool hy = eo(3u) < mat.alpha;
|
|
291
291
|
#ifdef NUM_LIGHTS
|
|
292
292
|
|
|
293
293
|
LightSampleRec lightSample;
|
|
294
294
|
for (int i = 0; i < NUM_LIGHTS; i++) {
|
|
295
295
|
|
|
296
|
-
Light light =
|
|
297
|
-
float d =
|
|
298
|
-
bool
|
|
299
|
-
if (d != INF && !(
|
|
296
|
+
Light light = qx(i);
|
|
297
|
+
float d = mz(aa.ray, light, lightSample);
|
|
298
|
+
bool mD = si.hit && d > distance(si.position, aa.ray.o);
|
|
299
|
+
if (d != INF && !(mD && hy)) {
|
|
300
300
|
lightSample.pdf *= light.selectionPmf;
|
|
301
|
-
float
|
|
301
|
+
float fa = aG(aa.scatteringPdf, lightSample.pdf);
|
|
302
302
|
lightSample.emission = ai(lightSample.emission, bf);
|
|
303
|
-
aa.li +=
|
|
303
|
+
aa.li += fa * aa.beta * lightSample.emission;
|
|
304
304
|
|
|
305
305
|
aa.alpha = 1.0;
|
|
306
306
|
aa.abort = true;
|
|
@@ -309,28 +309,28 @@ aa.abort = true;
|
|
|
309
309
|
#endif
|
|
310
310
|
|
|
311
311
|
#ifdef USE_ENVMAP
|
|
312
|
-
if (!(si.hit &&
|
|
312
|
+
if (!(si.hit && hy)) {
|
|
313
313
|
if (aa.isNextRefraction) {
|
|
314
314
|
|
|
315
315
|
|
|
316
|
-
vec4 bg =
|
|
316
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
317
317
|
bg.rgb = ai(bg.rgb, bf);
|
|
318
318
|
float cT = aa.scatteringIsDelta ? 1.0
|
|
319
|
-
:
|
|
320
|
-
|
|
319
|
+
: aG(aa.scatteringPdf,
|
|
320
|
+
iB(cY(aa.ray.d)) * envLightSelectionPmf);
|
|
321
321
|
aa.li += cT * aa.beta * bg.rgb * bg.a;
|
|
322
322
|
aa.alpha = max(aa.alpha, bg.a);
|
|
323
323
|
aa.abort = true;
|
|
324
324
|
return;
|
|
325
325
|
}
|
|
326
|
-
vec2 uv =
|
|
326
|
+
vec2 uv = cY(aa.ray.d);
|
|
327
327
|
vec3 emission = textureLinear(envMap, uv).rgb;
|
|
328
|
-
float
|
|
328
|
+
float fa = aG(
|
|
329
329
|
aa.scatteringPdf,
|
|
330
|
-
|
|
330
|
+
iB(uv) * envLightSelectionPmf
|
|
331
331
|
);
|
|
332
332
|
emission = ai(emission, bf);
|
|
333
|
-
aa.li += aa.beta * emission *
|
|
333
|
+
aa.li += aa.beta * emission * fa;
|
|
334
334
|
|
|
335
335
|
|
|
336
336
|
#if !defined(USE_BACKGROUND)
|
|
@@ -345,105 +345,105 @@ depth++;
|
|
|
345
345
|
}
|
|
346
346
|
|
|
347
347
|
|
|
348
|
-
vec2
|
|
348
|
+
vec2 kz(float radius, float xi) {
|
|
349
349
|
float x = 0.25;
|
|
350
|
-
for (int
|
|
350
|
+
for (int nH = 0; nH < 10; nH++) {
|
|
351
351
|
float x2 = x * x;
|
|
352
352
|
float x3 = x2 * x;
|
|
353
|
-
float
|
|
353
|
+
float kP = 1.0 - x;
|
|
354
354
|
float value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
|
|
355
355
|
4.0 * x2 * x3 - xi;
|
|
356
|
-
float
|
|
357
|
-
if (abs(value) < 1e-6 ||
|
|
358
|
-
x = clamp(x - value /
|
|
356
|
+
float mk = 20.0 * x * kP * kP * kP;
|
|
357
|
+
if (abs(value) < 1e-6 || mk == 0.0) break;
|
|
358
|
+
x = clamp(x - value / mk, 0.0, 1.0);
|
|
359
359
|
}
|
|
360
|
-
float
|
|
360
|
+
float jo = x * radius;
|
|
361
361
|
return vec2(
|
|
362
|
-
|
|
363
|
-
sqrt(max(radius * radius -
|
|
362
|
+
jo,
|
|
363
|
+
sqrt(max(radius * radius - jo * jo, 0.0))
|
|
364
364
|
);
|
|
365
365
|
}
|
|
366
366
|
|
|
367
|
-
float
|
|
368
|
-
if (
|
|
369
|
-
float
|
|
370
|
-
return
|
|
367
|
+
float iT(float radius, float gw) {
|
|
368
|
+
if (gw >= radius) return 0.0;
|
|
369
|
+
float oh = radius - gw;
|
|
370
|
+
return oh * oh * oh;
|
|
371
371
|
}
|
|
372
372
|
|
|
373
373
|
|
|
374
|
-
vec3
|
|
374
|
+
vec3 mu(ad source, float radius) {
|
|
375
375
|
vec3 geometricNormal = source.faceNormal;
|
|
376
376
|
if (dot(geometricNormal, source.vertexNormal) < 0.0) geometricNormal = -geometricNormal;
|
|
377
377
|
vec3 tangent;
|
|
378
378
|
vec3 bitangent;
|
|
379
|
-
|
|
380
|
-
vec3
|
|
381
|
-
|
|
382
|
-
for (int
|
|
383
|
-
vec2
|
|
384
|
-
float
|
|
385
|
-
float
|
|
386
|
-
vec3
|
|
387
|
-
vec3
|
|
379
|
+
aL(geometricNormal, tangent, bitangent);
|
|
380
|
+
vec3 iF = vec3(0.0);
|
|
381
|
+
|
|
382
|
+
for (int ig = 0; ig < BEVEL_SAMPLES; ig++) {
|
|
383
|
+
vec2 ph = fo(CAMERA_BEVEL_BASE + uint(ig));
|
|
384
|
+
float cA = ph.x;
|
|
385
|
+
float oG = ph.y;
|
|
386
|
+
vec3 dj = geometricNormal;
|
|
387
|
+
vec3 fH = tangent;
|
|
388
388
|
vec3 ek = bitangent;
|
|
389
|
-
float
|
|
390
|
-
float
|
|
391
|
-
float
|
|
392
|
-
if (
|
|
393
|
-
|
|
394
|
-
}
|
|
395
|
-
else if (
|
|
396
|
-
vec3
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
389
|
+
float ge = 0.5;
|
|
390
|
+
float hY = 0.25;
|
|
391
|
+
float gG = 0.25;
|
|
392
|
+
if (cA < 0.5) {
|
|
393
|
+
cA *= 2.0;
|
|
394
|
+
}
|
|
395
|
+
else if (cA < 0.75) {
|
|
396
|
+
vec3 mK = dj;
|
|
397
|
+
dj = fH;
|
|
398
|
+
fH = mK;
|
|
399
|
+
ge = 0.25;
|
|
400
|
+
hY = 0.5;
|
|
401
|
+
cA = (cA - 0.5) * 4.0;
|
|
402
402
|
}
|
|
403
403
|
else {
|
|
404
|
-
vec3
|
|
405
|
-
|
|
406
|
-
ek =
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
vec2
|
|
413
|
-
float phi = TWOPI *
|
|
414
|
-
vec3
|
|
415
|
-
(cos(phi) *
|
|
404
|
+
vec3 mK = dj;
|
|
405
|
+
dj = ek;
|
|
406
|
+
ek = mK;
|
|
407
|
+
ge = 0.25;
|
|
408
|
+
gG = 0.5;
|
|
409
|
+
cA = (cA - 0.75) * 4.0;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
vec2 gU = kz(radius, oG);
|
|
413
|
+
float phi = TWOPI * cA;
|
|
414
|
+
vec3 qv = gU.x *
|
|
415
|
+
(cos(phi) * fH + sin(phi) * ek);
|
|
416
416
|
Ray ray;
|
|
417
|
-
|
|
417
|
+
iC(
|
|
418
418
|
ray,
|
|
419
|
-
source.position +
|
|
420
|
-
-
|
|
419
|
+
source.position + dj * gU.y + qv,
|
|
420
|
+
-dj
|
|
421
421
|
);
|
|
422
422
|
ad hit;
|
|
423
|
-
|
|
423
|
+
iM(
|
|
424
424
|
ray,
|
|
425
425
|
hit,
|
|
426
426
|
source.instanceIndex,
|
|
427
|
-
max(2.0 *
|
|
427
|
+
max(2.0 * gU.y, EPS)
|
|
428
428
|
);
|
|
429
429
|
if (!hit.hit) continue;
|
|
430
430
|
|
|
431
|
-
float
|
|
432
|
-
float
|
|
433
|
-
float
|
|
434
|
-
float weight =
|
|
435
|
-
|
|
436
|
-
|
|
431
|
+
float kQ = ge * abs(dot(dj, hit.faceNormal));
|
|
432
|
+
float mG = hY * abs(dot(fH, hit.faceNormal));
|
|
433
|
+
float kb = gG * abs(dot(ek, hit.faceNormal));
|
|
434
|
+
float weight = kQ / max(
|
|
435
|
+
kQ * kQ + mG * mG +
|
|
436
|
+
kb * kb,
|
|
437
437
|
1e-8
|
|
438
438
|
);
|
|
439
|
-
weight *=
|
|
440
|
-
max(
|
|
441
|
-
|
|
439
|
+
weight *= iT(radius, distance(hit.position, source.position)) /
|
|
440
|
+
max(iT(radius, gU.x), 1e-8);
|
|
441
|
+
iF += weight * hit.vertexNormal;
|
|
442
442
|
}
|
|
443
443
|
|
|
444
|
-
if (dot(
|
|
445
|
-
vec3
|
|
446
|
-
vec3 result = source.normal +
|
|
444
|
+
if (dot(iF, iF) <= 1e-12) return source.normal;
|
|
445
|
+
vec3 jH = normalize(iF);
|
|
446
|
+
vec3 result = source.normal + jH - source.vertexNormal;
|
|
447
447
|
return dot(result, result) > 1e-12 ? normalize(result) : source.normal;
|
|
448
448
|
}
|
|
449
449
|
|
|
@@ -463,7 +463,7 @@ ${intelMac ? bounceCodeOnIntelMac : bounceCodeOnOther}
|
|
|
463
463
|
return vec4(aa.li, aa.alpha);
|
|
464
464
|
}
|
|
465
465
|
|
|
466
|
-
vec4
|
|
466
|
+
vec4 iD(ad si, Ray ray, J mat, inout RayTraceAuxiliary outAux) {
|
|
467
467
|
float coverage = clamp(mat.alpha, 0.0, 1.0);
|
|
468
468
|
if (!si.hit || (mat.materialType != STANDARD && mat.materialType != UNLIT) || coverage >= 1.0) {
|
|
469
469
|
return bw(si, ray, mat, outAux);
|
|
@@ -473,49 +473,49 @@ return bw(si, ray, mat, outAux);
|
|
|
473
473
|
|
|
474
474
|
|
|
475
475
|
|
|
476
|
-
Ray
|
|
477
|
-
|
|
478
|
-
ad
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
J
|
|
482
|
-
|
|
483
|
-
RayTraceAuxiliary
|
|
484
|
-
if (
|
|
485
|
-
|
|
476
|
+
Ray nY = ray;
|
|
477
|
+
nY.o = si.position + ray.d * (EPS * 0.02);
|
|
478
|
+
ad dE = si;
|
|
479
|
+
dE.albedoSampled = false;
|
|
480
|
+
cZ(nY, dE, false);
|
|
481
|
+
J nX;
|
|
482
|
+
eX(nX, dE.materialIndex, dE.uv, dE.uv1, dE.instanceIndex, dE.vertexColor);
|
|
483
|
+
RayTraceAuxiliary gm = outAux;
|
|
484
|
+
if (dE.hit && (nX.materialType == STANDARD || nX.materialType == UNLIT)) {
|
|
485
|
+
gm.albedo = nX.transmissionWeight > 0.5
|
|
486
486
|
? vec3(1.0)
|
|
487
|
-
:
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
487
|
+
: nX.baseColor;
|
|
488
|
+
gm.normal = dot(
|
|
489
|
+
dE.normal,
|
|
490
|
+
dE.position - vec3(viewInv[3])
|
|
491
491
|
) > 0.0
|
|
492
|
-
? -
|
|
493
|
-
:
|
|
494
|
-
|
|
492
|
+
? -dE.normal
|
|
493
|
+
: dE.normal;
|
|
494
|
+
dE.albedoSampled = nX.transmissionWeight > 0.5;
|
|
495
495
|
}
|
|
496
|
-
vec4 back = bw(
|
|
496
|
+
vec4 back = bw(dE, nY, nX, gm);
|
|
497
497
|
if (coverage <= 0.0) {
|
|
498
|
-
outAux =
|
|
498
|
+
outAux = gm;
|
|
499
499
|
return back;
|
|
500
500
|
}
|
|
501
501
|
|
|
502
|
-
ad
|
|
503
|
-
J
|
|
504
|
-
|
|
505
|
-
RayTraceAuxiliary
|
|
506
|
-
vec4
|
|
507
|
-
outAux.albedo = mix(
|
|
508
|
-
vec3
|
|
509
|
-
outAux.normal = dot(
|
|
510
|
-
? normalize(
|
|
502
|
+
ad tu = si;
|
|
503
|
+
J tR = mat;
|
|
504
|
+
tR.alpha = 1.0;
|
|
505
|
+
RayTraceAuxiliary iW = outAux;
|
|
506
|
+
vec4 qY = bw(tu, ray, tR, iW);
|
|
507
|
+
outAux.albedo = mix(gm.albedo, iW.albedo, coverage);
|
|
508
|
+
vec3 fV = mix(gm.normal, iW.normal, coverage);
|
|
509
|
+
outAux.normal = dot(fV, fV) > 1e-12
|
|
510
|
+
? normalize(fV)
|
|
511
511
|
: vec3(0.0);
|
|
512
|
-
outAux.isBlank =
|
|
513
|
-
return mix(back,
|
|
512
|
+
outAux.isBlank = gm.isBlank && iW.isBlank;
|
|
513
|
+
return mix(back, qY, coverage);
|
|
514
514
|
}
|
|
515
515
|
|
|
516
516
|
|
|
517
517
|
|
|
518
|
-
vec4
|
|
518
|
+
vec4 my(Ray ray, out RayTraceAuxiliary outAux) {
|
|
519
519
|
|
|
520
520
|
ad si;
|
|
521
521
|
J mat;
|
|
@@ -528,13 +528,13 @@ si.mediumScattering = vec3(0.0);
|
|
|
528
528
|
si.mediumAnisotropy = 0.0;
|
|
529
529
|
#endif
|
|
530
530
|
|
|
531
|
-
|
|
532
|
-
|
|
531
|
+
cZ(ray, si, false);
|
|
532
|
+
eX(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
533
533
|
si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.001 || mat.alpha < 0.999;
|
|
534
534
|
|
|
535
535
|
#ifdef HAS_BEVEL
|
|
536
536
|
if (bevelEnabled && mat.bevel > 0.0) {
|
|
537
|
-
si.normal =
|
|
537
|
+
si.normal = mu(si, mat.bevel);
|
|
538
538
|
}
|
|
539
539
|
#endif
|
|
540
540
|
|
|
@@ -551,32 +551,32 @@ si.albedoSampled = mat.transmissionWeight > 0.5;
|
|
|
551
551
|
}
|
|
552
552
|
|
|
553
553
|
if (mat.transmissionDispersionScale > 0.001) {
|
|
554
|
-
mat.specularIor =
|
|
554
|
+
mat.specularIor = eN(
|
|
555
555
|
bf,
|
|
556
556
|
mat.specularIor,
|
|
557
557
|
mat.transmissionDispersionScale,
|
|
558
558
|
mat.dispersionAbbeNumber
|
|
559
559
|
);
|
|
560
560
|
}
|
|
561
|
-
return
|
|
561
|
+
return iD(si, ray, mat, outAux);
|
|
562
562
|
}
|
|
563
563
|
|
|
564
564
|
void main() {
|
|
565
565
|
|
|
566
|
-
|
|
567
|
-
|
|
566
|
+
su();
|
|
567
|
+
kh(v_Texcoord * viewportSize, int(uint(sampleCount) ^ eg(uint(sequenceSeed))));
|
|
568
568
|
|
|
569
569
|
|
|
570
570
|
bf = dispersionWavelengths == 1 ? 0.0 : wavelength;
|
|
571
|
-
|
|
571
|
+
mw = wavelength;
|
|
572
572
|
if (dispersionWavelengths == 1 && wavelength > 0.0) {
|
|
573
573
|
float channel = floor(dz(CAMERA_WAVELENGTH) * 3.0);
|
|
574
|
-
|
|
574
|
+
mw = channel < 1.0 ? 650.0 : channel < 2.0 ? 510.0 : 475.0;
|
|
575
575
|
}
|
|
576
576
|
|
|
577
577
|
|
|
578
578
|
|
|
579
|
-
Ray cam =
|
|
579
|
+
Ray cam = nN();
|
|
580
580
|
|
|
581
581
|
RayTraceAuxiliary outAux;
|
|
582
582
|
outAux.albedo = vec3(0.0);
|
|
@@ -584,38 +584,38 @@ outAux.normal = vec3(0.0);
|
|
|
584
584
|
outAux.isBlank = false;
|
|
585
585
|
outAux.isShadowCatcher = false;
|
|
586
586
|
|
|
587
|
-
vec4
|
|
587
|
+
vec4 aF = my(cam, outAux);
|
|
588
588
|
|
|
589
589
|
|
|
590
590
|
|
|
591
591
|
#ifdef CLAMPING
|
|
592
592
|
float clamping = float(CLAMPING);
|
|
593
|
-
|
|
593
|
+
aF.rgb = clamp(aF.rgb, -clamping, clamping);
|
|
594
594
|
#endif
|
|
595
595
|
|
|
596
596
|
|
|
597
597
|
if (bf > 0.0) {
|
|
598
598
|
|
|
599
|
-
|
|
599
|
+
aF.rgb *= 3.0;
|
|
600
600
|
if (dispersionWavelengths != 1) {
|
|
601
601
|
|
|
602
602
|
|
|
603
|
-
|
|
603
|
+
aF.a /= 3.0;
|
|
604
604
|
}
|
|
605
605
|
}
|
|
606
|
-
if (!(
|
|
607
|
-
|
|
606
|
+
if (!(aF.x < INF && aF.x > -EPS)) {
|
|
607
|
+
aF = vec4(0, 0, 0, 1);
|
|
608
608
|
}
|
|
609
609
|
|
|
610
|
-
out_color =
|
|
610
|
+
out_color = aF;
|
|
611
611
|
out_albedo = vec4(outAux.albedo, outAux.isBlank ? 0.0 : 1.0);
|
|
612
612
|
out_normal = vec4(outAux.normal, 1.0);
|
|
613
613
|
|
|
614
614
|
|
|
615
|
-
float
|
|
615
|
+
float jq = dot(aF.rgb, vec3(0.2126, 0.7152, 0.0722));
|
|
616
616
|
out_moments = outAux.isShadowCatcher
|
|
617
617
|
? vec4(0.0)
|
|
618
|
-
: vec4(
|
|
618
|
+
: vec4(jq, jq * jq, 1.0, 0.0);
|
|
619
619
|
|
|
620
620
|
}`
|
|
621
621
|
});
|