@meimu/mutracer 0.1.5 → 0.3.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 (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1,3 +1,6 @@
1
+ import { displayAovKind, DEFAULT_AOV_DISPLAY } from './aovDisplay.js';
2
+ import { WebGLAov } from './WebGLAov.js';
3
+ import { aovMask } from './aov.js';
1
4
  import { scheduleFrame } from '../util/frame.js';
2
5
  import { WebGLScratchCopy } from './WebGLScratchCopy.js';
3
6
  import { ScratchPool } from './ScratchPool.js';
@@ -6,14 +9,13 @@ import { readRgbaPixels } from './WebGLReadback.js';
6
9
  import { vec3 } from '../math.js';
7
10
  import halton from './halton.js';
8
11
  import { makeTileRender } from './TileRender.js';
9
- import { constants } from './webgl.js';
12
+ import { constants, Texture2D } from './webgl.js';
10
13
  import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
11
14
  import WebGLRayTracePass from './WebGLRayTracePass.js';
12
15
  import { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';
13
16
  import WebGLBloomPass from './WebGLBloomPass.js';
14
17
  import { composeFragment, outputFragment } from './glsl/webglPipeline.frag.js';
15
18
  import { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';
16
- const wavelengths = [650, 510, 475];
17
19
  /**
18
20
  * WebGL 2.0 counterpart of WGPURenderingPipeline.
19
21
  *
@@ -22,10 +24,13 @@ const wavelengths = [650, 510, 475];
22
24
  */
23
25
  function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
24
26
  let sampleRenderedCallback = (_sampleCount, _isFirstFrame, _frameTime) => { };
25
- let allowMultipleSamplesPerFrame = false;
27
+ let batchSamples = false;
26
28
  let offlineSamplesPerBatch = 0;
27
29
  let deferPostProcess = false;
28
30
  let sampleSequenceOffset = 0;
31
+ const aov = new WebGLAov(renderer);
32
+ let aovCamera;
33
+ let displayTrace;
29
34
  let sampleCount = 0;
30
35
  let elapsedFrameTime = 32;
31
36
  let elapsedTileTime;
@@ -55,6 +60,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
55
60
  let tint = 0;
56
61
  let vignette = 0;
57
62
  let output = 'final';
63
+ let aovDisplayOptions = DEFAULT_AOV_DISPLAY;
58
64
  let pageLeaveTime = performance.now();
59
65
  let pageInvisibleTime = 0;
60
66
  const shadowCatcherColor = vec3.create();
@@ -111,20 +117,20 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
111
117
  updateSeed(true);
112
118
  if (rayTracePass.hasDispersion()) {
113
119
  if (execution?.dispersionWavelengths === 1) {
114
- // A positive wavelength enables stochastic hero-wavelength sampling
115
- // in the shader. Preview traces one random RGB channel per pixel.
116
- rayTracePass.setWavelength(wavelengths[0]);
120
+ // A positive channel enables stochastic hero-wavelength sampling in
121
+ // the shader. Preview traces one random RGB channel per pixel.
122
+ rayTracePass.setSpectralChannel(1);
117
123
  rayTracePass.createPass(clear, tile);
118
124
  }
119
125
  else {
120
- wavelengths.forEach((wavelength, index) => {
121
- rayTracePass.setWavelength(wavelength);
122
- rayTracePass.createPass(clear && index === 0, tile, index > 0);
123
- });
126
+ for (let channel = 1; channel <= 3; channel++) {
127
+ rayTracePass.setSpectralChannel(channel);
128
+ rayTracePass.createPass(clear && channel === 1, tile, channel > 1);
129
+ }
124
130
  }
125
131
  }
126
132
  else {
127
- rayTracePass.setWavelength(0);
133
+ rayTracePass.setSpectralChannel(0);
128
134
  rayTracePass.createPass(clear, tile);
129
135
  }
130
136
  }
@@ -133,6 +139,16 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
133
139
  resolvedSamples = sampleCount;
134
140
  resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();
135
141
  }
142
+ const aovKind = displayAovKind(output);
143
+ if (aovKind && sampleCount === 0) {
144
+ if (!execution?.aovs?.includes(aovKind))
145
+ throw new Error(`AOV ${aovKind} is not enabled`);
146
+ if (!aov.samples)
147
+ return;
148
+ presentationTexture = copy.copy(aov.visualize(aovKind, aovDisplayOptions), renderWidth, renderHeight, presentationTexture);
149
+ presentationDenoised = false;
150
+ return;
151
+ }
136
152
  if (resolvedSamples === 0)
137
153
  return;
138
154
  if (resolve) {
@@ -155,6 +171,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
155
171
  bloomState.settings = bloomSettings;
156
172
  bloomPass.setBrightThreshold(bloomThreshold);
157
173
  bloomPass.setRadius(bloomRadius);
174
+ displayTrace?.push('Bloom:SceneLinear');
158
175
  bloomPass.createPass(colorTexture);
159
176
  }
160
177
  else if (bloomEnabled && sampleCount < 10) {
@@ -165,6 +182,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
165
182
  shadowCatcherEnabled: +resolvedHasShadowCatcher,
166
183
  outputMode: output === 'shadow' ? 1 : 0
167
184
  });
