@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.
@@ -182,7 +182,9 @@ fn evaluate_direct_sun(
182
182
  view_direction: vec3<f32>
183
183
  ) -> vec3<f32> {
184
184
  let surface_normal = faceforward_normal(hit.normal, -view_direction);
185
- let sun_direction = safe_normalize(vec3<f32>(0.32, 0.91, 0.21));
185
+ let sun_direction = safe_normalize(
186
+ environment_key_direction(pathTracerParams.environment_mode)
187
+ );
186
188
  let ndotl = saturate(dot(surface_normal, sun_direction));
187
189
  if (ndotl <= 0.0) {
188
190
  return vec3<f32>(0.0);
@@ -205,7 +207,9 @@ fn evaluate_direct_sun(
205
207
  ndotl *
206
208
  PATH_TRACER_INV_PI *
207
209
  (1.0 - material.metalness);
208
- let sun_color = vec3<f32>(10.0, 9.4, 8.6) * max(pathTracerParams.environment_intensity, 0.0001);
210
+ let sun_color =
211
+ environment_key_color(pathTracerParams.environment_mode) *
212
+ max(pathTracerParams.environment_intensity, 0.0001);
209
213
  return (diffuse + specular) * sun_color;
210
214
  }
211
215
 
@@ -319,11 +323,12 @@ fn process_job(@builtin(global_invocation_id) global_id: vec3<u32>) {
319
323
  for (var bounce_index = 0u; bounce_index < bounce_count; bounce_index = bounce_index + 1u) {
320
324
  let hit = trace_scene(ray);
321
325
  if (hit.hit == 0u) {
322
- sample_radiance = sample_radiance + throughput * environment_radiance(
326
+ let environment_sample = environment_radiance(
323
327
  ray.direction,
324
328
  pathTracerParams.environment_intensity,
325
329
  pathTracerParams.environment_mode
326
330
  );
331
+ sample_radiance = sample_radiance + throughput * environment_sample;
327
332
  terminal_origin = ray.origin;
328
333
  terminal_direction = ray.direction;
329
334
  current_hit_kind = 0u;
@@ -342,7 +347,15 @@ fn process_job(@builtin(global_invocation_id) global_id: vec3<u32>) {
342
347
  captured_primary_hit = true;
343
348
  }
344
349
 
345
- sample_radiance = sample_radiance + throughput * material.emission;
350
+ let emissive_radiance = sanitize_radiance(material.emission);
351
+ if (luminance(emissive_radiance) > 0.0001) {
352
+ sample_radiance = sample_radiance + throughput * emissive_radiance;
353
+ terminal_origin = hit.position;
354
+ terminal_direction = ray.direction;
355
+ current_hit_kind = hit.primitive_kind;
356
+ break;
357
+ }
358
+
346
359
  if (pathTracerParams.enable_next_event_estimation != 0u) {
347
360
  sample_radiance = sample_radiance + throughput * evaluate_direct_sun(
348
361
  hit,
@@ -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 {