@meimu/mutracer 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +195 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14352 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +144 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +273 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +121 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +256 -0
  35. package/lib/Render.js +671 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +76 -0
  38. package/lib/RenderLoop.js +204 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1446 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +121 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +619 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +100 -0
  511. package/lib/util/fromTHREE.js +1063 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,412 @@
1
+ import { getTargetShaderCache } from './WGPUShaderCache.js';
2
+ import shadowCatcherAccumulationWGSL from './wgsl/chunks/shadowCatcherAccumulation.wgsl.js';
3
+ import { JNLM_DEFAULT_COLOR_SENSITIVITY, JNLM_DEFAULT_SHAPE, JNLM_ALBEDO_FLOOR, JNLM_ALBEDO_REGULARIZATION, JNLM_COVERAGE_BANDWIDTH, JNLM_MAX_ITERATIONS, jnlmPassDilation } from './jnlm.js';
4
+ /** WebGPU passes of the JNLM denoiser described in `jnlm.ts`. */
5
+ export const JNLM_WORKGROUP_SIZE = 8;
6
+ const paramsWGSL = /* wgsl */ `
7
+ struct JNLMParams {
8
+ size: vec2u,
9
+ colorSensitivity: f32,
10
+
11
+ dilation: f32,
12
+ }
13
+ @group(0) @binding(0) var<uniform> params: JNLMParams;
14
+ `;
15
+ /**
16
+ * Pass 1: the guide mean and the variance of that mean from the accumulated
17
+ * moments. Ray buffers are stored bottom-up; guides use texture rows.
18
+ */
19
+ export const jnlmGuideWGSL = /* wgsl */ `
20
+ ${paramsWGSL}
21
+ ${shadowCatcherAccumulationWGSL}
22
+ @group(0) @binding(1) var<storage, read> accumulation: array<ShadowCatcherAccumulation>;
23
+ @group(0) @binding(2) var<storage, read> normalBuffer: array<vec4f>;
24
+ @group(0) @binding(3) var<storage, read_write> rawGuide: array<vec2f>;
25
+
26
+ @compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)
27
+ fn main(@builtin(global_invocation_id) id: vec3u) {
28
+ let size = params.size;
29
+ if (id.x >= size.x || id.y >= size.y) { return; }
30
+ let tO = id.x + (size.y - 1u - id.y) * size.x;
31
+ let n = normalBuffer[tO].a;
32
+ let moments = accumulation[tO].moments;
33
+ let mean = moments.x / max(n, 1.0);
34
+
35
+ var variance = -1.0;
36
+ if (n >= 2.0) {
37
+ variance = max(moments.y - n * mean * mean, 0.0) / (n * (n - 1.0));
38
+ }
39
+ rawGuide[id.x + id.y * size.x] = vec2f(mean, variance);
40
+ }
41
+ `;
42
+ /**
43
+ * Pass 2: smooth the noisy per-pixel variance over 3 x 3 pixels. Pixels with
44
+ * a single sample take the spatial variance of their neighborhood instead.
45
+ */
46
+ export const jnlmVarianceWGSL = /* wgsl */ `
47
+ ${paramsWGSL}
48
+ @group(0) @binding(1) var<storage, read> rawGuide: array<vec2f>;
49
+ @group(0) @binding(2) var<storage, read_write> guide: array<vec2f>;
50
+
51
+ @compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)
52
+ fn main(@builtin(global_invocation_id) id: vec3u) {
53
+ let size = params.size;
54
+ if (id.x >= size.x || id.y >= size.y) { return; }
55
+ let center = rawGuide[id.x + id.y * size.x];
56
+ var lg = 0.0;
57
+ var iX = 0.0;
58
+ var mL = 0.0;
59
+ var iR = 0.0;
60
+ for (var dy = -1; dy <= 1; dy++) {
61
+ for (var dx = -1; dx <= 1; dx++) {
62
+ let q = clamp(vec2i(id.xy) + vec2i(dx, dy), vec2i(0), vec2i(size) - 1);
63
+ let value = rawGuide[u32(q.x) + u32(q.y) * size.x];
64
+ mL += value.x;
65
+ iR += value.x * value.x;
66
+ if (value.y >= 0.0) {
67
+ lg += value.y;
68
+ iX += 1.0;
69
+ }
70
+ }
71
+ }
72
+ var variance: f32;
73
+ if (center.y >= 0.0) {
74
+ variance = lg / iX;
75
+ } else {
76
+ let lf = mL / 9.0;
77
+ variance = max(iR / 9.0 - lf * lf, 0.0) * 9.0 / 8.0;
78
+ }
79
+ guide[id.x + id.y * size.x] = vec2f(center.x, variance);
80
+ }
81
+ `;
82
+ /** Copies the composed image into the filter's color buffer. */
83
+ export const jnlmLoadColorWGSL = /* wgsl */ `
84
+ ${paramsWGSL}
85
+ @group(0) @binding(1) var colorTex: texture_2d<f32>;
86
+ @group(0) @binding(2) var<storage, read_write> outColor: array<vec4f>;
87
+
88
+ @compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)
89
+ fn main(@builtin(global_invocation_id) id: vec3u) {
90
+ if (id.x >= params.size.x || id.y >= params.size.y) { return; }
91
+ outColor[id.x + id.y * params.size.x] = textureLoad(colorTex, vec2i(id.xy), 0);
92
+ }
93
+ `;
94
+ /**
95
+ * Pass 3: the joint NL-means filter of the composed image. It also filters
96
+ * the guide with the same weights, with the variance of the weighted mean,
97
+ * for a following pass. The albedo regression corrects color only, keeping
98
+ * uncertain fitted texture responses out of the matching guide.
99
+ */
100
+ export function createJNLMFilterWGSL({ searchRadius, patchRadius, albedoBandwidth, normalBandwidth } = JNLM_DEFAULT_SHAPE) {
101
+ const patchSize = (2 * patchRadius + 1) ** 2;
102
+ return /* wgsl */ `
103
+ ${paramsWGSL}
104
+ @group(0) @binding(1) var<storage, read> guide: array<vec2f>;
105
+ @group(0) @binding(2) var<storage, read> color: array<vec4f>;
106
+ @group(0) @binding(3) var albedoTex: texture_2d<f32>;
107
+ @group(0) @binding(4) var normalTex: texture_2d<f32>;
108
+ @group(0) @binding(5) var<storage, read_write> outColor: array<vec4f>;
109
+ @group(0) @binding(6) var<storage, read_write> outGuide: array<vec2f>;
110
+ @group(0) @binding(7) var shadowCatcherTex: texture_2d<f32>;
111
+
112
+ const SEARCH_RADIUS = ${searchRadius};
113
+ const PATCH_RADIUS = ${patchRadius};
114
+ const PATCH_SIZE = ${patchSize};
115
+
116
+ const VARIANCE_CANCELLATION = 1.0;
117
+
118
+ const INV_ALBEDO_BANDWIDTH2 = ${(1 / albedoBandwidth ** 2).toFixed(6)};
119
+ const INV_COVERAGE_BANDWIDTH2 = ${(1 / JNLM_COVERAGE_BANDWIDTH ** 2).toFixed(6)};
120
+ const INV_NORMAL_BANDWIDTH2 = ${(1 / normalBandwidth ** 2).toFixed(6)};
121
+
122
+
123
+ const CENTER_WEIGHT_MIN = 0.01;
124
+
125
+ fn gZ(p: vec2i) -> u32 {
126
+ let q = clamp(p, vec2i(0), vec2i(params.size) - 1);
127
+ return u32(q.x) + u32(q.y) * params.size.x;
128
+ }
129
+
130
+ fn lk(q: vec2i, bs: vec4f, gM: vec3f) -> f32 {
131
+ let albedo = textureLoad(albedoTex, q, 0);
132
+
133
+
134
+ let oS = max((albedo.rgb + bs.rgb) * 0.5, vec3f(${JNLM_ALBEDO_FLOOR}));
135
+ let kR = (albedo.rgb - bs.rgb) / oS;
136
+ let iO = albedo.a - bs.a;
137
+ let lb = textureLoad(normalTex, q, 0).rgb - gM;
138
+ return max(
139
+ dot(kR, kR) * INV_ALBEDO_BANDWIDTH2
140
+ + iO * iO * INV_COVERAGE_BANDWIDTH2,
141
+ dot(lb, lb) * INV_NORMAL_BANDWIDTH2
142
+ );
143
+ }
144
+
145
+ fn premultiplied(c: vec4f) -> vec4f {
146
+ return vec4f(c.rgb * c.a, c.a);
147
+ }
148
+
149
+ @compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)
150
+ fn main(@builtin(global_invocation_id) id: vec3u) {
151
+ let size = vec2i(params.size);
152
+ let p = vec2i(id.xy);
153
+ if (p.x >= size.x || p.y >= size.y) { return; }
154
+ let step = i32(params.dilation);
155
+ let bs = textureLoad(albedoTex, p, 0);
156
+ let fw = textureLoad(normalTex, p, 0);
157
+ let gM = fw.rgb;
158
+ let index = gZ(p);
159
+
160
+
161
+ if (fw.a <= 0.0 && textureLoad(shadowCatcherTex, p, 0).r <= 0.0) {
162
+ outColor[index] = color[index];
163
+ outGuide[index] = guide[index];
164
+ return;
165
+ }
166
+
167
+ var kT: array<vec2f, PATCH_SIZE>;
168
+ var k = 0;
169
+ for (var dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
170
+ for (var dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
171
+ kT[k] = guide[gZ(p + vec2i(dx, dy) * step)];
172
+ k++;
173
+ }
174
+ }
175
+ let k2 = params.colorSensitivity * params.colorSensitivity;
176
+
177
+ var sum = vec4f(0.0);
178
+ let gP = max(bs.rgb, vec3f(${JNLM_ALBEDO_FLOOR}));
179
+ var mb = vec3f(0.0);
180
+ var gs = vec3f(0.0);
181
+ var hn = vec3f(0.0);
182
+ var pg = 0.0;
183
+ var gu = 0.0;
184
+ var nH = 0.0;
185
+ var kA = 0.0;
186
+ for (var sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {
187
+ for (var sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {
188
+ let q = p + vec2i(sx, sy) * step;
189
+ if (
190
+ (sx == 0 && sy == 0) ||
191
+ q.x < 0 || q.y < 0 || q.x >= size.x || q.y >= size.y
192
+ ) { continue; }
193
+
194
+ let features = lk(q, bs, gM);
195
+ if (features > 16.0) { continue; }
196
+
197
+ var fT = 0.0;
198
+ k = 0;
199
+ for (var dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
200
+ for (var dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
201
+ let a = kT[k];
202
+ let b = guide[gZ(q + vec2i(dx, dy) * step)];
203
+ let qH = a.x - b.x;
204
+ fT += (qH * qH
205
+ - VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))
206
+ / (1e-10 + k2 * (a.y + b.y));
207
+ k++;
208
+ }
209
+ }
210
+ fT /= f32(PATCH_SIZE);
211
+
212
+ let weight = exp(-max(max(fT, 0.0), features));
213
+ let index = gZ(q);
214
+ let c = color[index];
215
+ let g = guide[index];
216
+
217
+ let a = (textureLoad(albedoTex, q, 0).rgb - bs.rgb) / gP;
218
+ let value = premultiplied(c);
219
+ sum += value * weight;
220
+ mb += a * weight;
221
+ gs += a * a * weight;
222
+ hn += a * value.rgb * weight;
223
+ pg += g.x * weight;
224
+ gu += g.y * weight * weight;
225
+ nH += weight;
226
+ kA = max(kA, weight);
227
+ }
228
+ }
229
+
230
+
231
+
232
+ let center = color[index];
233
+ let kS = guide[index];
234
+ let dF = max(kA, CENTER_WEIGHT_MIN);
235
+ let totalWeight = nH + dF;
236
+ let tA = premultiplied(center);
237
+ let mean = (sum + tA * dF) / totalWeight;
238
+
239
+
240
+ let ez = mb / totalWeight;
241
+ let ll = max(gs / totalWeight - ez * ez, vec3f(0.0));
242
+ let qi = hn / totalWeight - ez * mean.rgb;
243
+
244
+
245
+
246
+ let qs = bs.rgb + ez * gP;
247
+ let ol = mean.rgb * gP / max(qs, vec3f(${JNLM_ALBEDO_FLOOR}));
248
+ let vk = clamp(qi / (ll + vec3f(${JNLM_ALBEDO_REGULARIZATION})), vec3f(0.0), ol);
249
+ let rn = mean.rgb - vk * ez;
250
+ let filtered = vec4f(max(rn, vec3f(0.0)), max(mean.a, 0.0));
251
+ let rgb = select(
252
+ center.rgb,
253
+ filtered.rgb / max(filtered.a, 1e-6),
254
+ filtered.a > 1e-6
255
+ );
256
+ outColor[index] = vec4f(rgb, filtered.a);
257
+ outGuide[index] = vec2f(
258
+ (pg + kS.x * dF) / totalWeight,
259
+ (gu + kS.y * dF * dF)
260
+ / (totalWeight * totalWeight)
261
+ );
262
+ }
263
+ `;
264
+ }
265
+ const MAX_ITERATIONS = JNLM_MAX_ITERATIONS;
266
+ export class WGPUJNLMDenoisePass {
267
+ _device;
268
+ _paramsBuffers = [];
269
+ _guidePipeline;
270
+ _variancePipeline;
271
+ _loadColorPipeline;
272
+ _filterPipeline;
273
+ _filterShapeKey = '';
274
+ _guides = [];
275
+ _colors = [];
276
+ _width = 0;
277
+ _height = 0;
278
+ constructor(device) {
279
+ this._device = device;
280
+ // One uniform buffer per pass: every pass of an encoder sees the last
281
+ // writeBuffer() of a shared one.
282
+ for (let i = 0; i <= MAX_ITERATIONS; i++) {
283
+ this._paramsBuffers.push(device.createBuffer({
284
+ label: 'JNLM params',
285
+ size: 16,
286
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
287
+ }));
288
+ }
289
+ this._guidePipeline = this._createPipeline('JNLM guide', jnlmGuideWGSL);
290
+ this._variancePipeline = this._createPipeline('JNLM variance', jnlmVarianceWGSL);
291
+ this._loadColorPipeline = this._createPipeline('JNLM load color', jnlmLoadColorWGSL);
292
+ }
293
+ _createPipeline(label, code) {
294
+ return getTargetShaderCache(this._device).createComputePipeline({
295
+ label,
296
+ layout: 'auto',
297
+ compute: {
298
+ module: getTargetShaderCache(this._device).createShaderModule({ label, code }),
299
+ entryPoint: 'main'
300
+ }
301
+ });
302
+ }
303
+ _getFilterPipeline(shape) {
304
+ const key = JSON.stringify(shape);
305
+ if (!this._filterPipeline || key !== this._filterShapeKey) {
306
+ this._filterPipeline = this._createPipeline('JNLM filter', createJNLMFilterWGSL(shape));
307
+ this._filterShapeKey = key;
308
+ }
309
+ return this._filterPipeline;
310
+ }
311
+ reserveCapacity() { }
312
+ _ensureBuffers(width, height) {
313
+ if (width <= this._width && height <= this._height && this._colors.length)
314
+ return;
315
+ width = Math.max(width, this._width);
316
+ height = Math.max(height, this._height);
317
+ this._destroyBuffers();
318
+ const pixels = width * height;
319
+ const createBuffer = (label, bytes) => this._device.createBuffer({
320
+ label,
321
+ size: pixels * bytes,
322
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
323
+ });
324
+ this._guides = [createBuffer('JNLM guide A', 8), createBuffer('JNLM guide B', 8)];
325
+ this._colors = [createBuffer('JNLM color A', 16), createBuffer('JNLM color B', 16)];
326
+ this._width = width;
327
+ this._height = height;
328
+ }
329
+ _destroyBuffers() {
330
+ for (const buffer of [...this._guides, ...this._colors])
331
+ buffer.destroy();
332
+ this._guides = [];
333
+ this._colors = [];
334
+ }
335
+ /** Encodes the denoiser and returns the RGBA32F output in texture rows. */
336
+ encode(encoder, inputs) {
337
+ const { width, height, shape } = inputs;
338
+ this._ensureBuffers(width, height);
339
+ const iterations = Math.min(Math.max(Math.round(shape.iterations), 1), MAX_ITERATIONS);
340
+ const sensitivity = JNLM_DEFAULT_COLOR_SENSITIVITY * Math.max(inputs.strength, 1e-3);
341
+ this._paramsBuffers.forEach((buffer, i) => {
342
+ const params = new ArrayBuffer(16);
343
+ new Uint32Array(params, 0, 2).set([width, height]);
344
+ // Buffer i (from 1) is filter pass i - 1; index 0 is the prepasses.
345
+ new Float32Array(params, 8, 2).set([sensitivity, jnlmPassDilation(Math.max(i - 1, 0))]);
346
+ this._device.queue.writeBuffer(buffer, 0, params);
347
+ });
348
+ const device = this._device;
349
+ const filterPipeline = this._getFilterPipeline(shape);
350
+ const bind = (pipeline, paramsBuffer, resources) => device.createBindGroup({
351
+ layout: pipeline.getBindGroupLayout(0),
352
+ entries: [
353
+ { binding: 0, resource: { buffer: paramsBuffer } },
354
+ ...resources.map((resource, i) => ({ binding: i + 1, resource }))
355
+ ]
356
+ });
357
+ const [guideA, guideB] = this._guides;
358
+ const [colorA, colorB] = this._colors;
359
+ const prepass = this._paramsBuffers[0];
360
+ const passes = [
361
+ [this._guidePipeline, bind(this._guidePipeline, prepass, [
362
+ { buffer: inputs.accumulation },
363
+ { buffer: inputs.normalAccumulation },
364
+ { buffer: guideB }
365
+ ])],
366
+ [this._variancePipeline, bind(this._variancePipeline, prepass, [
367
+ { buffer: guideB },
368
+ { buffer: guideA }
369
+ ])],
370
+ [this._loadColorPipeline, bind(this._loadColorPipeline, prepass, [
371
+ inputs.color.createView(),
372
+ { buffer: colorA }
373
+ ])]
374
+ ];
375
+ const albedoView = inputs.albedo.createView();
376
+ const normalView = inputs.normal.createView();
377
+ const shadowCatcherView = inputs.shadowCatcher.createView();
378
+ let guides = [guideA, guideB];
379
+ let colors = [colorA, colorB];
380
+ for (let i = 1; i <= iterations; i++) {
381
+ passes.push([filterPipeline, bind(filterPipeline, this._paramsBuffers[i], [
382
+ { buffer: guides[0] },
383
+ { buffer: colors[0] },
384
+ albedoView,
385
+ normalView,
386
+ { buffer: colors[1] },
387
+ { buffer: guides[1] },
388
+ shadowCatcherView
389
+ ])]);
390
+ guides = [guides[1], guides[0]];
391
+ colors = [colors[1], colors[0]];
392
+ }
393
+ const pass = encoder.beginComputePass({ label: 'JNLM denoise' });
394
+ for (const [pipeline, bindGroup] of passes) {
395
+ pass.setPipeline(pipeline);
396
+ pass.setBindGroup(0, bindGroup);
397
+ pass.dispatchWorkgroups(Math.ceil(width / JNLM_WORKGROUP_SIZE), Math.ceil(height / JNLM_WORKGROUP_SIZE));
398
+ }
399
+ pass.end();
400
+ return colors[0];
401
+ }
402
+ getMemoryBytes() {
403
+ return [...this._paramsBuffers, ...this._guides, ...this._colors]
404
+ .reduce((sum, buffer) => sum + buffer.size, 0);
405
+ }
406
+ dispose() {
407
+ for (const buffer of this._paramsBuffers)
408
+ buffer.destroy();
409
+ this._destroyBuffers();
410
+ }
411
+ }
412
+ //# sourceMappingURL=WGPUJNLMDenoiser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPUJNLMDenoiser.js","sourceRoot":"","sources":["../../src/renderer/WGPUJNLMDenoiser.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTargetShaderCache } from './WGPUShaderCache.js';\nimport shadowCatcherAccumulationWGSL from './wgsl/chunks/shadowCatcherAccumulation.wgsl.js';\n\nimport {\n JNLM_DEFAULT_COLOR_SENSITIVITY,\n JNLM_DEFAULT_SHAPE,\n JNLM_ALBEDO_FLOOR,\n JNLM_ALBEDO_REGULARIZATION,\n JNLM_COVERAGE_BANDWIDTH,\n JNLM_MAX_ITERATIONS,\n jnlmPassDilation,\n type JNLMFilterShape\n} from './jnlm.js';\n\n/** WebGPU passes of the JNLM denoiser described in `jnlm.ts`. */\n\nexport const JNLM_WORKGROUP_SIZE = 8;\n\nconst paramsWGSL = /* wgsl */ `\nstruct JNLMParams {\n size: vec2u,\n colorSensitivity: f32,\n // Pixel spacing of the search window and patches in this pass.\n dilation: f32,\n}\n@group(0) @binding(0) var<uniform> params: JNLMParams;\n`;\n\n/**\n * Pass 1: the guide mean and the variance of that mean from the accumulated\n * moments. Ray buffers are stored bottom-up; guides use texture rows.\n */\nexport const jnlmGuideWGSL = /* wgsl */ `\n${paramsWGSL}\n${shadowCatcherAccumulationWGSL}\n@group(0) @binding(1) var<storage, read> accumulation: array<ShadowCatcherAccumulation>;\n@group(0) @binding(2) var<storage, read> normalBuffer: array<vec4f>;\n@group(0) @binding(3) var<storage, read_write> rawGuide: array<vec2f>;\n\n@compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let size = params.size;\n if (id.x >= size.x || id.y >= size.y) { return; }\n let rayIndex = id.x + (size.y - 1u - id.y) * size.x;\n let n = normalBuffer[rayIndex].a;\n let moments = accumulation[rayIndex].moments;\n let mean = moments.x / max(n, 1.0);\n // Variance of the mean, or -1 when one sample cannot estimate it.\n var variance = -1.0;\n if (n >= 2.0) {\n variance = max(moments.y - n * mean * mean, 0.0) / (n * (n - 1.0));\n }\n rawGuide[id.x + id.y * size.x] = vec2f(mean, variance);\n}\n`;\n\n/**\n * Pass 2: smooth the noisy per-pixel variance over 3 x 3 pixels. Pixels with\n * a single sample take the spatial variance of their neighborhood instead.\n */\nexport const jnlmVarianceWGSL = /* wgsl */ `\n${paramsWGSL}\n@group(0) @binding(1) var<storage, read> rawGuide: array<vec2f>;\n@group(0) @binding(2) var<storage, read_write> guide: array<vec2f>;\n\n@compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let size = params.size;\n if (id.x >= size.x || id.y >= size.y) { return; }\n let center = rawGuide[id.x + id.y * size.x];\n var varianceSum = 0.0;\n var varianceCount = 0.0;\n var meanSum = 0.0;\n var meanSquareSum = 0.0;\n for (var dy = -1; dy <= 1; dy++) {\n for (var dx = -1; dx <= 1; dx++) {\n let q = clamp(vec2i(id.xy) + vec2i(dx, dy), vec2i(0), vec2i(size) - 1);\n let value = rawGuide[u32(q.x) + u32(q.y) * size.x];\n meanSum += value.x;\n meanSquareSum += value.x * value.x;\n if (value.y >= 0.0) {\n varianceSum += value.y;\n varianceCount += 1.0;\n }\n }\n }\n var variance: f32;\n if (center.y >= 0.0) {\n variance = varianceSum / varianceCount;\n } else {\n let spatialMean = meanSum / 9.0;\n variance = max(meanSquareSum / 9.0 - spatialMean * spatialMean, 0.0) * 9.0 / 8.0;\n }\n guide[id.x + id.y * size.x] = vec2f(center.x, variance);\n}\n`;\n\n/** Copies the composed image into the filter's color buffer. */\nexport const jnlmLoadColorWGSL = /* wgsl */ `\n${paramsWGSL}\n@group(0) @binding(1) var colorTex: texture_2d<f32>;\n@group(0) @binding(2) var<storage, read_write> outColor: array<vec4f>;\n\n@compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n if (id.x >= params.size.x || id.y >= params.size.y) { return; }\n outColor[id.x + id.y * params.size.x] = textureLoad(colorTex, vec2i(id.xy), 0);\n}\n`;\n\n/**\n * Pass 3: the joint NL-means filter of the composed image. It also filters\n * the guide with the same weights, with the variance of the weighted mean,\n * for a following pass. The albedo regression corrects color only, keeping\n * uncertain fitted texture responses out of the matching guide.\n */\nexport function createJNLMFilterWGSL({\n searchRadius, patchRadius, albedoBandwidth, normalBandwidth\n}: JNLMFilterShape = JNLM_DEFAULT_SHAPE) {\n const patchSize = (2 * patchRadius + 1) ** 2;\n return /* wgsl */ `\n${paramsWGSL}\n@group(0) @binding(1) var<storage, read> guide: array<vec2f>;\n@group(0) @binding(2) var<storage, read> color: array<vec4f>;\n@group(0) @binding(3) var albedoTex: texture_2d<f32>;\n@group(0) @binding(4) var normalTex: texture_2d<f32>;\n@group(0) @binding(5) var<storage, read_write> outColor: array<vec4f>;\n@group(0) @binding(6) var<storage, read_write> outGuide: array<vec2f>;\n@group(0) @binding(7) var shadowCatcherTex: texture_2d<f32>;\n\nconst SEARCH_RADIUS = ${searchRadius};\nconst PATCH_RADIUS = ${patchRadius};\nconst PATCH_SIZE = ${patchSize};\n// Variance cancellation strength alpha of the paper.\nconst VARIANCE_CANCELLATION = 1.0;\n// Inverse squared feature bandwidths. Normals are encoded as n * 0.5 + 0.5.\nconst INV_ALBEDO_BANDWIDTH2 = ${(1 / albedoBandwidth ** 2).toFixed(6)};\nconst INV_COVERAGE_BANDWIDTH2 = ${(1 / JNLM_COVERAGE_BANDWIDTH ** 2).toFixed(6)};\nconst INV_NORMAL_BANDWIDTH2 = ${(1 / normalBandwidth ** 2).toFixed(6)};\n// Lower bound of the center weight, so a pixel unlike all of its neighbors\n// (a thin highlight) is kept rather than replaced by them.\nconst CENTER_WEIGHT_MIN = 0.01;\n\nfn pixelIndex(p: vec2i) -> u32 {\n let q = clamp(p, vec2i(0), vec2i(params.size) - 1);\n return u32(q.x) + u32(q.y) * params.size.x;\n}\n\nfn featureDistance(q: vec2i, centerAlbedo: vec4f, centerNormal: vec3f) -> f32 {\n let albedo = textureLoad(albedoTex, q, 0);\n // Absolute differences in linear albedo erase low-contrast dark textures.\n // Measure RGB contrast relative to both pixels; keep coverage absolute.\n let albedoScale = max((albedo.rgb + centerAlbedo.rgb) * 0.5, vec3f(${JNLM_ALBEDO_FLOOR}));\n let albedoDelta = (albedo.rgb - centerAlbedo.rgb) / albedoScale;\n let coverageDelta = albedo.a - centerAlbedo.a;\n let normalDelta = textureLoad(normalTex, q, 0).rgb - centerNormal;\n return max(\n dot(albedoDelta, albedoDelta) * INV_ALBEDO_BANDWIDTH2\n + coverageDelta * coverageDelta * INV_COVERAGE_BANDWIDTH2,\n dot(normalDelta, normalDelta) * INV_NORMAL_BANDWIDTH2\n );\n}\n\nfn premultiplied(c: vec4f) -> vec4f {\n return vec4f(c.rgb * c.a, c.a);\n}\n\n@compute @workgroup_size(${JNLM_WORKGROUP_SIZE}, ${JNLM_WORKGROUP_SIZE}, 1)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let size = vec2i(params.size);\n let p = vec2i(id.xy);\n if (p.x >= size.x || p.y >= size.y) { return; }\n let step = i32(params.dilation);\n let centerAlbedo = textureLoad(albedoTex, p, 0);\n let centerNormalTexel = textureLoad(normalTex, p, 0);\n let centerNormal = centerNormalTexel.rgb;\n let index = pixelIndex(p);\n // Primary misses show the background directly. It has no features that\n // protect its detail and no noise beyond antialiasing, so keep it.\n if (centerNormalTexel.a <= 0.0 && textureLoad(shadowCatcherTex, p, 0).r <= 0.0) {\n outColor[index] = color[index];\n outGuide[index] = guide[index];\n return;\n }\n\n var centerPatch: array<vec2f, PATCH_SIZE>;\n var k = 0;\n for (var dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {\n for (var dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {\n centerPatch[k] = guide[pixelIndex(p + vec2i(dx, dy) * step)];\n k++;\n }\n }\n let k2 = params.colorSensitivity * params.colorSensitivity;\n\n var sum = vec4f(0.0);\n let featureScale = max(centerAlbedo.rgb, vec3f(${JNLM_ALBEDO_FLOOR}));\n var featureSum = vec3f(0.0);\n var featureSquareSum = vec3f(0.0);\n var featureColorSum = vec3f(0.0);\n var guideSum = 0.0;\n var guideVarianceSum = 0.0;\n var weightSum = 0.0;\n var maxWeight = 0.0;\n for (var sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {\n for (var sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {\n let q = p + vec2i(sx, sy) * step;\n if (\n (sx == 0 && sy == 0) ||\n q.x < 0 || q.y < 0 || q.x >= size.x || q.y >= size.y\n ) { continue; }\n\n let features = featureDistance(q, centerAlbedo, centerNormal);\n if (features > 16.0) { continue; }\n\n var colorDistance = 0.0;\n k = 0;\n for (var dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {\n for (var dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {\n let a = centerPatch[k];\n let b = guide[pixelIndex(q + vec2i(dx, dy) * step)];\n let delta = a.x - b.x;\n colorDistance += (delta * delta\n - VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))\n / (1e-10 + k2 * (a.y + b.y));\n k++;\n }\n }\n colorDistance /= f32(PATCH_SIZE);\n\n let weight = exp(-max(max(colorDistance, 0.0), features));\n let index = pixelIndex(q);\n let c = color[index];\n let g = guide[index];\n // Filter premultiplied color so coverage and color stay consistent.\n let a = (textureLoad(albedoTex, q, 0).rgb - centerAlbedo.rgb) / featureScale;\n let value = premultiplied(c);\n sum += value * weight;\n featureSum += a * weight;\n featureSquareSum += a * a * weight;\n featureColorSum += a * value.rgb * weight;\n guideSum += g.x * weight;\n guideVarianceSum += g.y * weight * weight;\n weightSum += weight;\n maxWeight = max(maxWeight, weight);\n }\n }\n\n // Weight the center like its most similar neighbor (Buades et al. 2005)\n // instead of 1, so isolated outliers are not kept unfiltered.\n let center = color[index];\n let centerGuide = guide[index];\n let centerWeight = max(maxWeight, CENTER_WEIGHT_MIN);\n let totalWeight = weightSum + centerWeight;\n let centerValue = premultiplied(center);\n let mean = (sum + centerValue * centerWeight) / totalWeight;\n // Fit each color channel against relative albedo with the same JNLM weights.\n // Centering at this pixel avoids cancellation when the feature is constant.\n let meanFeature = featureSum / totalWeight;\n let featureVariance = max(featureSquareSum / totalWeight - meanFeature * meanFeature, vec3f(0.0));\n let covariance = featureColorSum / totalWeight - meanFeature * mean.rgb;\n // A 1% contrast ridge stabilizes flat guides. Bound the response between no\n // texture dependence and multiplicative albedo modulation; specular color\n // with an unrelated albedo falls back to the weighted mean.\n let meanAlbedo = centerAlbedo.rgb + meanFeature * featureScale;\n let maximumSlope = mean.rgb * featureScale / max(meanAlbedo, vec3f(${JNLM_ALBEDO_FLOOR}));\n let slope = clamp(covariance / (featureVariance + vec3f(${JNLM_ALBEDO_REGULARIZATION})), vec3f(0.0), maximumSlope);\n let corrected = mean.rgb - slope * meanFeature;\n let filtered = vec4f(max(corrected, vec3f(0.0)), max(mean.a, 0.0));\n let rgb = select(\n center.rgb,\n filtered.rgb / max(filtered.a, 1e-6),\n filtered.a > 1e-6\n );\n outColor[index] = vec4f(rgb, filtered.a);\n outGuide[index] = vec2f(\n (guideSum + centerGuide.x * centerWeight) / totalWeight,\n (guideVarianceSum + centerGuide.y * centerWeight * centerWeight)\n / (totalWeight * totalWeight)\n );\n}\n`;\n}\n\nexport interface JNLMInputs {\n width: number;\n height: number;\n /** Normalized shadow-catcher mask; red is the catcher coverage. */\n shadowCatcher: GPUTexture;\n /** Ray-trace auxiliary accumulation holding the guide moments. */\n accumulation: GPUBuffer;\n /** Ray-trace normal accumulation; its alpha is the per-pixel sample count. */\n normalAccumulation: GPUBuffer;\n /** Composed linear image to filter. */\n color: GPUTexture;\n albedo: GPUTexture;\n normal: GPUTexture;\n strength: number;\n shape: JNLMFilterShape;\n}\n\nconst MAX_ITERATIONS = JNLM_MAX_ITERATIONS;\n\nexport class WGPUJNLMDenoisePass {\n private _device: GPUDevice;\n private _paramsBuffers: GPUBuffer[] = [];\n private _guidePipeline: GPUComputePipeline;\n private _variancePipeline: GPUComputePipeline;\n private _loadColorPipeline: GPUComputePipeline;\n private _filterPipeline?: GPUComputePipeline;\n private _filterShapeKey = '';\n private _guides: GPUBuffer[] = [];\n private _colors: GPUBuffer[] = [];\n private _width = 0;\n private _height = 0;\n\n constructor(device: GPUDevice) {\n this._device = device;\n // One uniform buffer per pass: every pass of an encoder sees the last\n // writeBuffer() of a shared one.\n for (let i = 0; i <= MAX_ITERATIONS; i++) {\n this._paramsBuffers.push(device.createBuffer({\n label: 'JNLM params',\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n }));\n }\n this._guidePipeline = this._createPipeline('JNLM guide', jnlmGuideWGSL);\n this._variancePipeline = this._createPipeline('JNLM variance', jnlmVarianceWGSL);\n this._loadColorPipeline = this._createPipeline('JNLM load color', jnlmLoadColorWGSL);\n }\n\n private _createPipeline(label: string, code: string) {\n return getTargetShaderCache(this._device).createComputePipeline({\n label,\n layout: 'auto',\n compute: {\n module: getTargetShaderCache(this._device).createShaderModule({ label, code }),\n entryPoint: 'main'\n }\n });\n }\n\n private _getFilterPipeline(shape: JNLMFilterShape) {\n const key = JSON.stringify(shape);\n if (!this._filterPipeline || key !== this._filterShapeKey) {\n this._filterPipeline = this._createPipeline('JNLM filter', createJNLMFilterWGSL(shape));\n this._filterShapeKey = key;\n }\n return this._filterPipeline;\n }\n\n reserveCapacity() {}\n private _ensureBuffers(width: number, height: number) {\n if (width <= this._width && height <= this._height && this._colors.length) return;\n width = Math.max(width, this._width); height = Math.max(height, this._height);\n this._destroyBuffers();\n const pixels = width * height;\n const createBuffer = (label: string, bytes: number) =>\n this._device.createBuffer({\n label,\n size: pixels * bytes,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n });\n this._guides = [createBuffer('JNLM guide A', 8), createBuffer('JNLM guide B', 8)];\n this._colors = [createBuffer('JNLM color A', 16), createBuffer('JNLM color B', 16)];\n this._width = width;\n this._height = height;\n }\n\n private _destroyBuffers() {\n for (const buffer of [...this._guides, ...this._colors]) buffer.destroy();\n this._guides = [];\n this._colors = [];\n }\n\n /** Encodes the denoiser and returns the RGBA32F output in texture rows. */\n encode(encoder: GPUCommandEncoder, inputs: JNLMInputs): GPUBuffer {\n const { width, height, shape } = inputs;\n this._ensureBuffers(width, height);\n const iterations = Math.min(Math.max(Math.round(shape.iterations), 1), MAX_ITERATIONS);\n const sensitivity = JNLM_DEFAULT_COLOR_SENSITIVITY * Math.max(inputs.strength, 1e-3);\n this._paramsBuffers.forEach((buffer, i) => {\n const params = new ArrayBuffer(16);\n new Uint32Array(params, 0, 2).set([width, height]);\n // Buffer i (from 1) is filter pass i - 1; index 0 is the prepasses.\n new Float32Array(params, 8, 2).set([sensitivity, jnlmPassDilation(Math.max(i - 1, 0))]);\n this._device.queue.writeBuffer(buffer, 0, params);\n });\n\n const device = this._device;\n const filterPipeline = this._getFilterPipeline(shape);\n const bind = (\n pipeline: GPUComputePipeline,\n paramsBuffer: GPUBuffer,\n resources: GPUBindingResource[]\n ) =>\n device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n ...resources.map((resource, i) => ({ binding: i + 1, resource }))\n ]\n });\n const [guideA, guideB] = this._guides;\n const [colorA, colorB] = this._colors;\n const prepass = this._paramsBuffers[0];\n const passes: [GPUComputePipeline, GPUBindGroup][] = [\n [this._guidePipeline, bind(this._guidePipeline, prepass, [\n { buffer: inputs.accumulation },\n { buffer: inputs.normalAccumulation },\n { buffer: guideB }\n ])],\n [this._variancePipeline, bind(this._variancePipeline, prepass, [\n { buffer: guideB },\n { buffer: guideA }\n ])],\n [this._loadColorPipeline, bind(this._loadColorPipeline, prepass, [\n inputs.color.createView(),\n { buffer: colorA }\n ])]\n ];\n const albedoView = inputs.albedo.createView();\n const normalView = inputs.normal.createView();\n const shadowCatcherView = inputs.shadowCatcher.createView();\n let guides = [guideA, guideB];\n let colors = [colorA, colorB];\n for (let i = 1; i <= iterations; i++) {\n passes.push([filterPipeline, bind(filterPipeline, this._paramsBuffers[i], [\n { buffer: guides[0] },\n { buffer: colors[0] },\n albedoView,\n normalView,\n { buffer: colors[1] },\n { buffer: guides[1] },\n shadowCatcherView\n ])]);\n guides = [guides[1], guides[0]];\n colors = [colors[1], colors[0]];\n }\n const pass = encoder.beginComputePass({ label: 'JNLM denoise' });\n for (const [pipeline, bindGroup] of passes) {\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(\n Math.ceil(width / JNLM_WORKGROUP_SIZE),\n Math.ceil(height / JNLM_WORKGROUP_SIZE)\n );\n }\n pass.end();\n return colors[0];\n }\n\n getMemoryBytes() {\n return [...this._paramsBuffers, ...this._guides, ...this._colors]\n .reduce((sum, buffer) => sum + buffer.size, 0);\n }\n\n dispose() {\n for (const buffer of this._paramsBuffers) buffer.destroy();\n this._destroyBuffers();\n }\n}\n"]}
@@ -0,0 +1,44 @@
1
+ export declare function createNormalizeRayTraceOutputWGSL(layers?: boolean, catcher?: boolean): string;
2
+ type RayTraceOutput = 'color' | 'normal' | 'albedo' | 'shadowCatcher' | 'foreground' | 'catcherBackground';
3
+ type RayTraceBuffers = {
4
+ color: GPUBuffer;
5
+ normal: GPUBuffer;
6
+ albedo: GPUBuffer;
7
+ shadowCatcher: GPUBuffer;
8
+ shadowCatcherOffset?: number;
9
+ };
10
+ export declare class WGPURayTraceOutputPass {
11
+ private readonly zeroTexture?;
12
+ private _device;
13
+ private _pipeline;
14
+ private _layersPipeline;
15
+ private _foregroundTexture;
16
+ private _catcherBackgroundTexture;
17
+ private _colorTexture;
18
+ private _normalTexture;
19
+ private _albedoTexture;
20
+ private _shadowCatcherTexture;
21
+ private _uniformBindGroup;
22
+ private _uniformsBuffers;
23
+ private _width;
24
+ private _height;
25
+ private _hasCatcher;
26
+ private _needsUpdatePipeline;
27
+ constructor(device: GPUDevice, zeroTexture?: GPUTexture | undefined);
28
+ private readonly _retainedOutputs;
29
+ retainOutput(texture: GPUTexture): void;
30
+ releaseOutput(texture: GPUTexture): void;
31
+ getOutput(label: RayTraceOutput): GPUTexture;
32
+ private _createTextures;
33
+ private _updateBindGroups;
34
+ private _updatePipeline;
35
+ setSize(width: number, height: number): void;
36
+ setSampleCount(sampleCount: number): void;
37
+ setSampleTileGrid(columns: number, rows: number): void;
38
+ createPass(encoder: GPUCommandEncoder, inputBuffers: RayTraceBuffers, separateCatcher?: boolean): void;
39
+ private _createOutputPass;
40
+ private _destroyTextures;
41
+ getMemoryBytes(): number;
42
+ dispose(): void;
43
+ }
44
+ export {};