185
+ displayTrace?.push('Compose:DisplayEncoded');
168
186
  composePass.createPass({
169
187
  colorTex: colorTexture,
170
188
  foregroundTex: rayTraceOutputPass.getOutput('foreground'),
@@ -189,16 +207,23 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
189
207
  shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),
190
208
  strength: pendingDenoiser.strength,
191
209
  shape: pendingDenoiser.shape
192
- });
210
+ }, displayTrace);
193
211
  denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture);
194
212
  denoiseValid = true;
195
213
  pendingDenoiser = undefined;
196
214
  }
197
215
  let displayTexture = (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');
198
- if (output === 'normal' || output === 'albedo') {
216
+ if (aovKind) {
217
+ if (!execution?.aovs?.includes(aovKind))
218
+ throw new Error(`AOV ${aovKind} is not enabled`);
219
+ displayTexture = aov.visualize(aovKind, aovDisplayOptions);
220
+ }
221
+ else if (output === 'normal' || output === 'albedo') {
222
+ displayTrace?.push('AOV:Raw');
199
223
  displayTexture = rayTraceOutputPass.getOutput(output);
200
224
  }
201
225
  else if (output === 'shadowCatcher') {
226
+ displayTrace?.push('AOV:Raw');
202
227
  displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');
203
228
  }
204
229
  presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);
@@ -221,14 +246,18 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
221
246
  function trace(camera, maxSamples) {
222
247
  if (rayTracePass.isInvalid() || renderFailed)
223
248
  return false;
224
- if (!renderer.isAllProgramCompiled()) {
225
- isFirstFrame = true;
226
- sampleCount = 0;
227
- tileRender.reset();
249
+ // Waiting for a shader is not an input change; see the WebGPU pipeline.
250
+ if (!renderer.isAllProgramCompiled())
228
251
  return true;
229
- }
230
252
  rayTracePass.setCamera(camera);
253
+ aovCamera = camera;
254
+ if (!rayTracePass.preparePrograms())
255
+ return true;
231
256
  const resetAccumulation = isFirstFrame;
257
+ if (resetAccumulation)
258
+ aov.reset();
259
+ if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov, camera, renderWidth, renderHeight, execution.aovs))
260
+ return true;
232
261
  if (resetAccumulation) {
233
262
  tileTimingGeneration++;
234
263
  elapsedTileTime = undefined;
@@ -252,7 +281,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
252
281
  if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {
253
282
  tile.samplesPerFrame = offlineSamplesPerBatch;
254
283
  }
255
- else if (!allowMultipleSamplesPerFrame ||
284
+ else if (!batchSamples ||
256
285
  !(tile.isFirstTile && tile.isLastTile)) {
257
286
  tile.samplesPerFrame = 1;
258
287
  }
@@ -267,6 +296,10 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
267
296
  if (tile.isLastTile)
268
297
  sampleCount++;
269
298
  }
299
+ if (sampleCount !== frameSampleCount) {
300
+ if (execution?.aovs?.length)
301
+ rayTracePass.renderAovs(aov, camera, renderWidth, renderHeight, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset);
302
+ }
270
303
  if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {
271
304
  drawPostProcess(sampleCount >= maxSamples, true);
272
305
  }
@@ -334,9 +367,25 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
334
367
  invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },
