@plasius/gpu-lighting 0.1.19 → 0.2.2

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.
@@ -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 = vec3<f32>(0.65, 0.74, 0.86);
239
- let zenith_color = select(
240
- vec3<f32>(0.05, 0.12, 0.24),
241
- vec3<f32>(0.11, 0.08, 0.18),
242
- mode == 1u
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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasius/gpu-lighting",
3
- "version": "0.1.19",
3
+ "version": "0.2.2",
4
4
  "description": "Advanced lighting WGSL modules and planning profiles for @plasius/gpu-worker.",
5
5
  "type": "module",
6
6
  "sideEffects": false,