@plasius/gpu-lighting 0.1.19 → 0.2.0
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/CHANGELOG.md +25 -0
- package/README.md +43 -3
- package/dist/index.cjs +728 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +723 -17
- package/dist/index.js.map +1 -1
- package/dist/techniques/techniques/pathtracer/pathtrace.job.wgsl +17 -4
- package/dist/techniques/techniques/pathtracer/prelude.wgsl +183 -20
- package/package.json +1 -1
- package/src/index.js +755 -12
- package/src/techniques/pathtracer/pathtrace.job.wgsl +17 -4
- package/src/techniques/pathtracer/prelude.wgsl +183 -20
|
@@ -142,6 +142,19 @@ fn saturate(value: f32) -> f32 {
|
|
|
142
142
|
return clamp(value, 0.0, 1.0);
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
fn sanitize_radiance(value: vec3<f32>) -> vec3<f32> {
|
|
146
|
+
return max(value, vec3<f32>(0.0));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
fn ensure_non_null_radiance(value: vec3<f32>) -> vec3<f32> {
|
|
150
|
+
let radiance = sanitize_radiance(value);
|
|
151
|
+
if (luminance(radiance) <= 0.000001) {
|
|
152
|
+
return vec3<f32>(0.0001);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return radiance;
|
|
156
|
+
}
|
|
157
|
+
|
|
145
158
|
fn safe_rcp(value: f32) -> f32 {
|
|
146
159
|
if (abs(value) <= PATH_TRACER_EPSILON) {
|
|
147
160
|
return 0.0;
|
|
@@ -170,7 +183,7 @@ fn unpack_material(material: PathTracerMaterial) -> MaterialSample {
|
|
|
170
183
|
return MaterialSample(
|
|
171
184
|
material.albedo_roughness.xyz,
|
|
172
185
|
clamp(material.albedo_roughness.w, 0.02, 1.0),
|
|
173
|
-
material.emission_metalness.xyz,
|
|
186
|
+
sanitize_radiance(material.emission_metalness.xyz),
|
|
174
187
|
saturate(material.emission_metalness.w),
|
|
175
188
|
material.transmittance_ior.xyz,
|
|
176
189
|
max(material.transmittance_ior.w, 1.0)
|
|
@@ -229,32 +242,182 @@ fn fresnel_schlick(cos_theta: f32, f0: vec3<f32>) -> vec3<f32> {
|
|
|
229
242
|
return f0 + (vec3<f32>(1.0) - f0) * factor;
|
|
230
243
|
}
|
|
231
244
|
|
|
245
|
+
fn environment_horizon_color(mode: u32) -> vec3<f32> {
|
|
246
|
+
var color = vec3<f32>(0.65, 0.74, 0.86);
|
|
247
|
+
if (mode == 0u) { color = vec3<f32>(0.33, 0.43, 0.53); }
|
|
248
|
+
if (mode == 1u) { color = vec3<f32>(0.52, 0.61, 0.65); }
|
|
249
|
+
if (mode == 2u) { color = vec3<f32>(0.48, 0.53, 0.55); }
|
|
250
|
+
if (mode == 3u) { color = vec3<f32>(0.92, 0.54, 0.32); }
|
|
251
|
+
if (mode == 4u) { color = vec3<f32>(0.58, 0.78, 0.96); }
|
|
252
|
+
if (mode == 5u) { color = vec3<f32>(1.08, 0.42, 0.24); }
|
|
253
|
+
if (mode == 6u) { color = vec3<f32>(0.08, 0.13, 0.2); }
|
|
254
|
+
if (mode == 7u) { color = vec3<f32>(0.72, 0.48, 0.28); }
|
|
255
|
+
if (mode == 8u) { color = vec3<f32>(0.38, 0.62, 0.42); }
|
|
256
|
+
if (mode == 9u) { color = vec3<f32>(0.72, 0.28, 0.2); }
|
|
257
|
+
if (mode == 10u) { color = vec3<f32>(0.035, 0.08, 0.1); }
|
|
258
|
+
if (mode == 11u) { color = vec3<f32>(0.58, 0.44, 0.34); }
|
|
259
|
+
if (mode == 12u) { color = vec3<f32>(0.64, 0.7, 0.74); }
|
|
260
|
+
if (mode == 13u) { color = vec3<f32>(0.7, 0.32, 0.24); }
|
|
261
|
+
if (mode == 14u) { color = vec3<f32>(0.06, 0.08, 0.12); }
|
|
262
|
+
if (mode == 15u) { color = vec3<f32>(0.5, 0.3, 0.2); }
|
|
263
|
+
if (mode == 16u) { color = vec3<f32>(0.6, 0.56, 0.48); }
|
|
264
|
+
if (mode == 17u) { color = vec3<f32>(0.46, 0.18, 0.14); }
|
|
265
|
+
if (mode == 18u) { color = vec3<f32>(0.025, 0.035, 0.06); }
|
|
266
|
+
return ensure_non_null_radiance(color);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
fn environment_zenith_color(mode: u32) -> vec3<f32> {
|
|
270
|
+
var color = vec3<f32>(0.05, 0.12, 0.24);
|
|
271
|
+
if (mode == 0u) { color = vec3<f32>(0.035, 0.07, 0.14); }
|
|
272
|
+
if (mode == 1u) { color = vec3<f32>(0.18, 0.22, 0.26); }
|
|
273
|
+
if (mode == 2u) { color = vec3<f32>(0.24, 0.26, 0.29); }
|
|
274
|
+
if (mode == 3u) { color = vec3<f32>(0.16, 0.28, 0.5); }
|
|
275
|
+
if (mode == 4u) { color = vec3<f32>(0.1, 0.34, 0.82); }
|
|
276
|
+
if (mode == 5u) { color = vec3<f32>(0.09, 0.1, 0.32); }
|
|
277
|
+
if (mode == 6u) { color = vec3<f32>(0.018, 0.035, 0.09); }
|
|
278
|
+
if (mode == 7u) { color = vec3<f32>(0.08, 0.18, 0.18); }
|
|
279
|
+
if (mode == 8u) { color = vec3<f32>(0.08, 0.28, 0.32); }
|
|
280
|
+
if (mode == 9u) { color = vec3<f32>(0.04, 0.07, 0.18); }
|
|
281
|
+
if (mode == 10u) { color = vec3<f32>(0.012, 0.025, 0.06); }
|
|
282
|
+
if (mode == 11u) { color = vec3<f32>(0.16, 0.19, 0.24); }
|
|
283
|
+
if (mode == 12u) { color = vec3<f32>(0.28, 0.34, 0.42); }
|
|
284
|
+
if (mode == 13u) { color = vec3<f32>(0.08, 0.1, 0.18); }
|
|
285
|
+
if (mode == 14u) { color = vec3<f32>(0.02, 0.03, 0.055); }
|
|
286
|
+
if (mode == 15u) { color = vec3<f32>(0.04, 0.07, 0.09); }
|
|
287
|
+
if (mode == 16u) { color = vec3<f32>(0.08, 0.12, 0.14); }
|
|
288
|
+
if (mode == 17u) { color = vec3<f32>(0.035, 0.045, 0.08); }
|
|
289
|
+
if (mode == 18u) { color = vec3<f32>(0.008, 0.014, 0.03); }
|
|
290
|
+
return ensure_non_null_radiance(color);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
fn environment_key_direction(mode: u32) -> vec3<f32> {
|
|
294
|
+
var direction = vec3<f32>(0.35, 0.92, 0.18);
|
|
295
|
+
if (mode == 0u) { direction = vec3<f32>(0.22, 0.88, 0.42); }
|
|
296
|
+
if (mode == 1u) { direction = vec3<f32>(0.18, 0.93, 0.24); }
|
|
297
|
+
if (mode == 2u) { direction = vec3<f32>(-0.24, 0.86, 0.36); }
|
|
298
|
+
if (mode == 3u) { direction = vec3<f32>(0.64, 0.32, 0.18); }
|
|
299
|
+
if (mode == 4u) { direction = vec3<f32>(0.18, 0.98, 0.08); }
|
|
300
|
+
if (mode == 5u) { direction = vec3<f32>(-0.76, 0.24, 0.22); }
|
|
301
|
+
if (mode == 6u) { direction = vec3<f32>(-0.22, 0.86, -0.34); }
|
|
302
|
+
if (mode == 7u) { direction = vec3<f32>(0.58, 0.42, -0.24); }
|
|
303
|
+
if (mode == 8u) { direction = vec3<f32>(0.08, 0.96, -0.18); }
|
|
304
|
+
if (mode == 9u) { direction = vec3<f32>(-0.7, 0.18, -0.18); }
|
|
305
|
+
if (mode == 10u) { direction = vec3<f32>(0.2, 0.82, -0.46); }
|
|
306
|
+
if (mode == 11u) { direction = vec3<f32>(0.82, 0.28, 0.18); }
|
|
307
|
+
if (mode == 12u) { direction = vec3<f32>(0.35, 0.86, 0.16); }
|
|
308
|
+
if (mode == 13u) { direction = vec3<f32>(-0.78, 0.18, 0.16); }
|
|
309
|
+
if (mode == 14u) { direction = vec3<f32>(0.1, 0.94, -0.12); }
|
|
310
|
+
if (mode == 15u) { direction = vec3<f32>(0.72, 0.32, 0.26); }
|
|
311
|
+
if (mode == 16u) { direction = vec3<f32>(0.36, 0.82, 0.14); }
|
|
312
|
+
if (mode == 17u) { direction = vec3<f32>(0.32, 0.34, -0.54); }
|
|
313
|
+
if (mode == 18u) { direction = vec3<f32>(0.18, 0.28, -0.68); }
|
|
314
|
+
return safe_normalize(direction);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
fn environment_fill_direction(mode: u32) -> vec3<f32> {
|
|
318
|
+
var direction = vec3<f32>(0.0, 1.0, 0.0);
|
|
319
|
+
if (mode == 3u || mode == 4u || mode == 5u) { direction = vec3<f32>(0.0, 0.35, 0.1); }
|
|
320
|
+
if (mode == 6u) { direction = vec3<f32>(0.0, 1.0, 0.0); }
|
|
321
|
+
if (mode >= 7u && mode <= 10u) { direction = vec3<f32>(0.18, 0.75, 0.2); }
|
|
322
|
+
if (mode >= 11u && mode <= 14u) { direction = vec3<f32>(0.0, 0.95, -0.08); }
|
|
323
|
+
if (mode >= 15u && mode <= 18u) { direction = vec3<f32>(-0.25, 0.22, 0.7); }
|
|
324
|
+
return safe_normalize(direction);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
fn environment_key_color(mode: u32) -> vec3<f32> {
|
|
328
|
+
var color = vec3<f32>(8.0, 7.6, 6.8);
|
|
329
|
+
if (mode == 0u) { color = vec3<f32>(0.7, 0.76, 0.9) * 2.2; }
|
|
330
|
+
if (mode == 1u) { color = vec3<f32>(1.0, 0.94, 0.82) * 4.1; }
|
|
331
|
+
if (mode == 2u) { color = vec3<f32>(0.96, 0.97, 1.0) * 2.5; }
|
|
332
|
+
if (mode == 3u) { color = vec3<f32>(1.0, 0.58, 0.28) * 5.6; }
|
|
333
|
+
if (mode == 4u) { color = vec3<f32>(1.0, 0.96, 0.86) * 9.8; }
|
|
334
|
+
if (mode == 5u) { color = vec3<f32>(1.0, 0.34, 0.16) * 4.8; }
|
|
335
|
+
if (mode == 6u) { color = vec3<f32>(0.52, 0.62, 1.0) * 1.25; }
|
|
336
|
+
if (mode == 7u) { color = vec3<f32>(1.0, 0.62, 0.32) * 4.4; }
|
|
337
|
+
if (mode == 8u) { color = vec3<f32>(1.0, 0.96, 0.74) * 7.2; }
|
|
338
|
+
if (mode == 9u) { color = vec3<f32>(1.0, 0.34, 0.2) * 2.2; }
|
|
339
|
+
if (mode == 10u) { color = vec3<f32>(0.42, 0.56, 1.0) * 0.95; }
|
|
340
|
+
if (mode == 11u) { color = vec3<f32>(1.0, 0.62, 0.34) * 2.8; }
|
|
341
|
+
if (mode == 12u) { color = vec3<f32>(0.92, 0.96, 1.0) * 4.2; }
|
|
342
|
+
if (mode == 13u) { color = vec3<f32>(1.0, 0.42, 0.2) * 2.4; }
|
|
343
|
+
if (mode == 14u) { color = vec3<f32>(0.68, 0.88, 1.0) * 2.25; }
|
|
344
|
+
if (mode == 15u) { color = vec3<f32>(1.0, 0.58, 0.3) * 2.1; }
|
|
345
|
+
if (mode == 16u) { color = vec3<f32>(1.0, 0.9, 0.66) * 3.4; }
|
|
346
|
+
if (mode == 17u) { color = vec3<f32>(1.0, 0.38, 0.12) * 1.85; }
|
|
347
|
+
if (mode == 18u) { color = vec3<f32>(1.0, 0.36, 0.12) * 1.9; }
|
|
348
|
+
return ensure_non_null_radiance(color);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
fn environment_fill_color(mode: u32) -> vec3<f32> {
|
|
352
|
+
var color = vec3<f32>(0.3, 0.4, 0.6);
|
|
353
|
+
if (mode == 0u) { color = vec3<f32>(0.22, 0.31, 0.48) * 0.35; }
|
|
354
|
+
if (mode == 1u) { color = vec3<f32>(0.75, 0.84, 1.0) * 1.3; }
|
|
355
|
+
if (mode == 2u) { color = vec3<f32>(0.55, 0.58, 0.62) * 0.8; }
|
|
356
|
+
if (mode == 3u) { color = vec3<f32>(0.22, 0.44, 0.12) * 0.45; }
|
|
357
|
+
if (mode == 4u) { color = vec3<f32>(0.28, 0.56, 0.16) * 0.65; }
|
|
358
|
+
if (mode == 5u) { color = vec3<f32>(0.12, 0.28, 0.11) * 0.35; }
|
|
359
|
+
if (mode == 6u) { color = vec3<f32>(0.32, 0.38, 0.6) * 0.24; }
|
|
360
|
+
if (mode == 7u) { color = vec3<f32>(0.34, 0.68, 0.24) * 0.86; }
|
|
361
|
+
if (mode == 8u) { color = vec3<f32>(0.24, 0.72, 0.28) * 1.35; }
|
|
362
|
+
if (mode == 9u) { color = vec3<f32>(0.18, 0.38, 0.2) * 0.52; }
|
|
363
|
+
if (mode == 10u) { color = vec3<f32>(0.08, 0.18, 0.12) * 0.28; }
|
|
364
|
+
if (mode == 11u) { color = vec3<f32>(0.78, 0.9, 1.0) * 1.1; }
|
|
365
|
+
if (mode == 12u) { color = vec3<f32>(0.78, 0.92, 1.0) * 1.6; }
|
|
366
|
+
if (mode == 13u) { color = vec3<f32>(0.72, 0.88, 1.0) * 1.35; }
|
|
367
|
+
if (mode == 14u) { color = vec3<f32>(1.0, 0.05, 0.025) * 0.4; }
|
|
368
|
+
if (mode == 15u) { color = vec3<f32>(1.0, 0.42, 0.16) * 1.35; }
|
|
369
|
+
if (mode == 16u) { color = vec3<f32>(0.1, 0.82, 0.64) * 0.46; }
|
|
370
|
+
if (mode == 17u) { color = vec3<f32>(0.08, 0.58, 0.72) * 0.34; }
|
|
371
|
+
if (mode == 18u) { color = vec3<f32>(0.06, 0.62, 0.76) * 0.52; }
|
|
372
|
+
return ensure_non_null_radiance(color);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
fn environment_horizon_glow(mode: u32) -> vec3<f32> {
|
|
376
|
+
var color = environment_horizon_color(mode) * 0.2;
|
|
377
|
+
if (mode == 5u || mode == 9u || mode == 13u || mode == 17u) {
|
|
378
|
+
color = color + vec3<f32>(0.8, 0.22, 0.12);
|
|
379
|
+
}
|
|
380
|
+
if (mode == 14u || mode == 18u) {
|
|
381
|
+
color = color + vec3<f32>(0.08, 0.12, 0.22);
|
|
382
|
+
}
|
|
383
|
+
return ensure_non_null_radiance(color);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
fn environment_key_focus(mode: u32) -> f32 {
|
|
387
|
+
var focus = 192.0;
|
|
388
|
+
if (mode == 1u || mode == 2u || (mode >= 11u && mode <= 14u)) {
|
|
389
|
+
focus = 48.0;
|
|
390
|
+
}
|
|
391
|
+
if (mode >= 15u && mode <= 18u) {
|
|
392
|
+
focus = 28.0;
|
|
393
|
+
}
|
|
394
|
+
if (mode == 6u || mode == 10u) {
|
|
395
|
+
focus = 384.0;
|
|
396
|
+
}
|
|
397
|
+
return focus;
|
|
398
|
+
}
|
|
399
|
+
|
|
232
400
|
fn environment_radiance(
|
|
233
401
|
direction: vec3<f32>,
|
|
234
402
|
intensity: f32,
|
|
235
403
|
mode: u32
|
|
236
404
|
) -> vec3<f32> {
|
|
237
405
|
let up_factor = saturate(direction.y * 0.5 + 0.5);
|
|
238
|
-
let horizon_color =
|
|
239
|
-
let zenith_color =
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
406
|
+
let horizon_color = environment_horizon_color(mode);
|
|
407
|
+
let zenith_color = environment_zenith_color(mode);
|
|
408
|
+
let key_direction = safe_normalize(environment_key_direction(mode));
|
|
409
|
+
let fill_direction = safe_normalize(environment_fill_direction(mode));
|
|
410
|
+
let key_glow = pow(saturate(dot(direction, key_direction)), environment_key_focus(mode));
|
|
411
|
+
let fill_glow = pow(saturate(dot(direction, fill_direction)), 32.0);
|
|
412
|
+
let horizon_band = pow(1.0 - abs(direction.y), 2.0);
|
|
413
|
+
let sky = horizon_color * (1.0 - up_factor) + zenith_color * up_factor;
|
|
414
|
+
let inferred_source =
|
|
415
|
+
environment_key_color(mode) * key_glow +
|
|
416
|
+
environment_fill_color(mode) * fill_glow * 0.35 +
|
|
417
|
+
environment_horizon_glow(mode) * horizon_band;
|
|
418
|
+
return ensure_non_null_radiance(
|
|
419
|
+
(sky + inferred_source) * max(intensity, 0.0001)
|
|
243
420
|
);
|
|
244
|
-
let sunset_color = vec3<f32>(1.1, 0.64, 0.32);
|
|
245
|
-
let sun_direction = safe_normalize(vec3<f32>(0.35, 0.92, 0.18));
|
|
246
|
-
let moon_direction = safe_normalize(vec3<f32>(-0.2, 0.98, -0.1));
|
|
247
|
-
let sun_glow = pow(saturate(dot(direction, sun_direction)), 256.0);
|
|
248
|
-
let moon_glow = pow(saturate(dot(direction, moon_direction)), 512.0);
|
|
249
|
-
var sky = horizon_color * (1.0 - up_factor) + zenith_color * up_factor;
|
|
250
|
-
if (mode == 1u) {
|
|
251
|
-
sky = sky * (1.0 - up_factor * 0.4) + sunset_color * sun_glow * 0.25;
|
|
252
|
-
}
|
|
253
|
-
return (
|
|
254
|
-
sky +
|
|
255
|
-
vec3<f32>(8.0, 7.6, 6.8) * sun_glow +
|
|
256
|
-
vec3<f32>(0.7, 0.76, 0.9) * moon_glow * 0.3
|
|
257
|
-
) * max(intensity, 0.0001);
|
|
258
421
|
}
|
|
259
422
|
|
|
260
423
|
fn miss_hit(ray: Ray) -> PathHit {
|