335
368
  synchronizeBackground() { },
336
369
  configure(settings) {
337
- execution = { ...settings };
370
+ if (settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16) < 1))
371
+ throw new RangeError('aovSamples must be a positive integer');
372
+ const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);
373
+ if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples)
374
+ aov.samples = 0;
375
+ execution = { ...settings, aovs: [...(settings.aovs ?? [])] };
376
+ // A reduced preview set can retire the previously displayed AOV before
377
+ // Display applies its next channel after tracing.
378
+ const displayedAov = displayAovKind(output);
379
+ if (displayedAov && !settings.aovs?.includes(displayedAov))
380
+ output = 'final';
381
+ if (previousMask && !nextMask) {
382
+ aov.dispose();
383
+ aov.history.clear();
384
+ aov.width = aov.height = 0;
385
+ aov.reset();
386
+ }
338
387
  maxTimePerTile = Math.max(1, settings.timeBudgetMs);
339
- allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;
388
+ batchSamples = settings.batchSamples;
340
389
  tileRender.setDesiredMsPerTile(maxTimePerTile);
341
390
  tileRender.setMaxTiles(settings.maxTiles);
342
391
  },
@@ -358,12 +407,13 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
358
407
  getMemory() {
359
408
  return {
360
409
  width: renderWidth, height: renderHeight,
361
- bytes: rayTracePass.getTargetMemoryBytes(targetKey)
410
+ bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)
362
411
  + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)
363
412
  };
364
413
  },
365
414
  isFirstFrame: () => isFirstFrame,
366
415
  restartSamples(_preserveTemporalHistory = false) {
416
+ aov.reset();
367
417
  tileRender.reset();
368
418
  isFirstFrame = true;
369
419
  sampleCount = 0;
@@ -377,6 +427,8 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
377
427
  }
378
428
  if (isFirstFrame || sampleCount < 1)
379
429
  return Promise.resolve(false);
430
+ if (output !== 'final' && output !== 'shadow')
431
+ return Promise.resolve(true);
380
432
  pendingDenoiser = filter.denoiser;
381
433
  drawPostProcess(true);
382
434
  return Promise.resolve(true);
@@ -441,6 +493,35 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
441
493
  return undefined;
442
494
  },
443
495
  getTotalSamplesRendered: () => sampleCount,
496
+ /** @internal */
497
+ _displayParity() {
498
+ return {
499
+ record(trace) { displayTrace = trace; },
500
+ load(input) {
501
+ setSize(input.width, input.height);
502
+ denoiseValid = false;
503
+ pendingDenoiser = undefined;
504
+ const texture = (data) => {
505
+ const t = new Texture2D({ width: input.width, height: input.height,
506
+ source: { data, width: input.width, height: input.height }, type: constants.FLOAT,
507
+ minFilter: constants.NEAREST, magFilter: constants.NEAREST });
508
+ return t;
509
+ };
510
+ const shadow = Float32Array.from({ length: input.width * input.height * 4 }, (_, i) => i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);
511
+ const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);
512
+ const inputs = { color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),
513
+ moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),
514
+ shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments) };
515
+ rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);
516
+ sampleCount = resolvedSamples = input.samples;
517
+ resolvedHasShadowCatcher = input.catcher;
518
+ isFirstFrame = false;
519
+ rayTraceOutputPass.setSize(renderWidth, renderHeight);
520
+ rayTraceOutputPass.setSampleCount(sampleCount);
521
+ rayTraceOutputPass.createPass(rayTracePass);
522
+ }
523
+ };
524
+ },
444
525
  getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),
