@tinypoly/gpu-renderer 0.0.0-stage → 0.0.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.
Files changed (194) hide show
  1. package/ARCHITECTURE.md +334 -0
  2. package/LICENSE +21 -0
  3. package/README.md +258 -2
  4. package/dist/accumulator.d.ts +27 -0
  5. package/dist/accumulator.d.ts.map +1 -0
  6. package/dist/accumulator.js +57 -0
  7. package/dist/accumulator.js.map +1 -0
  8. package/dist/bvh.d.ts +26 -0
  9. package/dist/bvh.d.ts.map +1 -0
  10. package/dist/bvh.js +207 -0
  11. package/dist/bvh.js.map +1 -0
  12. package/dist/camera.d.ts +29 -0
  13. package/dist/camera.d.ts.map +1 -0
  14. package/dist/camera.js +48 -0
  15. package/dist/camera.js.map +1 -0
  16. package/dist/canvas.d.ts +9 -0
  17. package/dist/canvas.d.ts.map +1 -0
  18. package/dist/canvas.js +11 -0
  19. package/dist/canvas.js.map +1 -0
  20. package/dist/denoise.d.ts +69 -0
  21. package/dist/denoise.d.ts.map +1 -0
  22. package/dist/denoise.js +455 -0
  23. package/dist/denoise.js.map +1 -0
  24. package/dist/device.d.ts +37 -0
  25. package/dist/device.d.ts.map +1 -0
  26. package/dist/device.js +52 -0
  27. package/dist/device.js.map +1 -0
  28. package/dist/dispatchScheduler.d.ts +43 -0
  29. package/dist/dispatchScheduler.d.ts.map +1 -0
  30. package/dist/dispatchScheduler.js +49 -0
  31. package/dist/dispatchScheduler.js.map +1 -0
  32. package/dist/environment.d.ts +39 -0
  33. package/dist/environment.d.ts.map +1 -0
  34. package/dist/environment.js +168 -0
  35. package/dist/environment.js.map +1 -0
  36. package/dist/frameLayout.d.ts +4 -0
  37. package/dist/frameLayout.d.ts.map +1 -0
  38. package/dist/frameLayout.js +58 -0
  39. package/dist/frameLayout.js.map +1 -0
  40. package/dist/geometry.d.ts +75 -0
  41. package/dist/geometry.d.ts.map +1 -0
  42. package/dist/geometry.js +671 -0
  43. package/dist/geometry.js.map +1 -0
  44. package/dist/index.d.ts +25 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +17 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/lights.d.ts +64 -0
  49. package/dist/lights.d.ts.map +1 -0
  50. package/dist/lights.js +264 -0
  51. package/dist/lights.js.map +1 -0
  52. package/dist/materialLayout.d.ts +143 -0
  53. package/dist/materialLayout.d.ts.map +1 -0
  54. package/dist/materialLayout.js +297 -0
  55. package/dist/materialLayout.js.map +1 -0
  56. package/dist/math.d.ts +10 -0
  57. package/dist/math.d.ts.map +1 -0
  58. package/dist/math.js +40 -0
  59. package/dist/math.js.map +1 -0
  60. package/dist/pathTracePass.d.ts +27 -0
  61. package/dist/pathTracePass.d.ts.map +1 -0
  62. package/dist/pathTracePass.js +83 -0
  63. package/dist/pathTracePass.js.map +1 -0
  64. package/dist/planarCapture.d.ts +38 -0
  65. package/dist/planarCapture.d.ts.map +1 -0
  66. package/dist/planarCapture.js +163 -0
  67. package/dist/planarCapture.js.map +1 -0
  68. package/dist/presentPass.d.ts +31 -0
  69. package/dist/presentPass.d.ts.map +1 -0
  70. package/dist/presentPass.js +78 -0
  71. package/dist/presentPass.js.map +1 -0
  72. package/dist/renderer.d.ts +196 -0
  73. package/dist/renderer.d.ts.map +1 -0
  74. package/dist/renderer.js +839 -0
  75. package/dist/renderer.js.map +1 -0
  76. package/dist/sceneAssets.d.ts +24 -0
  77. package/dist/sceneAssets.d.ts.map +1 -0
  78. package/dist/sceneAssets.js +77 -0
  79. package/dist/sceneAssets.js.map +1 -0
  80. package/dist/sceneUpload.d.ts +61 -0
  81. package/dist/sceneUpload.d.ts.map +1 -0
  82. package/dist/sceneUpload.js +98 -0
  83. package/dist/sceneUpload.js.map +1 -0
  84. package/dist/shaderModule.d.ts +7 -0
  85. package/dist/shaderModule.d.ts.map +1 -0
  86. package/dist/shaderModule.js +19 -0
  87. package/dist/shaderModule.js.map +1 -0
  88. package/dist/shaderProgram.d.ts +124 -0
  89. package/dist/shaderProgram.d.ts.map +1 -0
  90. package/dist/shaderProgram.js +1030 -0
  91. package/dist/shaderProgram.js.map +1 -0
  92. package/dist/structLayout.d.ts +28 -0
  93. package/dist/structLayout.d.ts.map +1 -0
  94. package/dist/structLayout.js +58 -0
  95. package/dist/structLayout.js.map +1 -0
  96. package/dist/texturePack.d.ts +54 -0
  97. package/dist/texturePack.d.ts.map +1 -0
  98. package/dist/texturePack.js +86 -0
  99. package/dist/texturePack.js.map +1 -0
  100. package/dist/upstream.d.ts +7 -0
  101. package/dist/upstream.d.ts.map +1 -0
  102. package/dist/upstream.js +11 -0
  103. package/dist/upstream.js.map +1 -0
  104. package/dist/volumetric.d.ts +10 -0
  105. package/dist/volumetric.d.ts.map +1 -0
  106. package/dist/volumetric.js +34 -0
  107. package/dist/volumetric.js.map +1 -0
  108. package/dist/wgsl/bsdf.wgsl.d.ts +13 -0
  109. package/dist/wgsl/bsdf.wgsl.d.ts.map +1 -0
  110. package/dist/wgsl/bsdf.wgsl.js +619 -0
  111. package/dist/wgsl/bsdf.wgsl.js.map +1 -0
  112. package/dist/wgsl/bvh.wgsl.d.ts +3 -0
  113. package/dist/wgsl/bvh.wgsl.d.ts.map +1 -0
  114. package/dist/wgsl/bvh.wgsl.js +218 -0
  115. package/dist/wgsl/bvh.wgsl.js.map +1 -0
  116. package/dist/wgsl/common.wgsl.d.ts +3 -0
  117. package/dist/wgsl/common.wgsl.d.ts.map +1 -0
  118. package/dist/wgsl/common.wgsl.js +193 -0
  119. package/dist/wgsl/common.wgsl.js.map +1 -0
  120. package/dist/wgsl/environment.wgsl.d.ts +10 -0
  121. package/dist/wgsl/environment.wgsl.d.ts.map +1 -0
  122. package/dist/wgsl/environment.wgsl.js +145 -0
  123. package/dist/wgsl/environment.wgsl.js.map +1 -0
  124. package/dist/wgsl/lights.wgsl.d.ts +10 -0
  125. package/dist/wgsl/lights.wgsl.d.ts.map +1 -0
  126. package/dist/wgsl/lights.wgsl.js +434 -0
  127. package/dist/wgsl/lights.wgsl.js.map +1 -0
  128. package/dist/wgsl/pathTrace.wgsl.d.ts +14 -0
  129. package/dist/wgsl/pathTrace.wgsl.d.ts.map +1 -0
  130. package/dist/wgsl/pathTrace.wgsl.js +1020 -0
  131. package/dist/wgsl/pathTrace.wgsl.js.map +1 -0
  132. package/dist/wgsl/present.wgsl.d.ts +7 -0
  133. package/dist/wgsl/present.wgsl.d.ts.map +1 -0
  134. package/dist/wgsl/present.wgsl.js +154 -0
  135. package/dist/wgsl/present.wgsl.js.map +1 -0
  136. package/dist/wgsl/random.wgsl.d.ts +9 -0
  137. package/dist/wgsl/random.wgsl.d.ts.map +1 -0
  138. package/dist/wgsl/random.wgsl.js +91 -0
  139. package/dist/wgsl/random.wgsl.js.map +1 -0
  140. package/dist/wgsl/sampling.wgsl.d.ts +3 -0
  141. package/dist/wgsl/sampling.wgsl.d.ts.map +1 -0
  142. package/dist/wgsl/sampling.wgsl.js +31 -0
  143. package/dist/wgsl/sampling.wgsl.js.map +1 -0
  144. package/dist/wgsl/shaderSupport.wgsl.d.ts +6 -0
  145. package/dist/wgsl/shaderSupport.wgsl.d.ts.map +1 -0
  146. package/dist/wgsl/shaderSupport.wgsl.js +120 -0
  147. package/dist/wgsl/shaderSupport.wgsl.js.map +1 -0
  148. package/dist/wgsl/surface.wgsl.d.ts +10 -0
  149. package/dist/wgsl/surface.wgsl.d.ts.map +1 -0
  150. package/dist/wgsl/surface.wgsl.js +794 -0
  151. package/dist/wgsl/surface.wgsl.js.map +1 -0
  152. package/dist/wgsl/texture.wgsl.d.ts +11 -0
  153. package/dist/wgsl/texture.wgsl.d.ts.map +1 -0
  154. package/dist/wgsl/texture.wgsl.js +132 -0
  155. package/dist/wgsl/texture.wgsl.js.map +1 -0
  156. package/package.json +76 -3
  157. package/src/accumulator.ts +64 -0
  158. package/src/bvh.ts +272 -0
  159. package/src/camera.ts +77 -0
  160. package/src/canvas.ts +13 -0
  161. package/src/denoise.ts +514 -0
  162. package/src/device.ts +81 -0
  163. package/src/dispatchScheduler.ts +71 -0
  164. package/src/environment.ts +233 -0
  165. package/src/frameLayout.ts +59 -0
  166. package/src/geometry.ts +899 -0
  167. package/src/index.ts +61 -0
  168. package/src/lights.ts +365 -0
  169. package/src/materialLayout.ts +408 -0
  170. package/src/math.ts +48 -0
  171. package/src/pathTracePass.ts +97 -0
  172. package/src/planarCapture.ts +225 -0
  173. package/src/presentPass.ts +99 -0
  174. package/src/renderer.ts +1117 -0
  175. package/src/sceneAssets.ts +118 -0
  176. package/src/sceneUpload.ts +185 -0
  177. package/src/shaderModule.ts +19 -0
  178. package/src/shaderProgram.ts +1370 -0
  179. package/src/structLayout.ts +93 -0
  180. package/src/texturePack.ts +152 -0
  181. package/src/upstream.ts +56 -0
  182. package/src/volumetric.ts +42 -0
  183. package/src/wgsl/bsdf.wgsl.ts +618 -0
  184. package/src/wgsl/bvh.wgsl.ts +217 -0
  185. package/src/wgsl/common.wgsl.ts +193 -0
  186. package/src/wgsl/environment.wgsl.ts +144 -0
  187. package/src/wgsl/lights.wgsl.ts +433 -0
  188. package/src/wgsl/pathTrace.wgsl.ts +1019 -0
  189. package/src/wgsl/present.wgsl.ts +153 -0
  190. package/src/wgsl/random.wgsl.ts +90 -0
  191. package/src/wgsl/sampling.wgsl.ts +30 -0
  192. package/src/wgsl/shaderSupport.wgsl.ts +119 -0
  193. package/src/wgsl/surface.wgsl.ts +793 -0
  194. package/src/wgsl/texture.wgsl.ts +131 -0
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Reading a texel by hand, because core WebGPU offers no other way here: there are no binding arrays, and one
3
+ * texture_2d_array would force a single size and format on a scene that has neither. The filtering, the wrap modes and
4
+ * the sRGB decode follow texture.js in the CPU renderer so the two agree on what a texture says.
5
+ *
6
+ * Only the top level is read. A rasterizer needs mip levels to stop minified texture detail from aliasing, but this
7
+ * renderer already draws many jittered samples through every pixel, which averages that detail properly instead of
8
+ * approximating it. Levels would buy memory locality, not correctness, so they can wait.
9
+ */
10
+ export const TEXTURE_WGSL = /* wgsl */ `
11
+ const TEXTURE_FLOAT: u32 = 1u;
12
+ const TEXTURE_SRGB: u32 = 2u;
13
+ const TEXTURE_NEAREST: u32 = 4u;
14
+ const TEXTURE_FLIP_Y: u32 = 8u;
15
+
16
+ // Three's own wrap constants. Anything else clamps, as it does in the CPU renderer.
17
+ const WRAP_REPEAT: u32 = 1000u;
18
+ const WRAP_MIRROR: u32 = 1002u;
19
+
20
+ /** Brings a texel index inside the texture the way the wrap mode says to. */
21
+ fn wrapIndex(index: i32, size: i32, mode: u32) -> i32 {
22
+ if (mode == WRAP_REPEAT) {
23
+ return ((index % size) + size) % size;
24
+ }
25
+
26
+ if (mode == WRAP_MIRROR) {
27
+ let period = size * 2;
28
+ let folded = ((index % period) + period) % period;
29
+
30
+ return select(period - 1 - folded, folded, folded < size);
31
+ }
32
+
33
+ return clamp(index, 0, size - 1);
34
+ }
35
+
36
+ fn srgbChannelToLinear(value: f32) -> f32 {
37
+ return select(pow((value + 0.055) / 1.055, 2.4), value / 12.92, value <= 0.04045);
38
+ }
39
+
40
+ /** One texel, in linear light. Alpha is never encoded, as in Three. */
41
+ fn readTexel(info: TextureInfo, x: i32, y: i32) -> vec4<f32> {
42
+ let index = u32(y) * info.size.x + u32(x);
43
+
44
+ if ((info.flags & TEXTURE_FLOAT) != 0u) {
45
+ let at = info.offset + index * 4u;
46
+
47
+ return vec4<f32>(
48
+ bitcast<f32>(textures[at]),
49
+ bitcast<f32>(textures[at + 1u]),
50
+ bitcast<f32>(textures[at + 2u]),
51
+ bitcast<f32>(textures[at + 3u]));
52
+ }
53
+
54
+ let word = textures[info.offset + index];
55
+ let raw = vec4<f32>(
56
+ f32(word & 0xffu),
57
+ f32((word >> 8u) & 0xffu),
58
+ f32((word >> 16u) & 0xffu),
59
+ f32((word >> 24u) & 0xffu)) / 255.0;
60
+
61
+ if ((info.flags & TEXTURE_SRGB) != 0u) {
62
+ return vec4<f32>(
63
+ srgbChannelToLinear(raw.r), srgbChannelToLinear(raw.g), srgbChannelToLinear(raw.b), raw.a);
64
+ }
65
+
66
+ return raw;
67
+ }
68
+
69
+ /** One texture of the table, sampled with its own transform, wrap modes and filter. */
70
+ fn sampleTextureAt(index: u32, uv: vec2<f32>) -> vec4<f32> {
71
+ let info = textureInfo(index);
72
+ // The affine transform Three keeps on the texture, one row at a time.
73
+ let transformed = vec2<f32>(
74
+ dot(info.rowU.xyz, vec3<f32>(uv, 1.0)),
75
+ dot(info.rowV.xyz, vec3<f32>(uv, 1.0)));
76
+
77
+ return sampleTextureInfo(info, transformed);
78
+ }
79
+
80
+ /**
81
+ * A texture read the way GLSL's texture2D reads it: at the coordinates given, with no transform. Three applies a
82
+ * texture's matrix in its own materials' shaders, so a shader of the scene's, an environment lookup and a light's
83
+ * projected map do not get it.
84
+ */
85
+ fn sampleTextureRaw(index: u32, uv: vec2<f32>) -> vec4<f32> {
86
+ return sampleTextureInfo(textureInfo(index), uv);
87
+ }
88
+
89
+ /** Three's equirectUv: longitude across, and latitude up from the bottom of the image, as GL reads it. */
90
+ fn equirectUv(direction: vec3<f32>) -> vec2<f32> {
91
+ let d = normalize(direction);
92
+
93
+ return vec2<f32>(atan2(d.z, d.x) / (2.0 * PI) + 0.5, asin(clamp(d.y, -1.0, 1.0)) / PI + 0.5);
94
+ }
95
+
96
+ /** An environment map of the scene's: an equirectangular image, or a cube map the snapshot already unwrapped into one. */
97
+ fn sampleEquirect(index: u32, direction: vec3<f32>) -> vec4<f32> {
98
+ return sampleTextureRaw(index, equirectUv(direction));
99
+ }
100
+
101
+ fn sampleTextureInfo(info: TextureInfo, transformed: vec2<f32>) -> vec4<f32> {
102
+ if (!all(transformed == transformed) || info.size.x == 0u || info.size.y == 0u) {
103
+ return vec4<f32>(0.0);
104
+ }
105
+
106
+ let flipped = select(transformed.y, 1.0 - transformed.y, (info.flags & TEXTURE_FLIP_Y) != 0u);
107
+ let size = vec2<i32>(info.size);
108
+ // The half texel offset that puts a sample in the middle of a texel, as on a graphics pipeline.
109
+ let centred = vec2<f32>(transformed.x, flipped) * vec2<f32>(info.size) - 0.5;
110
+
111
+ if ((info.flags & TEXTURE_NEAREST) != 0u) {
112
+ let at = vec2<i32>(floor(centred + 0.5));
113
+
114
+ return readTexel(info, wrapIndex(at.x, size.x, info.wrapS), wrapIndex(at.y, size.y, info.wrapT));
115
+ }
116
+
117
+ let low = floor(centred);
118
+ let fraction = centred - low;
119
+ let base = vec2<i32>(low);
120
+ let x0 = wrapIndex(base.x, size.x, info.wrapS);
121
+ let x1 = wrapIndex(base.x + 1, size.x, info.wrapS);
122
+ let y0 = wrapIndex(base.y, size.y, info.wrapT);
123
+ let y1 = wrapIndex(base.y + 1, size.y, info.wrapT);
124
+
125
+ // The four corners are blended in linear light, which is why the decode happens per texel above.
126
+ return mix(
127
+ mix(readTexel(info, x0, y0), readTexel(info, x1, y0), fraction.x),
128
+ mix(readTexel(info, x0, y1), readTexel(info, x1, y1), fraction.x),
129
+ fraction.y);
130
+ }
131
+ `;