@tinypoly/gpu-renderer 0.0.5 → 0.1.1
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/ARCHITECTURE.md +59 -3
- package/README.md +53 -4
- package/dist/atmosphere.d.ts +21 -0
- package/dist/atmosphere.d.ts.map +1 -0
- package/dist/atmosphere.js +72 -0
- package/dist/atmosphere.js.map +1 -0
- package/dist/denoise.d.ts +11 -1
- package/dist/denoise.d.ts.map +1 -1
- package/dist/denoise.js +34 -6
- package/dist/denoise.js.map +1 -1
- package/dist/frameLayout.d.ts.map +1 -1
- package/dist/frameLayout.js +17 -0
- package/dist/frameLayout.js.map +1 -1
- package/dist/geometry.d.ts.map +1 -1
- package/dist/geometry.js +6 -3
- package/dist/geometry.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lensPass.d.ts +60 -0
- package/dist/lensPass.d.ts.map +1 -0
- package/dist/lensPass.js +235 -0
- package/dist/lensPass.js.map +1 -0
- package/dist/lightTree.d.ts +50 -0
- package/dist/lightTree.d.ts.map +1 -0
- package/dist/lightTree.js +146 -0
- package/dist/lightTree.js.map +1 -0
- package/dist/lights.d.ts +12 -0
- package/dist/lights.d.ts.map +1 -1
- package/dist/lights.js +56 -1
- package/dist/lights.js.map +1 -1
- package/dist/materialLayout.d.ts +24 -0
- package/dist/materialLayout.d.ts.map +1 -1
- package/dist/materialLayout.js +36 -1
- package/dist/materialLayout.js.map +1 -1
- package/dist/pathTracePass.d.ts +6 -3
- package/dist/pathTracePass.d.ts.map +1 -1
- package/dist/pathTracePass.js +16 -10
- package/dist/pathTracePass.js.map +1 -1
- package/dist/renderer.d.ts +27 -7
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +153 -16
- package/dist/renderer.js.map +1 -1
- package/dist/sceneUpload.d.ts +6 -0
- package/dist/sceneUpload.d.ts.map +1 -1
- package/dist/sceneUpload.js +5 -0
- package/dist/sceneUpload.js.map +1 -1
- package/dist/settings.d.ts +142 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +100 -0
- package/dist/settings.js.map +1 -0
- package/dist/subsurface.d.ts +76 -0
- package/dist/subsurface.d.ts.map +1 -0
- package/dist/subsurface.js +70 -0
- package/dist/subsurface.js.map +1 -0
- package/dist/volumeContainment.d.ts +17 -0
- package/dist/volumeContainment.d.ts.map +1 -0
- package/dist/volumeContainment.js +61 -0
- package/dist/volumeContainment.js.map +1 -0
- package/dist/wgsl/bsdf.wgsl.d.ts +1 -1
- package/dist/wgsl/bsdf.wgsl.d.ts.map +1 -1
- package/dist/wgsl/bsdf.wgsl.js +35 -3
- package/dist/wgsl/bsdf.wgsl.js.map +1 -1
- package/dist/wgsl/common.wgsl.d.ts.map +1 -1
- package/dist/wgsl/common.wgsl.js +4 -0
- package/dist/wgsl/common.wgsl.js.map +1 -1
- package/dist/wgsl/lens.wgsl.d.ts +17 -0
- package/dist/wgsl/lens.wgsl.d.ts.map +1 -0
- package/dist/wgsl/lens.wgsl.js +301 -0
- package/dist/wgsl/lens.wgsl.js.map +1 -0
- package/dist/wgsl/lights.wgsl.d.ts +1 -1
- package/dist/wgsl/lights.wgsl.d.ts.map +1 -1
- package/dist/wgsl/lights.wgsl.js +237 -31
- package/dist/wgsl/lights.wgsl.js.map +1 -1
- package/dist/wgsl/pathTrace.wgsl.d.ts +1 -1
- package/dist/wgsl/pathTrace.wgsl.d.ts.map +1 -1
- package/dist/wgsl/pathTrace.wgsl.js +406 -25
- package/dist/wgsl/pathTrace.wgsl.js.map +1 -1
- package/dist/wgsl/random.wgsl.d.ts +1 -1
- package/dist/wgsl/random.wgsl.d.ts.map +1 -1
- package/dist/wgsl/random.wgsl.js +28 -0
- package/dist/wgsl/random.wgsl.js.map +1 -1
- package/dist/wgsl/sampling.wgsl.d.ts +1 -1
- package/dist/wgsl/sampling.wgsl.d.ts.map +1 -1
- package/dist/wgsl/sampling.wgsl.js +25 -0
- package/dist/wgsl/sampling.wgsl.js.map +1 -1
- package/dist/wgsl/surface.wgsl.d.ts +1 -1
- package/dist/wgsl/surface.wgsl.d.ts.map +1 -1
- package/dist/wgsl/surface.wgsl.js +21 -1
- package/dist/wgsl/surface.wgsl.js.map +1 -1
- package/package.json +1 -1
- package/src/atmosphere.ts +95 -0
- package/src/denoise.ts +44 -6
- package/src/frameLayout.ts +17 -0
- package/src/geometry.ts +6 -2
- package/src/index.ts +13 -0
- package/src/lensPass.ts +299 -0
- package/src/lightTree.ts +218 -0
- package/src/lights.ts +75 -1
- package/src/materialLayout.ts +52 -1
- package/src/pathTracePass.ts +19 -10
- package/src/renderer.ts +206 -24
- package/src/sceneUpload.ts +11 -0
- package/src/settings.ts +240 -0
- package/src/subsurface.ts +153 -0
- package/src/volumeContainment.ts +81 -0
- package/src/wgsl/bsdf.wgsl.ts +35 -3
- package/src/wgsl/common.wgsl.ts +4 -0
- package/src/wgsl/lens.wgsl.ts +300 -0
- package/src/wgsl/lights.wgsl.ts +237 -31
- package/src/wgsl/pathTrace.wgsl.ts +406 -25
- package/src/wgsl/random.wgsl.ts +28 -0
- package/src/wgsl/sampling.wgsl.ts +25 -0
- package/src/wgsl/surface.wgsl.ts +21 -1
|
@@ -21,6 +21,31 @@ fn cosineDirection(normal: vec3<f32>, u: vec2<f32>) -> vec3<f32> {
|
|
|
21
21
|
return normalize(orthonormalBasis(normal) * local);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
/** A direction scattered from forward by the Henyey-Greenstein phase function, which its own sampling cancels. */
|
|
25
|
+
fn sampleHenyeyGreenstein(forward: vec3<f32>, g: f32, u: vec2<f32>) -> vec3<f32> {
|
|
26
|
+
var cosine = 1.0 - 2.0 * u.x;
|
|
27
|
+
|
|
28
|
+
if (abs(g) > 1e-3) {
|
|
29
|
+
let s = (1.0 - g * g) / (1.0 - g + 2.0 * g * u.x);
|
|
30
|
+
cosine = clamp((1.0 + g * g - s * s) / (2.0 * g), -1.0, 1.0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let sine = sqrt(max(0.0, 1.0 - cosine * cosine));
|
|
34
|
+
let angle = 2.0 * PI * u.y;
|
|
35
|
+
|
|
36
|
+
return normalize(orthonormalBasis(forward) * vec3<f32>(sine * cos(angle), sine * sin(angle), cosine));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The Henyey-Greenstein phase function, per steradian, for a turn whose cosine is given from the direction of travel:
|
|
41
|
+
* the density sampleHenyeyGreenstein draws with.
|
|
42
|
+
*/
|
|
43
|
+
fn henyeyGreenstein(cosine: f32, g: f32) -> f32 {
|
|
44
|
+
let denominator = 1.0 + g * g - 2.0 * g * cosine;
|
|
45
|
+
|
|
46
|
+
return (1.0 - g * g) / (4.0 * PI * denominator * sqrt(max(denominator, 1e-12)));
|
|
47
|
+
}
|
|
48
|
+
|
|
24
49
|
/** The unit normal of the triangle's plane; which side it faces does not matter, every emitter is two sided. */
|
|
25
50
|
fn triangleNormal(triangle: u32) -> vec3<f32> {
|
|
26
51
|
let a = triangleVertex(triangle, 0u);
|
package/src/wgsl/surface.wgsl.ts
CHANGED
|
@@ -62,6 +62,8 @@ struct Surface {
|
|
|
62
62
|
lightMap: vec3<f32>,
|
|
63
63
|
blending: u32,
|
|
64
64
|
material: u32,
|
|
65
|
+
// Share of the diffuse layer that scatters inside the material instead of at its surface.
|
|
66
|
+
subsurface: f32,
|
|
65
67
|
};
|
|
66
68
|
|
|
67
69
|
/** Barycentric weights of the two trailing vertices, for a point drawn uniformly over a triangle's area. */
|
|
@@ -114,6 +116,18 @@ fn isCulled(material: u32, triangle: u32, direction: vec3<f32>) -> bool {
|
|
|
114
116
|
/** What the triangle radiates at this point, its emissive map included so direct and indirect light agree on it. */
|
|
115
117
|
fn emissionAt(triangle: u32, bary: vec2<f32>) -> vec3<f32> {
|
|
116
118
|
let m = materialIndexOf(triangle);
|
|
119
|
+
|
|
120
|
+
// An unlit material emits its colour as the camera would see it, so a bounce ray finds what a light sample counted.
|
|
121
|
+
if ((materials[m].flags & MATERIAL_UNLIT_LIGHT) != 0u) {
|
|
122
|
+
var color = materials[m].color.rgb * sampleMap(materials[m].map, triangle, bary).rgb;
|
|
123
|
+
|
|
124
|
+
if ((materials[m].flags & MATERIAL_VERTEX_COLORS) != 0u) {
|
|
125
|
+
color = color * triangleColor(triangle, bary).rgb;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return color;
|
|
129
|
+
}
|
|
130
|
+
|
|
117
131
|
let map = sampleMap(materials[m].emissiveMap, triangle, bary);
|
|
118
132
|
|
|
119
133
|
return materials[m].emissive.rgb * materials[m].emissive.w * map.rgb;
|
|
@@ -611,7 +625,12 @@ fn resolveSurfaceFrom(triangle: u32, bary: vec2<f32>, direction: vec3<f32>, base
|
|
|
611
625
|
|
|
612
626
|
var roughness = materials[m].specular.w * sampleMap(materials[m].roughnessMap, triangle, bary).g;
|
|
613
627
|
var metalness = materials[m].metalness * sampleMap(materials[m].metalnessMap, triangle, bary).b;
|
|
614
|
-
var emissive =
|
|
628
|
+
var emissive = vec3<f32>(0.0);
|
|
629
|
+
|
|
630
|
+
// An unlit light's colour is added as what it shows, below; emissionAt gives the same colour to light samples.
|
|
631
|
+
if ((flags & MATERIAL_UNLIT_LIGHT) == 0u) {
|
|
632
|
+
emissive = emissionAt(triangle, bary);
|
|
633
|
+
}
|
|
615
634
|
|
|
616
635
|
surface.opacity = 1.0;
|
|
617
636
|
|
|
@@ -658,6 +677,7 @@ fn resolveSurfaceFrom(triangle: u32, bary: vec2<f32>, direction: vec3<f32>, base
|
|
|
658
677
|
surface.ior = max(materials[m].ior, 1.0);
|
|
659
678
|
surface.thickness = materials[m].thickness * sampleMap(materials[m].thicknessMap, triangle, bary).g;
|
|
660
679
|
surface.dispersion = materials[m].dispersion;
|
|
680
|
+
surface.subsurface = select(0.0, materials[m].subsurface.w, frame.subsurfaceEnabled != 0u);
|
|
661
681
|
surface.absorption = absorptionOf(m);
|
|
662
682
|
surface.shininess = materials[m].shininess;
|
|
663
683
|
surface.specularStrength = sampleMap(materials[m].specularMap, triangle, bary).r;
|