@plasius/gpu-lighting 0.1.18 → 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 +31 -2
- package/README.md +65 -0
- package/dist/index.cjs +859 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +851 -0
- 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 +895 -0
- package/src/techniques/pathtracer/pathtrace.job.wgsl +17 -4
- package/src/techniques/pathtracer/prelude.wgsl +183 -20
|
@@ -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(
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 {
|