@meimu/mutracer 0.2.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 (372) 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/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -1,6 +1,28 @@
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;
19
+ debugGroup?: number;
20
+ /** Invocation block edge; the native host matches dispatch to this value. Default 8. */
21
+ workgroupSize?: number;
22
+ lightTracing?: boolean;
23
+ photonMapping?: boolean;
24
+ photonMaxDepth?: number;
25
+ photonDirectSubset?: boolean;
4
26
  hasAlpha: boolean;
5
27
  hasSceneAlpha: boolean;
6
28
  hasAnisotropyDirections: boolean;
@@ -1,3 +1,4 @@
1
+ import { researchTransport } from './researchTransport.js';
1
2
  import rayTraceCompute from './wgsl/rayTrace.compute.js';
2
3
  import { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';
3
4
  import { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';
@@ -20,7 +21,8 @@ export function wgpuShaderPreamble(constants, bake = false) {
20
21
  return `\n${defineCode}\n${constantsCode}\n`;
21
22
  }
22
23
  export function wgpuShaderSource(constants, features, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
23
- return wgpuShaderPreamble(constants, bake) + rayTraceCompute({
24
+ constants = researchTransport()?.constants(constants, features) ?? constants;
25
+ return (features.independentTextures ? 'enable wgpu_binding_array;\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({
24
26
  ...features,
25
27
  spectral: bake ? Boolean(constants.SPECTRAL) : undefined,
26
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":"AAAA,OAAO,eAA0C,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAYrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAChH,MAAM,gBAAgB,GAAG;IACvB,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,gBAAgB,EAAE,oBAAoB;IAC/E,yBAAyB,EAAE,GAAG,wBAAwB,EAAE,2BAA2B;IACnF,wBAAwB,EAAE,iBAAiB,EAAE,gBAAgB;CAC9D,CAAC;AACF,MAAM,UAAU,wBAAwB,CAAC,SAA2C;IAClF,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChI,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,SAA2C,EAAE,IAAI,GAAG,KAAK;IAC1F,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,MAAM,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;IAClI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,KAAK,UAAU,KAAK,aAAa,IAAI,CAAC;AAC/C,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,SAA2C,EAAE,QAA4B,EAAE,IAAI,GAAG,KAAK,EAAE,kBAAkB,GAAG,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,UAA+B;IACxM,OAAO,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC;QAC3D,GAAG,QAAQ;QACX,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QACxH,oBAAoB,EAAE,IAAI,IAAI,SAAS,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS;QACjI,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;KACzH,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import 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 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 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":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,eAA0C,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAkCrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAChH,MAAM,gBAAgB,GAAG;IACvB,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,gBAAgB,EAAE,oBAAoB;IAC/E,yBAAyB,EAAE,GAAG,wBAAwB,EAAE,2BAA2B;IACnF,wBAAwB,EAAE,iBAAiB,EAAE,gBAAgB;CAC9D,CAAC;AACF,MAAM,UAAU,wBAAwB,CAAC,SAA2C;IAClF,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChI,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,SAA2C,EAAE,IAAI,GAAG,KAAK;IAC1F,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,MAAM,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;IAClI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,KAAK,UAAU,KAAK,aAAa,IAAI,CAAC;AAC/C,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,SAA2C,EAAE,QAA4B,EAAE,IAAI,GAAG,KAAK,EAAE,kBAAkB,GAAG,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,UAA+B;IACxM,SAAS,GAAG,iBAAiB,EAAE,EAAE,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC;QAClI,GAAG,QAAQ;QACX,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QACxH,oBAAoB,EAAE,IAAI,IAAI,SAAS,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS;QACjI,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;KACzH,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC","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 tF(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 tG(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 sE(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 = tG(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 = tF(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 gR = length(m.xy);
58
+ let gT = length(m.xy);
59
59
  var hue = 0.0;
60
- if (gR > 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(gR / 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 = sE(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,95 +4,95 @@ 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 oa {
7
+ struct oP {
8
8
  diffuse: vec3f,
9
9
  specular: vec3f,
10
10
  }
11
- fn hN(prepared: ag, qQ: bool, kY: bool) -> oa {
12
- var result = oa();
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 mg = aF(view, alpha);
18
- let jl = prepared.weights[OPENPBR_LOBE_DIFFUSE];
19
- let gb = 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 ei = 1.0;
22
- if (kY && prepared.dielectricMsProbability > 0.0) {
23
- ei = max(bf(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 cr = normalize(vec3f(alpha, 1.0) * view);
26
- let qP = min(cr.z, 1.0);
27
- let kh = 1.0 + qP;
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 vV = i / 2u;
31
- let u = vec2f((f32(vV) + 0.5) / f32(count / 2u),
32
- fract(f32(reverseBits(vV)) * 2.3283064365386963e-10 + 0.37));
33
- let kK = hp[vV];
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 hO = prepared.specularAlpha < 0.001 || count != 256u;
37
- var light = vec3f(kK.xy, sqrt(max(0.0, 1.0 - dot(kK.xy, kK.xy))));
38
- if (hO) { light = aO(u); }
36
+ let hP = prepared.specularAlpha < 0.001 || count != 256u;
37
+ var light = vec3f(proposal.xy, sqrt(max(0.0, 1.0 - dot(proposal.xy, proposal.xy))));
38
+ if (hP) { light = aM(u); }
39
39
  if ((i & 1u) != 0u) {
40
- let kC = (1.0 - u.y) * kh;
41
- let ex = sqrt(max(0.0, (kC + (1.0 - qP)) * (u.y * kh)));
42
- var half = normalize(vec3f(alpha, 1.0) * vec3f(cr.xy + ex * kK.zw, kC));
43
- if (hO) { half = aD(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 qH = mg * cW(half, alpha) / (4.0 * view.z);
50
- let pdf = 0.5 * (light.z * INVPI + qH);
49
+ let specularPdf = mG * sampling_ggx_ndf(half, alpha) / (4.0 * view.z);
50
+ let pdf = 0.5 * (light.z * INVPI + specularPdf);
51
51
 
52
52
 
53
- let aA = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
54
- if (aA.z <= 0.0) { continue; }
55
- let scale = abs(aA.z) / (pdf * f32(count));
56
- if (qQ && jl > 0.0) {
57
- let compensation = prepared.diffuseSpecularEnergyCompensation * aw(
58
- prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(aA.z));
59
- var sZ = 0.0;
60
- result.diffuse += jl * bJ(material, prepared.diffuseColor,
61
- view, aA, compensation, &sZ) * scale;
53
+ let au = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
54
+ if (au.z <= 0.0) { continue; }
55
+ let scale = abs(au.z) / (pdf * f32(count));
56
+ if (rV && jw > 0.0) {
57
+ let compensation = prepared.diffuseSpecularEnergyCompensation * ar(
58
+ prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(au.z));
59
+ var unusedPdf = 0.0;
60
+ result.diffuse += jw * bB(material, prepared.diffuseColor,
61
+ view, au, compensation, &unusedPdf) * scale;
62
62
  }
63
- if (kY) {
64
- let jn = normalize(view + aA);
65
- let bm = abs(dot(view, jn));
66
- var bG = vec3f(0.0);
63
+ if (lp) {
64
+ let evaluatedHalf = normalize(view + au);
65
+ let viewHalf = abs(dot(view, evaluatedHalf));
66
+ var fresnel = vec3f(0.0);
67
67
  if (specularWeight > 0.0) {
68
- var dielectric = vec3f(af(bm, material.relativeIor));
69
- if (material.thinWalled) { dielectric = av(dielectric, material.transmissionWeight); }
70
- bG += specularWeight * material.specularColor * dielectric;
68
+ var dielectric = vec3f(ae(viewHalf, material.relativeIor));
69
+ if (material.thinWalled) { dielectric = aq(dielectric, material.transmissionWeight); }
70
+ fresnel += specularWeight * material.specularColor * dielectric;
71
71
  }
72
- if (gb > 0.0) {
73
- bG += gb * material.specularWeight * cw(bm,
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 rJ = cW(jn, alpha) * mg
77
- * aF(aA, alpha) / (4.0 * max(aA.z * view.z, 1e-8));
78
- var reflection = bG * rJ;
79
- if (gb > 0.0 && prepared.metalMsFactor > 0.0) {
80
- let cL = min(prepared.metalMsFactor * aV(prepared.specularAlpha, aA.z), 1.0 / max(aA.z, 1e-8));
81
- reflection += gb * prepared.metalMsScale * cL * INVPI;
76
+ let sT = sampling_ggx_ndf(evaluatedHalf, alpha) * mG
77
+ * aD(au, alpha) / (4.0 * max(au.z * view.z, 1e-8));
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 oZ = prepared.dielectricMsViewLoss * bb(
85
- prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(aA.z)) / ei;
86
- let cL = min(oZ * prepared.dielectricMsReflectionRatio, 1.0 / abs(aA.z));
87
- reflection += prepared.dielectricMsReflectionScale * cL * 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 vT(prepared: ag) -> oa {
95
- return hN(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 hp: 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 ox(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]=ox(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]=ox(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,20 +15,20 @@ 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 ow(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 iN(offset:u32)->vec3f {return bitcast<vec3f>(vec3u(aovScene[offset],aovScene[offset+1u],aovScene[offset+2u]));}
25
- fn mQ(xe: Ray, si: ptr<function, SurfaceInteraction>, material: ptr<function, OpenPbrResolvedMaterial>) -> bool {
26
- var ray = xe;
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);
30
30
  if (!(*si).hit) { return false; }
31
- dg(material, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
31
+ getMaterial(material, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
32
32
  if ((*material).materialType != SHADOW_CATCHER && (*material).alpha >= 0.5) { return true; }
33
33
  ray.o = (*si).position + ray.d * (EPS * 0.02);
34
34
  }
@@ -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
- aZ = id.xy; aQ = sample + rtUniform.sampleSequenceOffset;
45
- bT = 0u; cP = 0u;
46
- gW(id.xy, i32(aQ ^ dG(rtUniform.sequenceSeed)));
47
- let uv = (vec2f(id.xy) + dZ(CAMERA_PIXEL)) / vec2f(size);
48
- var ray = fj(uv);
44
+ aJ = id.xy; aC = sample + rtUniform.sampleSequenceOffset;
45
+ samplingBounce = 0u; hashedCounter = 0u;
46
+ fA(id.xy, i32(aC ^ cD(rtUniform.sequenceSeed)));
47
+ let uv = (vec2f(id.xy) + sample2D(CAMERA_PIXEL)) / vec2f(size);
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 jN = eye + ray.d * (cameraUniform.focusDistance / dot(ray.d, forward));
53
- let xU = cameraUniform.apertureRadius * kN(dZ(CAMERA_LENS));
54
- let origin = (cameraUniform.viewInv * vec4f(xU, 0.0, 1.0)).xyz;
55
- gC(&ray, origin, normalize(jN-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 (!mQ(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 fu=-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(fu<0.0){face=-face;fu=-fu;}
72
+ if(fk<0.0){face=-face;fk=-fk;}
73
73
  }
74
- if(fu>=0.0 && cosine<0.0){normal=face;cosine=fu;}
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=ds(si.tangent,material,-ray.d,normal);
79
- let reflectance=hN(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 = fj(uv);
92
+ let ray = cV(uv);
93
93
  var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
94
- if (!mQ(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-iN(36u),iN(40u));
100
+ aovCenter[index].motion.z = dot(si.position-iV(36u),iV(40u));
101
101
  if (aovScene[offset+2u] == 0u) { return; }
102
- let qA = ow(offset+4u) * vec4f(si.position,1.0);
103
- let ps = ow(0u) * qA;
104
- if (ps.w <= 0.0) { return; }
105
- let tX=ps.xyz/ps.w;
106
- let iz=(tX.xy*0.5+0.5)*vec2f(size);
107
- if (any(iz < vec2f(0.0)) || any(iz >= vec2f(size)) || abs(tX.z)>1.0) { return; }
108
- let previous=aovPrevious[u32(iz.x)+u32(iz.y)*size.x];
109
- let qz=dot(qA.xyz-iN(44u),iN(48u));
110
- if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-qz)>max(1e-4,abs(qz)*1e-3)) { return; }
111
- let motion=(iz-(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;
@@ -0,0 +1,56 @@
1
+ import original from './aovTrace.wgsl.js';
2
+ import { aovCompactStorage } from './aovCompact.wgsl.js';
3
+ // Web-only storage specialization. The default shader (also used by native)
4
+ // remains byte-identical; geometry/material evaluation comes from that source.
5
+ export default aovCompactStorage + '\noverride AOV_DISPLAY: bool = false;\n' + original
6
+ .replace(`var<storage, read_write> aovAccum: array<AovAccumulation>;`, `var<storage, read_write> aovAccum: array<u32>;`)
7
+ .replace(`fn lC(`, /* wgsl */ `fn zQ(index: u32) -> AovAccumulation {
8
+ if(AOV_COMPACT){
9
+ let o=index*6u;
10
+ return AovAccumulation(vec4f(bitcast<f32>(aovAccum[o]),0,0,0),vec4f(0,0,0,bitcast<f32>(aovAccum[o+1u])),
11
+ rY(vec2u(aovAccum[o+2u],aovAccum[o+3u])),rY(vec2u(aovAccum[o+4u],aovAccum[o+5u])));
12
+ }
13
+ let o=index*16u;
14
+ return AovAccumulation(bitcast<vec4f>(vec4u(aovAccum[o],aovAccum[o+1u],aovAccum[o+2u],aovAccum[o+3u])),
15
+ bitcast<vec4f>(vec4u(aovAccum[o+4u],aovAccum[o+5u],aovAccum[o+6u],aovAccum[o+7u])),
16
+ bitcast<vec4f>(vec4u(aovAccum[o+8u],aovAccum[o+9u],aovAccum[o+10u],aovAccum[o+11u])),
17
+ bitcast<vec4f>(vec4u(aovAccum[o+12u],aovAccum[o+13u],aovAccum[o+14u],aovAccum[o+15u])));
18
+ }
19
+ fn xg(index: u32,pixel: AovAccumulation){
20
+ if(AOV_COMPACT){
21
+ let o=index*6u;let d=yD(pixel.diffuse);let s=yD(pixel.specular);
22
+ aovAccum[o]=bitcast<u32>(pixel.depthRoughness.x);aovAccum[o+1u]=bitcast<u32>(pixel.position.w);
23
+ aovAccum[o+2u]=d.x;aovAccum[o+3u]=d.y;aovAccum[o+4u]=s.x;aovAccum[o+5u]=s.y;
24
+ }else{
25
+ let AJ=array<vec4f,4>(pixel.depthRoughness,pixel.position,pixel.diffuse,pixel.specular);
26
+ for(var nZ=0u;nZ<4u;nZ++){for(var channel=0u;channel<4u;channel++){aovAccum[index*16u+nZ*4u+channel]=bitcast<u32>(AJ[nZ][channel]);}}
27
+ }
28
+ }
29
+ fn lC(`)
30
+ .replace(`if (sample == 0u) { aovAccum[index] = AovAccumulation(); }`, `var pixel=AovAccumulation(); if(sample>0u){pixel=zQ(index);}`)
31
+ .replace(`if (!jS(ray, &si, &material)) { return; }`, `if (!jS(ray, &si, &material)) { xg(index,pixel); return; }`)
32
+ .split(`aovAccum[index].`).join(`pixel.`)
33
+ .replace(`pixel.position += vec4f(si.position, 1.0);`, `pixel.position += vec4f(si.position, 1.0); xg(index,pixel);`)
34
+ .replace(`(material.transmissionDispersionScale > 0.0);`, `(material.transmissionDispersionScale > 0.0) | (AOV_DISPLAY && material.transmissionWeight > 0.0);`)
35
+ // Texture colors are resolved material inputs, not directional quadrature.
36
+ // Web requests them as diffuseColor/specularColor (mask bits 7-8); native
37
+ // display AOVs (AOV_DISPLAY) still request them through the albedo bits.
38
+ // Uniform layer factors cancel in detail ratios, so coat, fuzz, sheen-like
39
+ // and anisotropic surfaces stay valid; transmission and cutouts do not.
40
+ .replace(`if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`, /* wgsl */ `let tX = select((aovParameters.w >> 7u) & 3u, (aovParameters.w >> 3u) & 3u, AOV_DISPLAY);
41
+ if (tX != 0u) {
42
+ let zR = (material.materialType != STANDARD) | (material.alpha < 1.0) | (material.transmissionWeight > 0.0) |
43
+ (dot(material.mediumScattering, material.mediumScattering) > 0.0);
44
+ if (!zR) {
45
+ let metal = clamp(material.baseMetalness, 0.0, 1.0);
46
+ let base = material.baseWeight * material.baseColor;
47
+ let layer = mix(vec3f(1.0), material.coatColor, clamp(material.coatWeight, 0.0, 1.0));
48
+ let f = (material.specularIor - 1.0) / (material.specularIor + 1.0);
49
+ if ((tX & 1u) != 0u) { pixel.diffuse += vec4f(layer * base * (1.0 - metal), 1.0); }
50
+ if ((tX & 2u) != 0u) { pixel.specular += vec4f(layer * (metal * base + (1.0 - metal) * material.specularWeight * material.specularColor * f * f), 1.0); }
51
+ }
52
+ }
53
+ if (!AOV_DISPLAY && AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`)
54
+ .replace(`pixel.diffuse+=vec4f(reflectance.diffuse,1.0);`, `if ((aovParameters.w & 8u) != 0u) { pixel.diffuse+=vec4f(reflectance.diffuse,1.0); }`)
55
+ .replace(`pixel.specular+=vec4f(reflectance.specular,1.0);`, `if ((aovParameters.w & 16u) != 0u) { pixel.specular+=vec4f(reflectance.specular,1.0); }`);
56
+ //# sourceMappingURL=aovTraceDisplay.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovTraceDisplay.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovTraceDisplay.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAEvD,4EAA4E;AAC5E,+EAA+E;AAC/E,eAAe,iBAAiB,GAAG,yCAAyC,GAAG,QAAQ;KACpF,OAAO,CAAC,4DAA4D,EAAE,gDAAgD,CAAC;KACvH,OAAO,CAAC,QAAe,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;OAsBzB,CAAC;KACZ,OAAO,CAAC,4DAA4D,EAAE,8DAAmE,CAAC;KAC1I,OAAO,CAAC,2CAAmD,EAAE,4DAA0E,CAAC;KACxI,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;KACxC,OAAO,CAAC,4CAA4C,EAAE,6DAAmE,CAAC;KAC1H,OAAO,CAAC,+CAA+C,EAAE,oGAAoG,CAAC;IAC/J,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,wEAAwE;KACvE,OAAO,CAAC,yEAAyE,EAAE,UAAU,CAAC;;;;;;;;;;;;;wFAaP,CAAC;KACxF,OAAO,CAAC,gDAAgD,EAAE,sFAAsF,CAAC;KACjJ,OAAO,CAAC,kDAAkD,EAAE,yFAAyF,CAAC,CAAC","sourcesContent":["import original from './aovTrace.wgsl.js';\nimport {aovCompactStorage} from './aovCompact.wgsl.js';\n\n// Web-only storage specialization. The default shader (also used by native)\n// remains byte-identical; geometry/material evaluation comes from that source.\nexport default aovCompactStorage + '\\noverride AOV_DISPLAY: bool = false;\\n' + original\n .replace(`var<storage, read_write> aovAccum: array<AovAccumulation>;`, `var<storage, read_write> aovAccum: array<u32>;`)\n .replace(`fn aovMatrix(`, /* wgsl */ `fn aovLoad(index: u32) -> AovAccumulation {\n if(AOV_COMPACT){\n let o=index*6u;\n return AovAccumulation(vec4f(bitcast<f32>(aovAccum[o]),0,0,0),vec4f(0,0,0,bitcast<f32>(aovAccum[o+1u])),\n aovUnpack(vec2u(aovAccum[o+2u],aovAccum[o+3u])),aovUnpack(vec2u(aovAccum[o+4u],aovAccum[o+5u])));\n }\n let o=index*16u;\n return AovAccumulation(bitcast<vec4f>(vec4u(aovAccum[o],aovAccum[o+1u],aovAccum[o+2u],aovAccum[o+3u])),\n bitcast<vec4f>(vec4u(aovAccum[o+4u],aovAccum[o+5u],aovAccum[o+6u],aovAccum[o+7u])),\n bitcast<vec4f>(vec4u(aovAccum[o+8u],aovAccum[o+9u],aovAccum[o+10u],aovAccum[o+11u])),\n bitcast<vec4f>(vec4u(aovAccum[o+12u],aovAccum[o+13u],aovAccum[o+14u],aovAccum[o+15u])));\n}\nfn aovStore(index: u32,pixel: AovAccumulation){\n if(AOV_COMPACT){\n let o=index*6u;let d=aovPack(pixel.diffuse);let s=aovPack(pixel.specular);\n aovAccum[o]=bitcast<u32>(pixel.depthRoughness.x);aovAccum[o+1u]=bitcast<u32>(pixel.position.w);\n aovAccum[o+2u]=d.x;aovAccum[o+3u]=d.y;aovAccum[o+4u]=s.x;aovAccum[o+5u]=s.y;\n }else{\n let lanes=array<vec4f,4>(pixel.depthRoughness,pixel.position,pixel.diffuse,pixel.specular);\n for(var lane=0u;lane<4u;lane++){for(var channel=0u;channel<4u;channel++){aovAccum[index*16u+lane*4u+channel]=bitcast<u32>(lanes[lane][channel]);}}\n }\n}\nfn aovMatrix(`)\n .replace(`if (sample == 0u) { aovAccum[index] = AovAccumulation(); }`, `var pixel=AovAccumulation(); if(sample>0u){pixel=aovLoad(index);}`)\n .replace(`if (!aovSurface(ray, &si, &material)) { return; }`, `if (!aovSurface(ray, &si, &material)) { aovStore(index,pixel); return; }`)\n .split(`aovAccum[index].`).join(`pixel.`)\n .replace(`pixel.position += vec4f(si.position, 1.0);`, `pixel.position += vec4f(si.position, 1.0); aovStore(index,pixel);`)\n .replace(`(material.transmissionDispersionScale > 0.0);`, `(material.transmissionDispersionScale > 0.0) | (AOV_DISPLAY && material.transmissionWeight > 0.0);`)\n // Texture colors are resolved material inputs, not directional quadrature.\n // Web requests them as diffuseColor/specularColor (mask bits 7-8); native\n // display AOVs (AOV_DISPLAY) still request them through the albedo bits.\n // Uniform layer factors cancel in detail ratios, so coat, fuzz, sheen-like\n // and anisotropic surfaces stay valid; transmission and cutouts do not.\n .replace(`if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`, /* wgsl */ `let colorMask = select((aovParameters.w >> 7u) & 3u, (aovParameters.w >> 3u) & 3u, AOV_DISPLAY);\n if (colorMask != 0u) {\n let blocked = (material.materialType != STANDARD) | (material.alpha < 1.0) | (material.transmissionWeight > 0.0) |\n (dot(material.mediumScattering, material.mediumScattering) > 0.0);\n if (!blocked) {\n let metal = clamp(material.baseMetalness, 0.0, 1.0);\n let base = material.baseWeight * material.baseColor;\n let layer = mix(vec3f(1.0), material.coatColor, clamp(material.coatWeight, 0.0, 1.0));\n let f = (material.specularIor - 1.0) / (material.specularIor + 1.0);\n if ((colorMask & 1u) != 0u) { pixel.diffuse += vec4f(layer * base * (1.0 - metal), 1.0); }\n if ((colorMask & 2u) != 0u) { pixel.specular += vec4f(layer * (metal * base + (1.0 - metal) * material.specularWeight * material.specularColor * f * f), 1.0); }\n }\n }\n if (!AOV_DISPLAY && AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {`)\n .replace(`pixel.diffuse+=vec4f(reflectance.diffuse,1.0);`, `if ((aovParameters.w & 8u) != 0u) { pixel.diffuse+=vec4f(reflectance.diffuse,1.0); }`)\n .replace(`pixel.specular+=vec4f(reflectance.specular,1.0);`, `if ((aovParameters.w & 16u) != 0u) { pixel.specular+=vec4f(reflectance.specular,1.0); }`);\n"]}