@meimu/mutracer 0.3.0 → 0.3.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.
Files changed (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -5,9 +5,8 @@ import { read } from '../math/access.js';
5
5
  export const WGPU_SCENE_BUFFER_MIN_BYTES = 200;
6
6
  const FIXED_LIGHT_COUNT = 64;
7
7
  const PIXELS_PER_LIGHT = 6;
8
- export function makeRayTraceUniform() {
8
+ function makeRayTraceUniformCore(RayTraceUniformValues) {
9
9
  // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html
10
- const RayTraceUniformValues = new ArrayBuffer(320);
11
10
  const RayTraceUniformViews = {
12
11
  outputSize: new Float32Array(RayTraceUniformValues, 0, 2),
13
12
  sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),
@@ -58,6 +57,7 @@ export function makeRayTraceUniform() {
58
57
  views: RayTraceUniformViews
59
58
  };
60
59
  }
60
+ export function makeRayTraceUniform() { return makeRayTraceUniformCore(new ArrayBuffer(320)); }
61
61
  export function packWgpuAnalyticLights(lights, texturesIndices, selectionPmfs, iesProfileTexelOffset) {
62
62
  validateSceneLights(lights);
63
63
  const numLights = lights.length;
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSceneUniform.js","sourceRoot":"","sources":["../../src/renderer/wgpuSceneUniform.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type {ReadonlyMathArray} from '../math/types.js';\nimport { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read } from '../math/access.js';\nexport const WGPU_SCENE_BUFFER_MIN_BYTES = 200;\nconst FIXED_LIGHT_COUNT = 64;\nconst PIXELS_PER_LIGHT = 6;\n\nexport function makeRayTraceUniform() {\n // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html\n const RayTraceUniformValues = new ArrayBuffer(320);\n const RayTraceUniformViews = {\n outputSize: new Float32Array(RayTraceUniformValues, 0, 2),\n sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),\n scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),\n lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),\n transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),\n jitter: new Float32Array(RayTraceUniformValues, 40, 2),\n backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),\n groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),\n groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),\n blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),\n isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),\n bevel: new Int32Array(RayTraceUniformValues, 96, 1),\n dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),\n envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),\n lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),\n lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),\n lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),\n lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),\n bounces: new Int32Array(RayTraceUniformValues, 124, 1),\n varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),\n adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),\n clamping: new Float32Array(RayTraceUniformValues, 136, 1),\n directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),\n backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),\n loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),\n sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),\n sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),\n zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),\n sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),\n shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),\n environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),\n backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),\n backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)\n };\n // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for\n // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.\n RayTraceUniformViews.loopUnrollGuard[0] = 4;\n RayTraceUniformViews.environmentRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapTransform.set([1,0,1,0]);\n RayTraceUniformViews.bevel[0] = 1;\n RayTraceUniformViews.dispersionWavelengths[0] = 3;\n return {\n buffer: RayTraceUniformValues,\n views: RayTraceUniformViews\n };\n}\nexport function packWgpuAnalyticLights(\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: number[],\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n if (numLights > FIXED_LIGHT_COUNT) {\n console.warn(\n `Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`\n );\n }\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3<T extends ReadonlyMathArray>(idx: number, v: T) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n const lightTypeConstants = {\n DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,\n SphereLight: CONSTANT_SPHERE_LIGHT,\n RectLight: CONSTANT_RECT_LIGHT,\n SpotLight: CONSTANT_SPOT_LIGHT\n };\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const matrix = matrixStorage(light.transform);\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [matrix[12], matrix[13], matrix[14]]\n );\n data[off * 4 + 3] = lightTypeConstants[light.type];\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n if (light.type === 'RectLight') {\n data[(off + 1) * 4 + 3] = getRectLightArea(light);\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n } else if (light.type === 'SphereLight') {\n data[(off + 1) * 4 + 3] = getSphereLightArea(light);\n data[(off + 2) * 4 + 3] = light.radius;\n } else if (light.type === 'SpotLight') {\n data[(off + 1) * 4 + 3] = getSpotLightArea(light);\n packVec3(off + 2, getLightDirection(light));\n data[(off + 2) * 4 + 3] = light.radius;\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n }\n data[(off + 3) * 4 + 3] = light.type === 'SpotLight'\n ? iesProfileTexelOffset(i) ?? -1\n : texturesIndices[i] ?? -1;\n data[(off + 4) * 4] = selectionPmfs[i] ?? 0;\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n"]}
1
+ {"version":3,"file":"wgpuSceneUniform.js","sourceRoot":"","sources":["../../src/renderer/wgpuSceneUniform.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type {ReadonlyMathArray} from '../math/types.js';\nimport { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read } from '../math/access.js';\nexport const WGPU_SCENE_BUFFER_MIN_BYTES = 200;\nconst FIXED_LIGHT_COUNT = 64;\nconst PIXELS_PER_LIGHT = 6;\n\nfunction makeRayTraceUniformCore(RayTraceUniformValues: ArrayBuffer) {\n // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html\n const RayTraceUniformViews = {\n outputSize: new Float32Array(RayTraceUniformValues, 0, 2),\n sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),\n scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),\n lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),\n transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),\n jitter: new Float32Array(RayTraceUniformValues, 40, 2),\n backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),\n groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),\n groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),\n blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),\n isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),\n bevel: new Int32Array(RayTraceUniformValues, 96, 1),\n dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),\n envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),\n lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),\n lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),\n lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),\n lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),\n bounces: new Int32Array(RayTraceUniformValues, 124, 1),\n varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),\n adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),\n clamping: new Float32Array(RayTraceUniformValues, 136, 1),\n directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),\n backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),\n loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),\n sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),\n sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),\n zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),\n sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),\n shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),\n environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),\n backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),\n backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)\n };\n // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for\n // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.\n RayTraceUniformViews.loopUnrollGuard[0] = 4;\n RayTraceUniformViews.environmentRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapTransform.set([1,0,1,0]);\n RayTraceUniformViews.bevel[0] = 1;\n RayTraceUniformViews.dispersionWavelengths[0] = 3;\n return {\n buffer: RayTraceUniformValues,\n views: RayTraceUniformViews\n };\n}\nexport function makeRayTraceUniform() { return makeRayTraceUniformCore(new ArrayBuffer(320)); }\n\nexport function packWgpuAnalyticLights(\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: number[],\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n if (numLights > FIXED_LIGHT_COUNT) {\n console.warn(\n `Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`\n );\n }\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3<T extends ReadonlyMathArray>(idx: number, v: T) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n const lightTypeConstants = {\n DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,\n SphereLight: CONSTANT_SPHERE_LIGHT,\n RectLight: CONSTANT_RECT_LIGHT,\n SpotLight: CONSTANT_SPOT_LIGHT\n };\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const matrix = matrixStorage(light.transform);\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [matrix[12], matrix[13], matrix[14]]\n );\n data[off * 4 + 3] = lightTypeConstants[light.type];\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n if (light.type === 'RectLight') {\n data[(off + 1) * 4 + 3] = getRectLightArea(light);\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n } else if (light.type === 'SphereLight') {\n data[(off + 1) * 4 + 3] = getSphereLightArea(light);\n data[(off + 2) * 4 + 3] = light.radius;\n } else if (light.type === 'SpotLight') {\n data[(off + 1) * 4 + 3] = getSpotLightArea(light);\n packVec3(off + 2, getLightDirection(light));\n data[(off + 2) * 4 + 3] = light.radius;\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n }\n data[(off + 3) * 4 + 3] = light.type === 'SpotLight'\n ? iesProfileTexelOffset(i) ?? -1\n : texturesIndices[i] ?? -1;\n data[(off + 4) * 4] = selectionPmfs[i] ?? 0;\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n"]}
@@ -1,6 +1,21 @@
1
1
  import { type RayTraceInputHooks } from './wgsl/rayTrace.compute.js';
2
2
  export interface WGPUShaderFeatures {
3
+ /** Native wgpu binding arrays. Default false. */
4
+ independentTextures?: boolean;
5
+ /** Internal host budget. Default 20 preserves native shader generation. */
6
+ maxPathEvents?: number;
7
+ /** Web TLAS leaf boxes. Default false retains the native layout. */
8
+ perInstanceBounds?: boolean;
9
+ /** Full RGB reservoir targets for browser spectral paths. Default false. */
10
+ channelIndependentRis?: boolean;
11
+ /** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */
12
+ shareSpectralPrefix?: boolean;
13
+ /** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */
14
+ displayAovStorage?: boolean;
3
15
  hasDisplacement: boolean;
16
+ /** Browser camera extension; false preserves the native uniform layout. */
17
+ cameraProjectionInverse?: boolean;
18
+ compactVertices?: boolean;
4
19
  debugGroup?: number;
5
20
  /** Invocation block edge; the native host matches dispatch to this value. Default 8. */
6
21
  workgroupSize?: number;
@@ -22,7 +22,7 @@ export function wgpuShaderPreamble(constants, bake = false) {
22
22
  }
23
23
  export function wgpuShaderSource(constants, features, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
24
24
  constants = researchTransport()?.constants(constants, features) ?? constants;
25
- return wgpuShaderPreamble(constants, bake) + rayTraceCompute({
25
+ return (features.independentTextures ? 'enable wgpu_binding_array;\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({
26
26
  ...features,
27
27
  spectral: bake ? Boolean(constants.SPECTRAL) : undefined,
28
28
  sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"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","sourcesContent":["import {researchTransport} from './researchTransport.js';\nimport rayTraceCompute, {type RayTraceInputHooks} from './wgsl/rayTrace.compute.js';\nimport { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';\nimport { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';\n\nexport interface WGPUShaderFeatures {\n hasDisplacement: boolean;\n debugGroup?: number;\n /** Invocation block edge; the native host matches dispatch to this value. Default 8. */\n workgroupSize?:number;\n lightTracing?: boolean;\n photonMapping?:boolean;\n photonMaxDepth?:number;\n photonDirectSubset?:boolean;\n hasAlpha: boolean;\n hasSceneAlpha: boolean;\n hasAnisotropyDirections: boolean;\n hasCoatNormals: boolean;\n blasLayoutMask: number;\n /** Environment presence changes background/MIS semantics independently of packed material data. */\n dynamicEnvironment?: boolean;\n}\nexport const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];\nconst constantsNotUsed = [\n ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',\n 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',\n 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'\n];\nexport function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>) {\n return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));\n}\nexport function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake = false): string {\n const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\\n');\n const keys = wgpuPipelineConstantKeys(constants);\n const constantsCode = keys.map(key => {\n const value = constants[key];\n return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;\n }).join('\\n');\n return `\\n${defineCode}\\n${constantsCode}\\n`;\n}\nexport function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks?: RayTraceInputHooks): string {\n constants = researchTransport()?.constants(constants, features) ?? constants;\n return wgpuShaderPreamble(constants, bake) + rayTraceCompute({\n ...features,\n spectral: bake ? Boolean(constants.SPECTRAL) : undefined,\n sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,\n materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,\n lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined\n }, sceneIntersections, pathDiagnostic, inputHooks);\n}\n"]}
1
+ {"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"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","sourcesContent":["import {researchTransport} from './researchTransport.js';\nimport rayTraceCompute, {type RayTraceInputHooks} from './wgsl/rayTrace.compute.js';\nimport { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';\nimport { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';\n\nexport interface WGPUShaderFeatures {\n /** Native wgpu binding arrays. Default false. */\n independentTextures?: boolean;\n /** Internal host budget. Default 20 preserves native shader generation. */\n maxPathEvents?: number;\n /** Web TLAS leaf boxes. Default false retains the native layout. */\n perInstanceBounds?: boolean;\n /** Full RGB reservoir targets for browser spectral paths. Default false. */\n channelIndependentRis?: boolean;\n /** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */\n shareSpectralPrefix?: boolean;\n /** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */\n displayAovStorage?: boolean;\n hasDisplacement: boolean;\n /** Browser camera extension; false preserves the native uniform layout. */\n cameraProjectionInverse?: boolean;\n compactVertices?: boolean;\n debugGroup?: number;\n /** Invocation block edge; the native host matches dispatch to this value. Default 8. */\n workgroupSize?:number;\n lightTracing?: boolean;\n photonMapping?:boolean;\n photonMaxDepth?:number;\n photonDirectSubset?:boolean;\n hasAlpha: boolean;\n hasSceneAlpha: boolean;\n hasAnisotropyDirections: boolean;\n hasCoatNormals: boolean;\n blasLayoutMask: number;\n /** Environment presence changes background/MIS semantics independently of packed material data. */\n dynamicEnvironment?: boolean;\n}\nexport const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];\nconst constantsNotUsed = [\n ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',\n 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',\n 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'\n];\nexport function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>) {\n return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));\n}\nexport function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake = false): string {\n const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\\n');\n const keys = wgpuPipelineConstantKeys(constants);\n const constantsCode = keys.map(key => {\n const value = constants[key];\n return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;\n }).join('\\n');\n return `\\n${defineCode}\\n${constantsCode}\\n`;\n}\nexport function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks?: RayTraceInputHooks): string {\n constants = researchTransport()?.constants(constants, features) ?? constants;\n return (features.independentTextures ? 'enable wgpu_binding_array;\\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({\n ...features,\n spectral: bake ? Boolean(constants.SPECTRAL) : undefined,\n sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,\n materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,\n lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined\n }, sceneIntersections, pathDiagnostic, inputHooks);\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const aovCompactStorage = "\noverride AOV_COMPACT: bool = false;\nfn aovUnpack(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}\nfn aovPack(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}\n";
2
+ export declare function compactAovReadShader(code: string, declaration: string, type: string): string;
3
+ /** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */
4
+ export declare function compactAovResolveCode(code: string): string;
@@ -0,0 +1,26 @@
1
+ // Display-resolution reflectance/depth uses 24 B/px: float depth/hit count
2
+ // and two half-packed vec4 reflectances. The default layout stays 64 B/px.
3
+ export const aovCompactStorage = /* wgsl */ `
4
+ override AOV_COMPACT: bool = false;
5
+ fn rY(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}
6
+ fn yD(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}
7
+ `;
8
+ export function compactAovReadShader(code, declaration, type) {
9
+ return aovCompactStorage + code.replace(declaration, `@group(0) @binding(0) var<storage,read> accumulation: array<u32>;
10
+ fn yI(source: u32) -> ${type} {
11
+ if(AOV_COMPACT){let o=source*6u;return ${type}(vec4f(bitcast<f32>(accumulation[o]),0,0,0),
12
+ vec4f(0,0,0,bitcast<f32>(accumulation[o+1u])),rY(vec2u(accumulation[o+2u],accumulation[o+3u])),rY(vec2u(accumulation[o+4u],accumulation[o+5u])));}
13
+ let o=source*16u;
14
+ return ${type}(bitcast<vec4f>(vec4u(accumulation[o],accumulation[o+1u],accumulation[o+2u],accumulation[o+3u])),
15
+ bitcast<vec4f>(vec4u(accumulation[o+4u],accumulation[o+5u],accumulation[o+6u],accumulation[o+7u])),
16
+ bitcast<vec4f>(vec4u(accumulation[o+8u],accumulation[o+9u],accumulation[o+10u],accumulation[o+11u])),
17
+ bitcast<vec4f>(vec4u(accumulation[o+12u],accumulation[o+13u],accumulation[o+14u],accumulation[o+15u])));
18
+ }`).split(`let pixel=accumulation[source];`).join(`let pixel=yI(source);`).replace(`let pixel = accumulation[index];`, `let pixel = yI(index);`);
19
+ }
20
+ /** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */
21
+ export function compactAovResolveCode(code) {
22
+ return code.includes(`struct DisplayAovAccum`)
23
+ ? compactAovReadShader(code, `@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;`, `DisplayAovAccum`)
24
+ : compactAovReadShader(code, `@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;`, `AovResolvedAccumulation`);
25
+ }
26
+ //# sourceMappingURL=aovCompact.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovCompact.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovCompact.wgsl.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;CAI3C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,WAAmB,EAAE,IAAY;IAClF,OAAO,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC1B,IAAI;yCACU,IAAI;;;SAGpC,IAAI;;;;EAIb,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,uBAA4B,CAAC,CAAC,OAAO,CAAC,kCAAkC,EAAE,wBAA6B,CAAC,CAAC;AAC3J,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC5C,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,gFAAgF,EAAE,iBAAiB,CAAC;QACjI,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,uFAAuF,EAAE,yBAAyB,CAAC,CAAC;AACrJ,CAAC","sourcesContent":["// Display-resolution reflectance/depth uses 24 B/px: float depth/hit count\n// and two half-packed vec4 reflectances. The default layout stays 64 B/px.\nexport const aovCompactStorage = /* wgsl */ `\noverride AOV_COMPACT: bool = false;\nfn aovUnpack(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}\nfn aovPack(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}\n`;\n\nexport function compactAovReadShader(code: string, declaration: string, type: string): string {\n return aovCompactStorage + code.replace(declaration, `@group(0) @binding(0) var<storage,read> accumulation: array<u32>;\nfn loadAov(source: u32) -> ${type} {\n if(AOV_COMPACT){let o=source*6u;return ${type}(vec4f(bitcast<f32>(accumulation[o]),0,0,0),\n vec4f(0,0,0,bitcast<f32>(accumulation[o+1u])),aovUnpack(vec2u(accumulation[o+2u],accumulation[o+3u])),aovUnpack(vec2u(accumulation[o+4u],accumulation[o+5u])));}\n let o=source*16u;\n return ${type}(bitcast<vec4f>(vec4u(accumulation[o],accumulation[o+1u],accumulation[o+2u],accumulation[o+3u])),\n bitcast<vec4f>(vec4u(accumulation[o+4u],accumulation[o+5u],accumulation[o+6u],accumulation[o+7u])),\n bitcast<vec4f>(vec4u(accumulation[o+8u],accumulation[o+9u],accumulation[o+10u],accumulation[o+11u])),\n bitcast<vec4f>(vec4u(accumulation[o+12u],accumulation[o+13u],accumulation[o+14u],accumulation[o+15u])));\n}`).split(`let pixel=accumulation[source];`).join(`let pixel=loadAov(source);`).replace(`let pixel = accumulation[index];`, `let pixel = loadAov(index);`);\n}\n\n/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */\nexport function compactAovResolveCode(code: string): string {\n return code.includes(`struct DisplayAovAccum`)\n ? compactAovReadShader(code, `@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;`, `DisplayAovAccum`)\n : compactAovReadShader(code, `@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;`, `AovResolvedAccumulation`);\n}\n"]}
@@ -9,17 +9,17 @@ struct DisplayAovParams { sizeKind: vec4u, mapping: vec4f, flags: vec4u, }
9
9
  @group(0) @binding(2) var image: texture_storage_2d<${format}, write>;
10
10
  @group(0) @binding(3) var<uniform> params: DisplayAovParams;
11
11
 
12
- fn tG(input: u32) -> u32 {
12
+ fn vj(input: u32) -> u32 {
13
13
  var v = input;
14
14
  v = (v ^ (v >> 16u)) * 0x7feb352du;
15
15
  v = (v ^ (v >> 15u)) * 0x846ca68bu;
16
16
  return v ^ (v >> 16u);
17
17
  }
18
- fn tH(rgb: vec3f) -> vec3f {
18
+ fn vk(rgb: vec3f) -> vec3f {
19
19
  return select(1.055 * pow(max(rgb, vec3f(0.0)), vec3f(1.0 / 2.4)) - 0.055,
20
20
  12.92 * rgb, rgb <= vec3f(0.0031308));
21
21
  }
22
- fn sA(rgb: vec3f) -> vec3f {
22
+ fn tZ(rgb: vec3f) -> vec3f {
23
23
  return select(pow((rgb + 0.055) / 1.055, vec3f(2.4)), rgb / 12.92,
24
24
  rgb <= vec3f(0.04045));
25
25
  }
@@ -45,24 +45,24 @@ color = clamp(pixel.geometry.yzw * inv, vec3f(0.0), vec3f(1.0));
45
45
  } else if (kind == 3u || kind == 4u) {
46
46
  let r = select(pixel.diffuse, pixel.specular, kind == 4u);
47
47
  alpha = r.w / f32(max(params.sizeKind.z, 1u));
48
- color = tH(clamp(r.xyz / max(r.w, 1.0), vec3f(0.0), vec3f(1.0)));
48
+ color = vk(clamp(r.xyz / max(r.w, 1.0), vec3f(0.0), vec3f(1.0)));
49
49
  } else if (kind == 5u) {
50
50
  let identity = center[index].identity;
51
51
  alpha = select(1.0, 0.0, identity.x == 0xffffffffu);
52
- let hash = tG(identity[params.flags.x]);
52
+ let hash = vj(identity[params.flags.x]);
53
53
  color = 0.2 + 0.8 * vec3f(f32(hash & 255u), f32((hash >> 8u) & 255u),
54
54
  f32((hash >> 16u) & 255u)) / 255.0;
55
55
  } else {
56
56
  let m = center[index].motion;
57
57
  alpha = select(0.0, 1.0, m.w == 3.0);
58
- let gz = length(m.xy);
58
+ let gT = length(m.xy);
59
59
  var hue = 0.0;
60
- if (gz > 0.0) { hue = fract(atan2(m.y, m.x) / 6.28318530718 + 1.0); }
60
+ if (gT > 0.0) { hue = fract(atan2(m.y, m.x) / 6.28318530718 + 1.0); }
61
61
  let p = abs(fract(vec3f(hue) + vec3f(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);
62
- color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(gz / params.mapping.w, 0.0, 1.0);
62
+ color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(gT / params.mapping.w, 0.0, 1.0);
63
63
  }
64
64
  if (alpha <= 0.0) { color = vec3f(0.0); }
65
- if (params.flags.y != 0u) { color = sA(color); }
65
+ if (params.flags.y != 0u) { color = tZ(color); }
66
66
  textureStore(image, vec2i(id.xy), vec4f(color, clamp(alpha, 0.0, 1.0)));
67
67
  }
68
68
  `;
@@ -4,63 +4,63 @@ import proposals from './aovReflectanceSamples.wgsl.js';
4
4
  // evaluate diffuse and reflection together without traversing the full layered
5
5
  // BSDF twice. Callers reject coat, fuzz, anisotropy, SSS and thin film first.
6
6
  export default proposals + /* wgsl */ `
7
- struct nQ {
7
+ struct oP {
8
8
  diffuse: vec3f,
9
9
  specular: vec3f,
10
10
  }
11
- fn hu(prepared: OpenPbrPreparedBsdf, qH: bool, kE: bool) -> nQ {
12
- var result = nQ();
11
+ fn hO(prepared: OpenPbrPreparedBsdf, rV: bool, lp: bool) -> oP {
12
+ var result = oP();
13
13
  let view = prepared.viewLocal;
14
14
  if (view.z <= 1e-6) { return result; }
15
15
  let material = prepared.material;
16
16
  let alpha = vec2f(material.alphaX, material.alphaY);
17
- let lN = aD(view, alpha);
18
- let iR = prepared.weights[OPENPBR_LOBE_DIFFUSE];
19
- let fN = prepared.weights[OPENPBR_LOBE_METAL];
17
+ let mG = aD(view, alpha);
18
+ let jw = prepared.weights[OPENPBR_LOBE_DIFFUSE];
19
+ let fZ = prepared.weights[OPENPBR_LOBE_METAL];
20
20
  let specularWeight = prepared.weights[OPENPBR_LOBE_SPECULAR];
21
- var dS = 1.0;
22
- if (kE && prepared.dielectricMsProbability > 0.0) {
23
- dS = max(aY(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
21
+ var dY = 1.0;
22
+ if (lp && prepared.dielectricMsProbability > 0.0) {
23
+ dY = max(aZ(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
24
24
  }
25
- let ce = normalize(vec3f(alpha, 1.0) * view);
26
- let qG = min(ce.z, 1.0);
27
- let jN = 1.0 + qG;
25
+ let cf = normalize(vec3f(alpha, 1.0) * view);
26
+ let rU = min(cf.z, 1.0);
27
+ let ku = 1.0 + rU;
28
28
  let count = 256u * min(rtUniform.loopUnrollGuard, 4u) / 4u;
29
29
  for (var i = 0u; i < count; i++) {
30
- let wn = i / 2u;
31
- let u = vec2f((f32(wn) + 0.5) / f32(count / 2u),
32
- fract(f32(reverseBits(wn)) * 2.3283064365386963e-10 + 0.37));
33
- let proposal = gV[wn];
30
+ let pair = i / 2u;
31
+ let u = vec2f((f32(pair) + 0.5) / f32(count / 2u),
32
+ fract(f32(reverseBits(pair)) * 2.3283064365386963e-10 + 0.37));
33
+ let proposal = ht[pair];
34
34
 
35
35
 
36
- let hv = prepared.specularAlpha < 0.001 || count != 256u;
36
+ let hP = prepared.specularAlpha < 0.001 || count != 256u;
37
37
  var light = vec3f(proposal.xy, sqrt(max(0.0, 1.0 - dot(proposal.xy, proposal.xy))));
38
- if (hv) { light = aM(u); }
38
+ if (hP) { light = aM(u); }
39
39
  if ((i & 1u) != 0u) {
40
- let kf = (1.0 - u.y) * jN;
41
- let dr = sqrt(max(0.0, (kf + (1.0 - qG)) * (u.y * jN)));
42
- var half = normalize(vec3f(alpha, 1.0) * vec3f(ce.xy + dr * proposal.zw, kf));
43
- if (hv) { half = aA(view, alpha, u); }
40
+ let kM = (1.0 - u.y) * ku;
41
+ let dw = sqrt(max(0.0, (kM + (1.0 - rU)) * (u.y * ku)));
42
+ var half = normalize(vec3f(alpha, 1.0) * vec3f(cf.xy + dw * proposal.zw, kM));
43
+ if (hP) { half = aA(view, alpha, u); }
44
44
  light = reflect(-view, half);
45
45
  }
46
46
 
47
47
  if (light.z <= 0.0) { continue; }
48
48
  let half = normalize(view + light);
49
- let specularPdf = lN * sampling_ggx_ndf(half, alpha) / (4.0 * view.z);
49
+ let specularPdf = mG * sampling_ggx_ndf(half, alpha) / (4.0 * view.z);
50
50
  let pdf = 0.5 * (light.z * INVPI + specularPdf);
51
51
 
52
52
 
53
53
  let au = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
54
54
  if (au.z <= 0.0) { continue; }
55
55
  let scale = abs(au.z) / (pdf * f32(count));
56
- if (qH && iR > 0.0) {
56
+ if (rV && jw > 0.0) {
57
57
  let compensation = prepared.diffuseSpecularEnergyCompensation * ar(
58
58
  prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(au.z));
59
59
  var unusedPdf = 0.0;
60
- result.diffuse += iR * bw(material, prepared.diffuseColor,
60
+ result.diffuse += jw * bB(material, prepared.diffuseColor,
61
61
  view, au, compensation, &unusedPdf) * scale;
62
62
  }
63
- if (kE) {
63
+ if (lp) {
64
64
  let evaluatedHalf = normalize(view + au);
65
65
  let viewHalf = abs(dot(view, evaluatedHalf));
66
66
  var fresnel = vec3f(0.0);
@@ -69,30 +69,30 @@ var dielectric = vec3f(ae(viewHalf, material.relativeIor));
69
69
  if (material.thinWalled) { dielectric = aq(dielectric, material.transmissionWeight); }
70
70
  fresnel += specularWeight * material.specularColor * dielectric;
71
71
  }
72
- if (fN > 0.0) {
73
- fresnel += fN * material.specularWeight * openpbr_metal_fresnel(viewHalf,
72
+ if (fZ > 0.0) {
73
+ fresnel += fZ * material.specularWeight * openpbr_metal_fresnel(viewHalf,
74
74
  material.baseWeight * material.baseColor, material.specularColor);
75
75
  }
76
- let rE = sampling_ggx_ndf(evaluatedHalf, alpha) * lN
76
+ let sT = sampling_ggx_ndf(evaluatedHalf, alpha) * mG
77
77
  * aD(au, alpha) / (4.0 * max(au.z * view.z, 1e-8));
78
- var reflection = fresnel * rE;
79
- if (fN > 0.0 && prepared.metalMsFactor > 0.0) {
80
- let cv = min(prepared.metalMsFactor * aR(prepared.specularAlpha, au.z), 1.0 / max(au.z, 1e-8));
81
- reflection += fN * prepared.metalMsScale * cv * INVPI;
78
+ var reflection = fresnel * sT;
79
+ if (fZ > 0.0 && prepared.metalMsFactor > 0.0) {
80
+ let cA = min(prepared.metalMsFactor * aR(prepared.specularAlpha, au.z), 1.0 / max(au.z, 1e-8));
81
+ reflection += fZ * prepared.metalMsScale * cA * INVPI;
82
82
  }
83
83
  if (prepared.dielectricMsProbability > 0.0) {
84
- let oP = prepared.dielectricMsViewLoss * aV(
85
- prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(au.z)) / dS;
86
- let cv = min(oP * prepared.dielectricMsReflectionRatio, 1.0 / abs(au.z));
87
- reflection += prepared.dielectricMsReflectionScale * cv * INVPI;
84
+ let pX = prepared.dielectricMsViewLoss * aV(
85
+ prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(au.z)) / dY;
86
+ let cA = min(pX * prepared.dielectricMsReflectionRatio, 1.0 / abs(au.z));
87
+ reflection += prepared.dielectricMsReflectionScale * cA * INVPI;
88
88
  }
89
89
  result.specular += reflection * scale;
90
90
  }
91
91
  }
92
92
  return result;
93
93
  }
94
- fn wl(prepared: OpenPbrPreparedBsdf) -> nQ {
95
- return hu(prepared, true, true);
94
+ fn yk(prepared: OpenPbrPreparedBsdf) -> oP {
95
+ return hO(prepared, true, true);
96
96
  }
97
97
  `;
98
98
  //# sourceMappingURL=aovReflectance.wgsl.js.map
@@ -1,7 +1,7 @@
1
1
  // Generated by scripts/generate-aov-reflectance-samples.mjs; do not edit.
2
2
  // xy: concentric cosine disk; zw: spherical-cap azimuth cosine/sine.
3
3
  export default /* wgsl */ `
4
- const gV: array<vec4f, 128> = array<vec4f, 128>(
4
+ const ht: array<vec4f, 128> = array<vec4f, 128>(
5
5
  vec4f(-0.971247852, -0.202764958, 0.999698818, 0.0245412290),
6
6
  vec4f(-0.808660269, 0.547487736, 0.997290432, 0.0735645667),
7
7
  vec4f(-0.942509234, 0.187289074, 0.992479563, 0.122410677),
@@ -3,3 +3,7 @@ export declare const aovResolveCommon = "\nstruct AovResolvedAccumulation { geom
3
3
  /** Bit 8 of kind requests top row first. Kept for the native single-output pass. */
4
4
  declare const _default: string;
5
5
  export default _default;
6
+ /** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */
7
+ export declare const aovBorrowDepthShader: string;
8
+ /** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */
9
+ export declare const aovBorrowReflectanceShader: string;
@@ -5,7 +5,7 @@ struct AovResolvedCenter { identity: vec4u, motion: vec4f, }
5
5
  @group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;
6
6
  @group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;
7
7
  @group(0) @binding(3) var<uniform> parameters: vec4u;
8
- fn oj(source: u32, kind: u32) -> vec4u {
8
+ fn iU(source: u32, kind: u32) -> vec4u {
9
9
  if(kind==5u){return center[source].identity;}
10
10
  var value=vec4f(0.0);
11
11
  if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}
@@ -32,7 +32,26 @@ let width=parameters.x;let height=parameters.y;
32
32
  if(id.x>=width||id.y>=height){return;}
33
33
  let index=id.x+id.y*width;
34
34
  let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;
35
- output[index]=oj(source,parameters.w&255u);
35
+ output[index]=iU(source,parameters.w&255u);
36
36
  }
37
37
  `;
38
+ /** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */
39
+ export const aovBorrowDepthShader = aovResolveCommon + /* wgsl */ `
40
+ @group(0) @binding(2) var image: texture_storage_2d<rg32float,write>;
41
+ @compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id: vec3u) {
42
+ if(any(id.xy>=parameters.xy)){return;}
43
+ let source=id.x+(parameters.y-1u-id.y)*parameters.x;
44
+ let value=bitcast<vec4f>(iU(source,parameters.w));
45
+ textureStore(image,vec2i(id.xy),vec4f(value.x,value.w,0,0));
46
+ }`;
47
+ /** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */
48
+ export const aovBorrowReflectanceShader = aovResolveCommon + /* wgsl */ `
49
+ @vertex fn vertex(@builtin(vertex_index) index: u32) -> @builtin(position) vec4f {
50
+ let p=vec2f(f32((index<<1u)&2u),f32(index&2u));return vec4f(p*2.0-1.0,0,1);
51
+ }
52
+ @fragment fn fragment(@builtin(position) position: vec4f) -> @location(0) vec4f {
53
+ let id=vec2u(position.xy);
54
+ let source=id.x+(parameters.y-1u-id.y)*parameters.x;
55
+ return clamp(bitcast<vec4f>(iU(source,parameters.w)),vec4f(0),vec4f(1));
56
+ }`;
38
57
  //# sourceMappingURL=aovResolve.wgsl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"aovResolve.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovResolve.wgsl.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1C,CAAC;AACF,oFAAoF;AACpF,eAAe,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;CAU5C,CAAC","sourcesContent":["/** Shared normalization for readback and GPU denoiser snapshots. */\nexport const aovResolveCommon = /* wgsl */ `\nstruct AovResolvedAccumulation { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct AovResolvedCenter { identity: vec4u, motion: vec4f, }\n@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;\n@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;\n@group(0) @binding(3) var<uniform> parameters: vec4u;\nfn aovResolvedValue(source: u32, kind: u32) -> vec4u {\n if(kind==5u){return center[source].identity;}\n var value=vec4f(0.0);\n if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}\n else{\n let pixel=accumulation[source];let hits=pixel.position.w;\n let scale=select(0.0,1.0/max(hits,1.0),hits>0.0);let coverage=hits/f32(max(parameters.z,1u));\n if(kind==0u){value=vec4f(pixel.geometry.x*scale,0.0,0.0,coverage);}\n else if(kind==1u){value=vec4f(pixel.position.xyz*scale,coverage);}\n else if(kind==2u){value=vec4f(pixel.geometry.yzw*scale,coverage);}\n else{let reflectance=select(pixel.diffuse,pixel.specular,kind==4u);\n let inv=select(0.0,1.0/max(reflectance.w,1.0),reflectance.w>0.0);\n value=vec4f(reflectance.xyz*inv,reflectance.w/f32(max(parameters.z,1u)));\n }\n }\n return bitcast<vec4u>(value);\n}\n`;\n/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */\nexport default aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var<storage,read_write> output: array<vec4u>;\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;\n output[index]=aovResolvedValue(source,parameters.w&255u);\n}\n`;\n"]}
1
+ {"version":3,"file":"aovResolve.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovResolve.wgsl.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1C,CAAC;AACF,oFAAoF;AACpF,eAAe,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;CAU5C,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,UAAU,CAAC;;;;;;;EAOhE,CAAC;AACH,kFAAkF;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;EAQtE,CAAC","sourcesContent":["/** Shared normalization for readback and GPU denoiser snapshots. */\nexport const aovResolveCommon = /* wgsl */ `\nstruct AovResolvedAccumulation { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct AovResolvedCenter { identity: vec4u, motion: vec4f, }\n@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;\n@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;\n@group(0) @binding(3) var<uniform> parameters: vec4u;\nfn aovResolvedValue(source: u32, kind: u32) -> vec4u {\n if(kind==5u){return center[source].identity;}\n var value=vec4f(0.0);\n if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}\n else{\n let pixel=accumulation[source];let hits=pixel.position.w;\n let scale=select(0.0,1.0/max(hits,1.0),hits>0.0);let coverage=hits/f32(max(parameters.z,1u));\n if(kind==0u){value=vec4f(pixel.geometry.x*scale,0.0,0.0,coverage);}\n else if(kind==1u){value=vec4f(pixel.position.xyz*scale,coverage);}\n else if(kind==2u){value=vec4f(pixel.geometry.yzw*scale,coverage);}\n else{let reflectance=select(pixel.diffuse,pixel.specular,kind==4u);\n let inv=select(0.0,1.0/max(reflectance.w,1.0),reflectance.w>0.0);\n value=vec4f(reflectance.xyz*inv,reflectance.w/f32(max(parameters.z,1u)));\n }\n }\n return bitcast<vec4u>(value);\n}\n`;\n/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */\nexport default aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var<storage,read_write> output: array<vec4u>;\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;\n output[index]=aovResolvedValue(source,parameters.w&255u);\n}\n`;\n\n/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */\nexport const aovBorrowDepthShader = aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var image: texture_storage_2d<rg32float,write>;\n@compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id: vec3u) {\n if(any(id.xy>=parameters.xy)){return;}\n let source=id.x+(parameters.y-1u-id.y)*parameters.x;\n let value=bitcast<vec4f>(aovResolvedValue(source,parameters.w));\n textureStore(image,vec2i(id.xy),vec4f(value.x,value.w,0,0));\n}`;\n/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */\nexport const aovBorrowReflectanceShader = aovResolveCommon + /* wgsl */ `\n@vertex fn vertex(@builtin(vertex_index) index: u32) -> @builtin(position) vec4f {\n let p=vec2f(f32((index<<1u)&2u),f32(index&2u));return vec4f(p*2.0-1.0,0,1);\n}\n@fragment fn fragment(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let id=vec2u(position.xy);\n let source=id.x+(parameters.y-1u-id.y)*parameters.x;\n return clamp(bitcast<vec4f>(aovResolvedValue(source,parameters.w)),vec4f(0),vec4f(1));\n}`;\n"]}
@@ -1,4 +1,4 @@
1
- import { AOV_KINDS } from '../aov.js';
1
+ import { aovLaneKind } from '../aov.js';
2
2
  import { aovResolveCommon } from './aovResolve.wgsl.js';
3
3
  // Two input storage buffers leave six output slots on the baseline WebGPU
4
4
  // eight-storage-buffer limit. Binding 3 remains the shared uniform binding.
@@ -14,7 +14,7 @@ let width=parameters.x;let height=parameters.y;
14
14
  if(id.x>=width||id.y>=height){return;}
15
15
  let index=id.x+id.y*width;
16
16
  let source=id.x+(height-1u-id.y)*width;
17
- ${kinds.map((kind, i) => `output${i}[index]=oj(source,${AOV_KINDS.indexOf(kind)}u);`).join('\n ')}
17
+ ${kinds.map((kind, i) => `output${i}[index]=iU(source,${aovLaneKind(kind)}u);`).join('\n ')}
18
18
  }
19
19
  `;
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aovSnapshot.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovSnapshot.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAe,MAAM,WAAW,CAAC;AAClD,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAEtD,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAEjF,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,uBAAuB;QAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IACrH,OAAO,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3C,sBAAsB,kBAAkB,CAAC,CAAC,CAAC,mCAAmC,CAAC,iBAAiB,CACjG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;;;;;;;EAOxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,qBAAmC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;CAEjH,CAAC;AACF,CAAC","sourcesContent":["import {AOV_KINDS, type AovKind} from '../aov.js';\nimport {aovResolveCommon} from './aovResolve.wgsl.js';\n\n// Two input storage buffers leave six output slots on the baseline WebGPU\n// eight-storage-buffer limit. Binding 3 remains the shared uniform binding.\nexport const AOV_SNAPSHOT_BATCH_SIZE = 6;\nexport const aovSnapshotBinding = (index: number) => index === 0 ? 2 : index + 3;\n\nexport function aovSnapshotShader(kinds: readonly AovKind[]): string {\n if (!kinds.length || kinds.length > AOV_SNAPSHOT_BATCH_SIZE) throw new RangeError('Invalid AOV snapshot batch size');\n return aovResolveCommon + kinds.map((_, i) =>\n `@group(0) @binding(${aovSnapshotBinding(i)}) var<storage,read_write> output${i}: array<vec4u>;`\n ).join('\\n') + /* wgsl */ `\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+(height-1u-id.y)*width;\n ${kinds.map((kind, i) => `output${i}[index]=aovResolvedValue(source,${AOV_KINDS.indexOf(kind)}u);`).join('\\n ')}\n}\n`;\n}\n"]}
1
+ {"version":3,"file":"aovSnapshot.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovSnapshot.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAe,MAAM,WAAW,CAAC;AACpD,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAEtD,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAEjF,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,uBAAuB;QAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IACrH,OAAO,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3C,sBAAsB,kBAAkB,CAAC,CAAC,CAAC,mCAAmC,CAAC,iBAAiB,CACjG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;;;;;;;EAOxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,qBAAmC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;CAE3G,CAAC;AACF,CAAC","sourcesContent":["import {aovLaneKind, type AovKind} from '../aov.js';\nimport {aovResolveCommon} from './aovResolve.wgsl.js';\n\n// Two input storage buffers leave six output slots on the baseline WebGPU\n// eight-storage-buffer limit. Binding 3 remains the shared uniform binding.\nexport const AOV_SNAPSHOT_BATCH_SIZE = 6;\nexport const aovSnapshotBinding = (index: number) => index === 0 ? 2 : index + 3;\n\nexport function aovSnapshotShader(kinds: readonly AovKind[]): string {\n if (!kinds.length || kinds.length > AOV_SNAPSHOT_BATCH_SIZE) throw new RangeError('Invalid AOV snapshot batch size');\n return aovResolveCommon + kinds.map((_, i) =>\n `@group(0) @binding(${aovSnapshotBinding(i)}) var<storage,read_write> output${i}: array<vec4u>;`\n ).join('\\n') + /* wgsl */ `\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+(height-1u-id.y)*width;\n ${kinds.map((kind, i) => `output${i}[index]=aovResolvedValue(source,${aovLaneKind(kind)}u);`).join('\\n ')}\n}\n`;\n}\n"]}
@@ -15,15 +15,15 @@ struct AovCenter { identity: vec4u, motion: vec4f, }
15
15
  @group(3) @binding(9) var<storage, read> aovPrevious: array<AovCenter>;
16
16
  @group(3) @binding(8) var<uniform> aovParameters: vec4u;
17
17
 
18
- fn oi(offset: u32) -> mat4x4f {
18
+ fn lC(offset: u32) -> mat4x4f {
19
19
  return mat4x4f(bitcast<vec4f>(vec4u(aovScene[offset], aovScene[offset+1u], aovScene[offset+2u], aovScene[offset+3u])),
20
20
  bitcast<vec4f>(vec4u(aovScene[offset+4u], aovScene[offset+5u], aovScene[offset+6u], aovScene[offset+7u])),
21
21
  bitcast<vec4f>(vec4u(aovScene[offset+8u], aovScene[offset+9u], aovScene[offset+10u], aovScene[offset+11u])),
22
22
  bitcast<vec4f>(vec4u(aovScene[offset+12u], aovScene[offset+13u], aovScene[offset+14u], aovScene[offset+15u])));
23
23
  }
24
- fn iu(offset:u32)->vec3f {return bitcast<vec3f>(vec3u(aovScene[offset],aovScene[offset+1u],aovScene[offset+2u]));}
25
- fn mC(xG: Ray, si: ptr<function, SurfaceInteraction>, material: ptr<function, OpenPbrResolvedMaterial>) -> bool {
26
- var ray = xG;
24
+ fn iV(offset:u32)->vec3f {return bitcast<vec3f>(vec3u(aovScene[offset],aovScene[offset+1u],aovScene[offset+2u]));}
25
+ fn jS(zG: Ray, si: ptr<function, SurfaceInteraction>, material: ptr<function, OpenPbrResolvedMaterial>) -> bool {
26
+ var ray = zG;
27
27
  (*si).triangleIndex = -1;
28
28
  for (var layer = 0; layer < 32; layer++) {
29
29
  intersectScene(ray, si, 0, false, false);
@@ -41,21 +41,21 @@ if (any(id.xy >= size)) { return; }
41
41
  let index = id.x + id.y * size.x;
42
42
  let sample = aovParameters.z;
43
43
  if (sample == 0u) { aovAccum[index] = AovAccumulation(); }
44
- aI = id.xy; aC = sample + rtUniform.sampleSequenceOffset;
45
- samplingBounce = 0u; ca = 0u;
46
- fi(id.xy, i32(aC ^ cB(rtUniform.sequenceSeed)));
44
+ aJ = id.xy; aC = sample + rtUniform.sampleSequenceOffset;
45
+ samplingBounce = 0u; hashedCounter = 0u;
46
+ fA(id.xy, i32(aC ^ cD(rtUniform.sequenceSeed)));
47
47
  let uv = (vec2f(id.xy) + sample2D(CAMERA_PIXEL)) / vec2f(size);
48
- var ray = eT(uv);
48
+ var ray = cV(uv);
49
49
  if (cameraUniform.apertureRadius > 0.0) {
50
50
  let eye = cameraUniform.viewInv[3].xyz;
51
51
  let forward = -normalize(cameraUniform.viewInv[2].xyz);
52
- let ju = eye + ray.d * (cameraUniform.focusDistance / dot(ray.d, forward));
53
- let uV = cameraUniform.apertureRadius * kq(sample2D(CAMERA_LENS));
54
- let origin = (cameraUniform.viewInv * vec4f(uV, 0.0, 1.0)).xyz;
55
- initRay(&ray, origin, normalize(ju-origin));
52
+ let jY = eye + ray.d * (cameraUniform.focusDistance / dot(ray.d, forward));
53
+ let wJ = cameraUniform.apertureRadius * kX(sample2D(CAMERA_LENS));
54
+ let origin = (cameraUniform.viewInv * vec4f(wJ, 0.0, 1.0)).xyz;
55
+ initRay(&ray, origin, normalize(jY-origin));
56
56
  }
57
57
  var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
58
- if (!mC(ray, &si, &material)) { return; }
58
+ if (!jS(ray, &si, &material)) { return; }
59
59
  let depth = max(dot(si.position-cameraUniform.viewInv[3].xyz, -normalize(cameraUniform.viewInv[2].xyz)), 0.0);
60
60
  let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
61
61
  (material.coatWeight > 0.0) | (material.fuzzWeight > 0.0) |
@@ -66,17 +66,17 @@ let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
66
66
  aovAccum[index].depthRoughness += vec4f(depth, material.specularRoughness, material.baseMetalness, select(0.0,1.0,unsupported));
67
67
  if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {
68
68
  var normal=si.normal; var face=si.faceNormal;
69
- var cosine=-dot(normal,ray.d); var fa=-dot(face,ray.d);
69
+ var cosine=-dot(normal,ray.d); var fk=-dot(face,ray.d);
70
70
  if (material.thinWalled && (material.transmissionWeight>0.0 || material.subsurfaceWeight>0.0)) {
71
71
  if(cosine<0.0){normal=-normal;cosine=-cosine;}
72
- if(fa<0.0){face=-face;fa=-fa;}
72
+ if(fk<0.0){face=-face;fk=-fk;}
73
73
  }
74
- if(fa>=0.0 && cosine<0.0){normal=face;cosine=fa;}
74
+ if(fk>=0.0 && cosine<0.0){normal=face;cosine=fk;}
75
75
  normal=select(-normal,normal,cosine>=0.0);
76
76
  material.inside=(cosine<=0.0) && !material.thinWalled;
77
77
  material.relativeIor=select(material.specularIor,1.0/material.specularIor,cosine>0.0);
78
- let prepared=bV(si.tangent,material,-ray.d,normal);
79
- let reflectance=hu(prepared, (aovParameters.w & 8u) != 0u, (aovParameters.w & 16u) != 0u);
78
+ let prepared=bX(si.tangent,material,-ray.d,normal);
79
+ let reflectance=hO(prepared, (aovParameters.w & 8u) != 0u, (aovParameters.w & 16u) != 0u);
80
80
  aovAccum[index].diffuse+=vec4f(reflectance.diffuse,1.0);
81
81
  aovAccum[index].specular+=vec4f(reflectance.specular,1.0);
82
82
  }
@@ -89,26 +89,26 @@ if (any(id.xy >= size)) { return; }
89
89
  let index = id.x + id.y * size.x;
90
90
  aovCenter[index] = AovCenter(vec4u(0xffffffffu), vec4f(0.0));
91
91
  let uv = (vec2f(id.xy) + 0.5) / vec2f(size);
92
- let ray = eT(uv);
92
+ let ray = cV(uv);
93
93
  var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
94
- if (!mC(ray, &si, &material)) { return; }
94
+ if (!jS(ray, &si, &material)) { return; }
95
95
  let offset = 52u + u32(si.instanceIndex) * 24u;
96
96
  let materialOffset = aovScene[16u];
97
97
  let primitiveOffset = aovScene[17u];
98
98
  aovCenter[index].identity = vec4u(aovScene[offset], aovScene[offset+1u],
99
99
  aovScene[materialOffset + u32(si.materialIndex)], aovScene[primitiveOffset + u32(si.triangleIndex)]);
100
- aovCenter[index].motion.z = dot(si.position-iu(36u),iu(40u));
100
+ aovCenter[index].motion.z = dot(si.position-iV(36u),iV(40u));
101
101
  if (aovScene[offset+2u] == 0u) { return; }
102
- let qs = oi(offset+4u) * vec4f(si.position,1.0);
103
- let pg = oi(0u) * qs;
104
- if (pg.w <= 0.0) { return; }
105
- let ua=pg.xyz/pg.w;
106
- let hU=(ua.xy*0.5+0.5)*vec2f(size);
107
- if (any(hU < vec2f(0.0)) || any(hU >= vec2f(size)) || abs(ua.z)>1.0) { return; }
108
- let previous=aovPrevious[u32(hU.x)+u32(hU.y)*size.x];
109
- let qr=dot(qs.xyz-iu(44u),iu(48u));
110
- if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-qr)>max(1e-4,abs(qr)*1e-3)) { return; }
111
- let motion=(hU-(vec2f(id.xy)+0.5))*vec2f(1.0,-1.0);
102
+ let rF = lC(offset+4u) * vec4f(si.position,1.0);
103
+ let qp = lC(0u) * rF;
104
+ if (qp.w <= 0.0) { return; }
105
+ let vJ=qp.xyz/qp.w;
106
+ let iF=(vJ.xy*0.5+0.5)*vec2f(size);
107
+ if (any(iF < vec2f(0.0)) || any(iF >= vec2f(size)) || abs(vJ.z)>1.0) { return; }
108
+ let previous=aovPrevious[u32(iF.x)+u32(iF.y)*size.x];
109
+ let rE=dot(rF.xyz-iV(44u),iV(48u));
110
+ if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-rE)>max(1e-4,abs(rE)*1e-3)) { return; }
111
+ let motion=(iF-(vec2f(id.xy)+0.5))*vec2f(1.0,-1.0);
112
112
  aovCenter[index].motion=vec4f(motion,aovCenter[index].motion.z,3.0);
113
113
  }
114
114
  `;
@@ -0,0 +1,2 @@
1
+ declare const _default: string;
2
+ export default _default;