445
526
  flushDiagnostics: async () => { },
446
527
  setShadowCatcherParams(color, alpha) {
@@ -468,6 +549,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
468
549
  setOnSampleRendered(cb) {
469
550
  sampleRenderedCallback = cb;
470
551
  },
552
+ setAovDisplayOptions(options) { aovDisplayOptions = { ...options, depthRange: [...options.depthRange] }; },
471
553
  setOutput(nextOutput) {
472
554
  if (output === nextOutput)
473
555
  return false;
@@ -481,6 +563,27 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
481
563
  const width = presentationTexture.width, height = presentationTexture.height;
482
564
  return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };
483
565
  },
566
+ aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },
567
+ getAovSamples() { return aov.samples; },
568
+ restartAovs() { aov.reset(); },
569
+ refineAovs(camera, samples = sampleCount) {
570
+ if (samples < 1 || !execution?.aovs?.length)
571
+ return true;
572
+ rayTracePass.setCamera(camera);
573
+ aovCamera = camera;
574
+ return rayTracePass.renderAovs(aov, camera, renderWidth, renderHeight, samples, execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset);
575
+ },
576
+ async readAov(kind) {
577
+ if (!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount < 1 && aov.samples < 1))
578
+ throw new Error('AOV output is not ready');
579
+ rayTracePass.setCamera(aovCamera);
580
+ while (!rayTracePass.renderAovs(aov, aovCamera, renderWidth, renderHeight, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset)) {
581
+ if (disposed || renderer.gl.isContextLost())
582
+ throw new Error('AOV compilation was interrupted');
583
+ await new Promise(resolve => scheduleFrame(() => resolve()));
584
+ }
585
+ return aov.read(kind);
586
+ },
484
587
  async readOutput(kind) {
485
588
  if (kind === 'denoised' && (!denoisedTexture || !denoiseValid))
486
589
  kind = 'hdr';
@@ -494,6 +597,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
494
597
  disposed = true;
495
598
  if (typeof document !== 'undefined')
496
599
  document.removeEventListener('visibilitychange', onVisibilityChange);
600
+ aov.dispose();
497
601
  rayTracePass.releaseTarget(targetKey);
498
602
  rayTraceOutputPass.dispose();
499
603
  presentationTexture?.dispose(renderer.gl);
@@ -1 +1 @@
1
- {"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport Camera from '../scene/Camera.js';\nimport { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\nconst wavelengths = [650, 510, 475];\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let output: DisplayChannel = 'final';\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive wavelength enables stochastic hero-wavelength sampling\n // in the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setWavelength(wavelengths[0]);\n rayTracePass.createPass(clear, tile);\n } else {\n wavelengths.forEach((wavelength, index) => {\n rayTracePass.setWavelength(wavelength);\n rayTracePass.createPass(clear && index === 0, tile, index > 0);\n });\n }\n } else {\n rayTracePass.setWavelength(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n });\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (output === 'normal' || output === 'albedo') {\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n if (!renderer.isAllProgramCompiled()) {\n isFirstFrame = true;\n sampleCount = 0;\n tileRender.reset();\n return true;\n }\n\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !allowMultipleSamplesPerFrame ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
1
+ {"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WebGLAov} from './WebGLAov.js';\nimport {aovMask} from './aov.js';\nimport {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport Camera from '../scene/Camera.js';\nimport type { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport type {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let batchSamples = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n const aov=new WebGLAov(renderer);\n let aovCamera: Camera | undefined;\n let displayTrace: string[] | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let output: DisplayChannel = 'final';\n let aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive channel enables stochastic hero-wavelength sampling in\n // the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setSpectralChannel(1);\n rayTracePass.createPass(clear, tile);\n } else {\n for (let channel = 1; channel <= 3; channel++) {\n rayTracePass.setSpectralChannel(channel);\n rayTracePass.createPass(clear && channel === 1, tile, channel > 1);\n }\n }\n } else {\n rayTracePass.setSpectralChannel(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n presentationTexture = copy.copy(aov.visualize(aovKind,aovDisplayOptions), renderWidth, renderHeight, presentationTexture);\n presentationDenoised = false;\n return;\n }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n displayTrace?.push('Compose:DisplayEncoded');\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n }, displayTrace);\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind,aovDisplayOptions);\n } else if (output === 'normal' || output === 'albedo') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n // Waiting for a shader is not an input change; see the WebGPU pipeline.\n if (!renderer.isAllProgramCompiled()) return true;\n\n rayTracePass.setCamera(camera);\n aovCamera=camera;\n if (!rayTracePass.preparePrograms()) return true;\n const resetAccumulation = isFirstFrame;\n if(resetAccumulation) aov.reset();\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov,camera,renderWidth,renderHeight,execution.aovs)) return true;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !batchSamples ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if(sampleCount!==frameSampleCount){\n if(execution?.aovs?.length) rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n if(settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16)<1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // A reduced preview set can retire the previously displayed AOV before\n // Display applies its next channel after tracing.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if(previousMask && !nextMask){aov.dispose();aov.history.clear();aov.width=aov.height=0;aov.reset();}\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n aov.reset();\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n setSize(input.width, input.height);\n denoiseValid = false; pendingDenoiser = undefined;\n const texture = (data: Float32Array) => {\n const t = new Texture2D({width: input.width, height: input.height,\n source: {data, width: input.width, height: input.height}, type: constants.FLOAT,\n minFilter: constants.NEAREST, magFilter: constants.NEAREST});\n return t;\n };\n const shadow = Float32Array.from({length: input.width * input.height * 4}, (_, i) =>\n i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);\n const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);\n const inputs = {color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),\n moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),\n shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments)};\n rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher; isFirstFrame = false;\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n };\n },\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n rayTracePass.setCamera(camera); aovCamera = camera;\n return rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,samples,execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n },\n async readAov(kind) {\n if(!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount<1 && aov.samples<1)) throw new Error('AOV output is not ready');\n rayTracePass.setCamera(aovCamera);\n while (!rayTracePass.renderAovs(aov,aovCamera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset)) {\n if (disposed || renderer.gl.isContextLost()) throw new Error('AOV compilation was interrupted');\n await new Promise<void>(resolve => scheduleFrame(() => resolve()));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n aov.dispose();\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline & DisplayParityTarget;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Physically based clear sky for the viewer's default environment, baked on
3
+ * the GPU into an equirectangular radiance map.
4
+ *
5
+ * Integrates single scattering through a spherical Rayleigh, Mie and ozone
6
+ * atmosphere and adds multiple scattering with the isotropic approximation
7
+ * of Hillaire, "A Scalable and Production Ready Sky and Atmosphere Rendering
8
+ * Technique" (EGSR 2020). Coefficients are the Earth defaults from Bruneton,
9
+ * "Precomputed Atmospheric Scattering" (2008/2017). Formulas only; no code is
10
+ * taken from either reference.
11
+ *
12
+ * WebGL 2 passes: transmittance table, multiple scattering by altitude, a
13
+ * sky-view table by elevation and azimuth relative to the sun, irradiance and
14
+ * exposure, then the map itself with an anti-aliased, limb-darkened sun disk.
15
+ * Distances are in kilometers so float32 keeps the horizon precise.
16
+ */
17
+ export interface SkyData {
18
+ data: Float32Array;
19
+ width: number;
20
+ height: number;
21
+ }
22
+ /** Bakes skies with its own WebGL 2 context; requires float render targets. */
23
+ export declare class WebGLSkyBaker {
24
+ private readonly gl;
25
+ private readonly programs;
26
+ private readonly targets;
27
+ private map?;
28
+ constructor();
29
+ /** Clear sky at a local solar time, in hours. */
30
+ bake(hours: number, width?: number, height?: number): SkyData;
31
+ dispose(): void;
32
+ private program;
33
+ private target;
34
+ private release;
35
+ private uniform;
36
+ private bind;
37
+ private draw;
38
+ private read;
39
+ }