@meimu/mutracer 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"geometryUpdates.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage, copyNumericStorage} from '../math/storage.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { isDeformationUpdate } from '../scene/geometryChanges.js';\nimport type Geometry from '../scene/Geometry.js';\nimport { Attribute } from '../scene/Geometry.js';\nimport { attributeValue, type AttributeData } from '../scene/attributeData.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\nimport { buildBLAS, refitBLAS, type FlattendBVH } from './bvhAccel.js';\nimport type { GeometryUpdateState, GeometryUpdateMesh, GeometryUpdateRegion, GeometryUpdateBinding } from './geometryUpdateState.js';\nimport {computeGeometryBounds, getBvhBounds } from './geometryBvhBounds.js';\n\ntype Prepared = GeometryUpdateState;\ntype BindingIndices<M extends GeometryUpdateMesh> = {source: Map<Geometry, GeometryUpdateBinding<M>[]>; prepared: Map<Geometry, GeometryUpdateBinding<M>[]>};\nconst vertexAttributes = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\n// Box only the identity: widening a generic preparation record for a native\n// WeakMap key can otherwise make a copy instead of retaining the caller's key.\nconst bindingIndices = new WeakMap<object, BindingIndices<GeometryUpdateMesh>>();\nfunction indices<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>) {\n // The prepared object's identity owns its binding type; entries are never\n // shared between preparations with different mesh types.\n let maps = bindingIndices.get(prepared) as BindingIndices<M> | undefined;\n if (!maps) {\n maps = { source: new Map(), prepared: new Map() };\n for (const binding of prepared.instanceBindings) {\n for (const [map, geometry] of [[maps.source, binding.mesh.geometry], [maps.prepared, binding.geometry]] as const) {\n let bindings = map.get(geometry);\n if (!bindings) map.set(geometry, bindings = []);\n bindings.push(binding);\n }\n }\n bindingIndices.set(prepared, maps);\n }\n return maps;\n}\n\n/** Displaced geometry must be prepared as a whole. */\nexport function canUpdateGeometries<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>, geometries: readonly Geometry[]) {\n return geometries.every(geometry => {\n const bindings = indices(prepared).source.get(geometry) ?? [];\n return bindings.length > 0 && bindings.every(b => !b.mesh.materials.some(m => m.displacementMap) &&\n b.geometry.position.array === geometry.position.array);\n });\n}\n\n/** Rewrites only a geometry's existing region, preserving global material indices. */\nfunction copyRegion(source: Geometry, merged: Geometry, region: GeometryUpdateRegion, topologyChanged: boolean, deformationOnly: boolean) {\n const { vertexOffset, indexOffset, materialIndices } = region;\n const count = source.vertexCount;\n for (const name of vertexAttributes) {\n if (name === 'materialIndex' || deformationOnly && name !== 'position' && name !== 'normal' && name !== 'tangent') continue;\n const target = merged[name]; if (!target) continue;\n const attribute = name === 'uv1' ? source.uv1 ?? source.uv : source[name];\n const offset = vertexOffset * target.itemSize;\n if (attribute && attribute.itemSize !== target.itemSize) {\n for (let v = 0; v < count; v++) for (let c = 0; c < target.itemSize; c++) {\n target.array[offset + v * target.itemSize + c] = c < attribute.itemSize ? attribute.array[v * attribute.itemSize + c] : name === 'tangent' && !hasGeneratedVertexTangents(source) ? 2 : 0;\n }\n }\n else if (attribute) target.array.set(attribute.array, offset);\n else target.array.fill(name === 'color' ? 1 : 0, offset, offset + count * target.itemSize);\n }\n if (!topologyChanged) return;\n writeMaterialIndices(source, materialIndices, merged.materialIndex!.array, vertexOffset);\n const indices = source.indexArray;\n for (let i = 0; i < indices.length; i++) writeIndex(merged, indexOffset + i, indices[i] + vertexOffset);\n}\n\n/** Constant-time topology detection; markUpdated also covers in-place index edits. */\nexport function geometryTopologyChanged(prepared: {geometryStates: Prepared['geometryStates']} | undefined, source: Geometry) {\n const state = prepared?.geometryStates.get(source);\n return !!state && (state.topologyVersion !== source.topologyVersion ||\n state.indices !== source.indices.array || state.indexCount !== source.indexArray.length);\n}\n\nexport interface GeometryUpdateOptions {\n softwareBvhs?: boolean;\n displacement?: Map<Geometry, {scale: number; ranges: Float32Array}>;\n}\n\n/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */\nexport function updatePreparedGeometries<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>, changed: ReadonlySet<Geometry>, options: GeometryUpdateOptions = {}) {\n const vertices: { first: number; count: number; topologyChanged: boolean; deformationOnly: boolean }[] = [];\n const blases: { blas: FlattendBVH; offset: number }[] = [];\n const meshes = new Set<M>();\n let resized = false, relocated = false, offset = 0;\n const updated = new Map<Geometry, FlattendBVH>();\n prepared.geometries.forEach((geometry, i) => {\n const source = indices(prepared).prepared.get(geometry)?.[0].mesh.geometry ?? geometry;\n const previous = i < prepared.blases.length ? prepared.blases[i].bvh : undefined;\n if (changed.has(source)) {\n const region = prepared.geometryRegions.get(geometry)!;\n const topologyChanged = geometryTopologyChanged(prepared, source);\n const deformationOnly = !topologyChanged && isDeformationUpdate(source);\n if (options.softwareBvhs !== false) {\n const displacement = options.displacement?.get(geometry);\n const key = displacement ? geometry : source;\n let bvh = updated.get(key);\n if (!bvh) {\n bvh = displacement ? getGeometryBvh(geometry) ?? getGeometryBvh(source) : getGeometryBvh(source);\n const detail = displacement ? {normal: source.normal.array,\n scale: displacement.scale, ranges: displacement.ranges} : undefined;\n if (topologyChanged || !bvh || source.dynamic && bvh.builder !== 'builtin' || !refitBLAS(bvh, source, detail)) {\n bvh = buildBLAS(source, displacement?.scale, displacement?.ranges);\n }\n setGeometryBvh(source, bvh); updated.set(key, bvh);\n }\n setGeometryBvh(geometry, bvh);\n prepared.blases[i].bvh = bvh;\n resized ||= previous?.buffer.byteLength !== bvh.buffer.byteLength;\n relocated ||= previous?.buffer.byteLength !== bvh.buffer.byteLength || previous?.layout !== bvh.layout;\n blases.push({blas: bvh, offset});\n }\n geometry.version = source.version;\n copyRegion(source, prepared.geometry, region, topologyChanged, deformationOnly);\n const count = source.vertexCount, previousVertices = vertices[vertices.length - 1];\n if (previousVertices && previousVertices.first + previousVertices.count === region.vertexOffset && previousVertices.topologyChanged === topologyChanged && previousVertices.deformationOnly === deformationOnly) previousVertices.count += count;\n else vertices.push({first: region.vertexOffset, count, topologyChanged, deformationOnly});\n for (const binding of indices(prepared).prepared.get(geometry) ?? []) {\n const bounds = options.softwareBvhs === false ? computeGeometryBounds(geometry) : getBvhBounds(geometry);\n // Keep shared bound arrays: native generic-record values read from a Map\n // can be copies, so replacing their tuple does not update the owner view.\n copyNumericStorage(binding.bvhBounds[0], matrixStorage(bounds[0]));\n copyNumericStorage(binding.bvhBounds[1], matrixStorage(bounds[1]));\n meshes.add(binding.mesh);\n }\n }\n if (i < prepared.blases.length) offset += prepared.blases[i].bvh.buffer.byteLength;\n });\n for (const source of changed) prepared.geometryStates.set(source, { topologyVersion: source.topologyVersion,\n indices: source.indices.array, indexCount: source.indexArray.length });\n return { vertices, blases, meshes, resized, relocated };\n}\n\nfunction writeIndex(geometry: Geometry, index: number, value: number) {\n const array = geometry.indexArray;\n array[index] = value;\n}\n\nfunction packAttribute<T extends AttributeData>(attribute: Attribute<T> | undefined,\n output: Float32Array, stride: number, offset: number, first: number, count: number, outputFirst = first) {\n if (!attribute) return;\n const array = attribute.array, size = attribute.itemSize;\n let destination = outputFirst * stride + offset, source = first * size;\n if (size === 1) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n }\n return;\n }\n if (size === 2) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n output[destination + 1] = attributeValue(array, source + 1);\n }\n return;\n }\n if (size === 3) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n output[destination + 1] = attributeValue(array, source + 1);\n output[destination + 2] = attributeValue(array, source + 2);\n }\n return;\n }\n if (size === 4) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n output[destination + 1] = attributeValue(array, source + 1);\n output[destination + 2] = attributeValue(array, source + 2);\n output[destination + 3] = attributeValue(array, source + 3);\n }\n return;\n }\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n for (let c = 0; c < size; c++) output[destination + c] = attributeValue(array, source + c);\n }\n}\n\n/** Packs the same interleaved vertex layout for full and partial GPU uploads. */\nexport function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number,\n offsets: readonly number[], first: number, count: number, includeMaterialIndex = true, deformationOnly = false, outputFirst = first) {\n packAttribute(geometry.position, output, stride, offsets[0], first, count, outputFirst);\n packAttribute(geometry.normal, output, stride, offsets[1], first, count, outputFirst);\n if (!deformationOnly) {\n packAttribute(geometry.uv, output, stride, offsets[2], first, count, outputFirst);\n packAttribute(geometry.uv1, output, stride, offsets[3], first, count, outputFirst);\n packAttribute(geometry.color, output, stride, offsets[4], first, count, outputFirst);\n }\n packAttribute(geometry.tangent, output, stride, offsets[5], first, count, outputFirst);\n if (includeMaterialIndex) packAttribute(geometry.materialIndex, output, stride, offsets[6], first, count, outputFirst);\n}\n"]}
1
+ {"version":3,"file":"geometryUpdates.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage, copyNumericStorage} from '../math/storage.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { isDeformationUpdate } from '../scene/geometryChanges.js';\nimport type Geometry from '../scene/Geometry.js';\nimport { Attribute } from '../scene/Geometry.js';\nimport { attributeValue, type AttributeData } from '../scene/attributeData.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\nimport { buildBLAS, refitBLAS, type FlattendBVH } from './bvhAccel.js';\nimport type { GeometryUpdateState, GeometryUpdateMesh, GeometryUpdateRegion, GeometryUpdateBinding } from './geometryUpdateState.js';\nimport {computeGeometryBounds, getBvhBounds } from './geometryBvhBounds.js';\n\ntype Prepared = GeometryUpdateState;\ntype BindingIndices<M extends GeometryUpdateMesh> = {source: Map<Geometry, GeometryUpdateBinding<M>[]>; prepared: Map<Geometry, GeometryUpdateBinding<M>[]>};\nconst vertexAttributes = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\n// Box only the identity: widening a generic preparation record for a native\n// WeakMap key can otherwise make a copy instead of retaining the caller's key.\nconst bindingIndices = new WeakMap<object, BindingIndices<GeometryUpdateMesh>>();\nfunction indices<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>) {\n // The prepared object's identity owns its binding type; entries are never\n // shared between preparations with different mesh types.\n let maps = bindingIndices.get(prepared) as BindingIndices<M> | undefined;\n if (!maps) {\n maps = { source: new Map(), prepared: new Map() };\n for (const binding of prepared.instanceBindings) {\n for (const [map, geometry] of [[maps.source, binding.mesh.geometry], [maps.prepared, binding.geometry]] as const) {\n let bindings = map.get(geometry);\n if (!bindings) map.set(geometry, bindings = []);\n bindings.push(binding);\n }\n }\n bindingIndices.set(prepared, maps);\n }\n return maps;\n}\n\n/** Displaced geometry must be prepared as a whole. */\nexport function canUpdateGeometries<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>, geometries: readonly Geometry[]) {\n return geometries.every(geometry => {\n const bindings = indices(prepared).source.get(geometry) ?? [];\n return bindings.length > 0 && bindings.every(b => !b.mesh.materials.some(m => m.displacementMap) &&\n b.geometry.position.array === geometry.position.array);\n });\n}\n\n/** Rewrites only a geometry's existing region, preserving global material indices. */\nfunction copyRegion(source: Geometry, merged: Geometry, region: GeometryUpdateRegion, topologyChanged: boolean, deformationOnly: boolean) {\n const { vertexOffset, indexOffset, materialIndices } = region;\n const count = source.vertexCount;\n for (const name of vertexAttributes) {\n if (name === 'materialIndex' || deformationOnly && name !== 'position' && name !== 'normal' && name !== 'tangent') continue;\n const target = merged[name]; if (!target) continue;\n const attribute = name === 'uv1' ? source.uv1 ?? source.uv : source[name];\n const offset = vertexOffset * target.itemSize;\n if (attribute && attribute.itemSize !== target.itemSize) {\n for (let v = 0; v < count; v++) for (let c = 0; c < target.itemSize; c++) {\n target.array[offset + v * target.itemSize + c] = c < attribute.itemSize ? attribute.array[v * attribute.itemSize + c] : name === 'tangent' && !hasGeneratedVertexTangents(source) ? 2 : 0;\n }\n }\n else if (attribute) target.array.set(attribute.array, offset);\n else target.array.fill(name === 'color' ? 1 : 0, offset, offset + count * target.itemSize);\n }\n if (!topologyChanged) return;\n writeMaterialIndices(source, materialIndices, merged.materialIndex!.array, vertexOffset);\n const indices = source.indexArray;\n for (let i = 0; i < indices.length; i++) writeIndex(merged, indexOffset + i, indices[i] + vertexOffset);\n}\n\n/** Constant-time topology detection; markUpdated also covers in-place index edits. */\nexport function geometryTopologyChanged(prepared: {geometryStates: Prepared['geometryStates']} | undefined, source: Geometry) {\n const state = prepared?.geometryStates.get(source);\n return !!state && (state.topologyVersion !== source.topologyVersion ||\n state.indices !== source.indices.array || state.indexCount !== source.indexArray.length);\n}\n\nexport interface GeometryUpdateOptions {\n softwareBvhs?: boolean;\n displacement?: Map<Geometry, {scale: number; ranges: Float32Array}>;\n}\n\n/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */\nexport function updatePreparedGeometries<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>, changed: ReadonlySet<Geometry>, options: GeometryUpdateOptions = {}) {\n const vertices: { first: number; count: number; topologyChanged: boolean; deformationOnly: boolean }[] = [];\n const blases: { blas: FlattendBVH; offset: number }[] = [];\n const meshes = new Set<M>();\n let resized = false, relocated = false, offset = 0;\n const updated = new Map<Geometry, FlattendBVH>();\n prepared.geometries.forEach((geometry, i) => {\n const source = indices(prepared).prepared.get(geometry)?.[0].mesh.geometry ?? geometry;\n const previous = i < prepared.blases.length ? prepared.blases[i].bvh : undefined;\n if (changed.has(source)) {\n const region = prepared.geometryRegions.get(geometry)!;\n const topologyChanged = geometryTopologyChanged(prepared, source);\n const deformationOnly = !topologyChanged && isDeformationUpdate(source);\n if (options.softwareBvhs !== false) {\n const displacement = options.displacement?.get(geometry);\n const key = displacement ? geometry : source;\n let bvh = updated.get(key);\n if (!bvh) {\n bvh = displacement ? getGeometryBvh(geometry) ?? getGeometryBvh(source) : getGeometryBvh(source);\n const detail = displacement ? {normal: source.normal.array,\n scale: displacement.scale, ranges: displacement.ranges} : undefined;\n if (topologyChanged || !bvh || source.dynamic && bvh.builder !== 'builtin' || !refitBLAS(bvh, source, detail)) {\n bvh = buildBLAS(source, displacement?.scale, displacement?.ranges);\n }\n setGeometryBvh(source, bvh); updated.set(key, bvh);\n }\n setGeometryBvh(geometry, bvh);\n prepared.blases[i].bvh = bvh;\n resized ||= previous?.buffer.byteLength !== bvh.buffer.byteLength;\n relocated ||= previous?.buffer.byteLength !== bvh.buffer.byteLength || previous?.layout !== bvh.layout;\n blases.push({blas: bvh, offset});\n }\n geometry.version = source.version;\n if (prepared.mergedAttributes !== false) copyRegion(source, prepared.geometry, region, topologyChanged, deformationOnly);\n const count = source.vertexCount, previousVertices = vertices[vertices.length - 1];\n if (prepared.mergedAttributes !== false && previousVertices && previousVertices.first + previousVertices.count === region.vertexOffset && previousVertices.topologyChanged === topologyChanged && previousVertices.deformationOnly === deformationOnly) previousVertices.count += count;\n else vertices.push({first: region.vertexOffset, count, topologyChanged, deformationOnly});\n for (const binding of indices(prepared).prepared.get(geometry) ?? []) {\n const bounds = options.softwareBvhs === false ? computeGeometryBounds(geometry) : getBvhBounds(geometry);\n // Keep shared bound arrays: native generic-record values read from a Map\n // can be copies, so replacing their tuple does not update the owner view.\n copyNumericStorage(binding.bvhBounds[0], matrixStorage(bounds[0]));\n copyNumericStorage(binding.bvhBounds[1], matrixStorage(bounds[1]));\n meshes.add(binding.mesh);\n }\n }\n if (i < prepared.blases.length) offset += prepared.blases[i].bvh.buffer.byteLength;\n });\n for (const source of changed) prepared.geometryStates.set(source, { topologyVersion: source.topologyVersion,\n indices: source.indices.array, indexCount: source.indexArray.length });\n return { vertices, blases, meshes, resized, relocated };\n}\n\nfunction writeIndex(geometry: Geometry, index: number, value: number) {\n const array = geometry.indexArray;\n array[index] = value;\n}\n\nfunction packAttribute<T extends AttributeData>(attribute: Attribute<T> | undefined,\n output: Float32Array, stride: number, offset: number, first: number, count: number, outputFirst = first) {\n if (!attribute) return;\n const array = attribute.array, size = attribute.itemSize;\n let destination = outputFirst * stride + offset, source = first * size;\n if (size === 1) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n }\n return;\n }\n if (size === 2) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n output[destination + 1] = attributeValue(array, source + 1);\n }\n return;\n }\n if (size === 3) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n output[destination + 1] = attributeValue(array, source + 1);\n output[destination + 2] = attributeValue(array, source + 2);\n }\n return;\n }\n if (size === 4) {\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n output[destination] = attributeValue(array, source);\n output[destination + 1] = attributeValue(array, source + 1);\n output[destination + 2] = attributeValue(array, source + 2);\n output[destination + 3] = attributeValue(array, source + 3);\n }\n return;\n }\n for (let i = 0; i < count; i++, destination += stride, source += size) {\n for (let c = 0; c < size; c++) output[destination + c] = attributeValue(array, source + c);\n }\n}\n\n/** Packs the same interleaved vertex layout for full and partial GPU uploads. */\nexport function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number,\n offsets: readonly number[], first: number, count: number, includeMaterialIndex = true, deformationOnly = false, outputFirst = first) {\n packAttribute(geometry.position, output, stride, offsets[0], first, count, outputFirst);\n packAttribute(geometry.normal, output, stride, offsets[1], first, count, outputFirst);\n if (!deformationOnly) {\n packAttribute(geometry.uv, output, stride, offsets[2], first, count, outputFirst);\n packAttribute(geometry.uv1, output, stride, offsets[3], first, count, outputFirst);\n packAttribute(geometry.color, output, stride, offsets[4], first, count, outputFirst);\n }\n packAttribute(geometry.tangent, output, stride, offsets[5], first, count, outputFirst);\n if (includeMaterialIndex) packAttribute(geometry.materialIndex, output, stride, offsets[6], first, count, outputFirst);\n}\n"]}
@@ -9,7 +9,7 @@ export default new FragmentShader({
9
9
  mapping: Shader.uniform('vec4'), idComponent: Shader.uniform('int')
10
10
  },
11
11
  main: /* glsl */ `
12
- uint vn(uint v) {
12
+ uint xo(uint v) {
13
13
  v = (v ^ (v >> 16u)) * 0x7feb352du;
14
14
  v = (v ^ (v >> 15u)) * 0x846ca68bu;
15
15
  return v ^ (v >> 16u);
@@ -36,16 +36,16 @@ color = srgb(clamp(r.xyz / max(r.w, 1.0), 0.0, 1.0));
36
36
  } else if (kind == 5) {
37
37
  uvec4 ids = texelFetch(identity, p, 0);
38
38
  alpha = ids.x == 0xffffffffu ? 0.0 : 1.0;
39
- uint h = vn(ids[idComponent]);
39
+ uint h = xo(ids[idComponent]);
40
40
  color = .2 + .8 * vec3(float(h & 255u), float((h >> 8u) & 255u),
41
41
  float((h >> 16u) & 255u)) / 255.0;
42
42
  } else {
43
43
  vec4 m = texelFetch(motion, p, 0);
44
44
  alpha = m.w == 3.0 ? 1.0 : 0.0;
45
- float gR = length(m.xy), hue = 0.0;
46
- if (gR > 0.0) hue = fract(atan(m.y, m.x) / 6.28318530718 + 1.0);
45
+ float gT = length(m.xy), hue = 0.0;
46
+ if (gT > 0.0) hue = fract(atan(m.y, m.x) / 6.28318530718 + 1.0);
47
47
  vec3 v = abs(fract(vec3(hue) + vec3(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);
48
- color = clamp(v - 1.0, 0.0, 1.0) * clamp(gR / mapping.w, 0.0, 1.0);
48
+ color = clamp(v - 1.0, 0.0, 1.0) * clamp(gT / mapping.w, 0.0, 1.0);
49
49
  }
50
50
  if (alpha <= 0.0) color = vec3(0.0);
51
51
  out_color = vec4(color, clamp(alpha, 0.0, 1.0));
@@ -1,82 +1,82 @@
1
1
  import proposals from './aovReflectanceSamples.glsl.js';
2
2
  // GLSL mirror of the shared 256-proposal, fused OpenPBR reflection quadrature.
3
3
  export default proposals + /* glsl */ `
4
- void aovReflectance(ag prepared, bool qQ, bool kY, out vec3 diffuse, out vec3 specular) {
4
+ void aovReflectance(OpenPbrPreparedBsdf prepared, bool rV, bool lp, out vec3 diffuse, out vec3 specular) {
5
5
  diffuse=vec3(0.0); specular=vec3(0.0);
6
6
  vec3 view = prepared.viewLocal;
7
7
  if (view.z <= 1e-6) { return; }
8
8
  OpenPbrResolvedMaterial material = prepared.material;
9
9
  vec2 alpha = vec2(material.alphaX, material.alphaY);
10
- float mg = aF(view, alpha);
11
- float jl = prepared.weights[OPENPBR_LOBE_DIFFUSE];
12
- float gb = prepared.weights[OPENPBR_LOBE_METAL];
10
+ float mG = aD(view, alpha);
11
+ float jw = prepared.weights[OPENPBR_LOBE_DIFFUSE];
12
+ float fZ = prepared.weights[OPENPBR_LOBE_METAL];
13
13
  float specularWeight = prepared.weights[OPENPBR_LOBE_SPECULAR];
14
- float ei = 1.0;
15
- if (kY && prepared.dielectricMsProbability > 0.0) {
16
- ei = max(bf(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
14
+ float dY = 1.0;
15
+ if (lp && prepared.dielectricMsProbability > 0.0) {
16
+ dY = max(aZ(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
17
17
  }
18
- vec3 cr = normalize(vec3(alpha, 1.0) * view);
19
- float qP = min(cr.z, 1.0);
20
- float kh = 1.0 + qP;
18
+ vec3 cf = normalize(vec3(alpha, 1.0) * view);
19
+ float rU = min(cf.z, 1.0);
20
+ float ku = 1.0 + rU;
21
21
  uint count = 256u;
22
22
  for (uint i = 0u; i < uint(NO_UNROLL(256)); i++) {
23
- uint vV = i / 2u;
24
- vec2 u = vec2((float(vV) + 0.5) / float(count / 2u),
25
- fract(float(reverseBits(vV)) * 2.3283064365386963e-10 + 0.37));
26
- vec4 kK = hp[vV];
23
+ uint pair = i / 2u;
24
+ vec2 u = vec2((float(pair) + 0.5) / float(count / 2u),
25
+ fract(float(reverseBits(pair)) * 2.3283064365386963e-10 + 0.37));
26
+ vec4 proposal = ht[pair];
27
27
 
28
- bool hO = prepared.specularAlpha < 0.001;
29
- vec3 light = vec3(kK.xy, sqrt(max(0.0, 1.0 - dot(kK.xy, kK.xy))));
30
- if (hO) { light = aO(u); }
28
+ bool hP = prepared.specularAlpha < 0.001;
29
+ vec3 light = vec3(proposal.xy, sqrt(max(0.0, 1.0 - dot(proposal.xy, proposal.xy))));
30
+ if (hP) { light = aM(u); }
31
31
  if ((i & 1u) != 0u) {
32
- float kC = (1.0 - u.y) * kh;
33
- float ex = sqrt(max(0.0, (kC + (1.0 - qP)) * (u.y * kh)));
34
- vec3 ad = normalize(vec3(alpha, 1.0) * vec3(cr.xy + ex * kK.zw, kC));
35
- if (hO) { ad = aD(view, alpha, u); }
36
- light = reflect(-view, ad);
32
+ float kM = (1.0 - u.y) * ku;
33
+ float dw = sqrt(max(0.0, (kM + (1.0 - rU)) * (u.y * ku)));
34
+ vec3 aa = normalize(vec3(alpha, 1.0) * vec3(cf.xy + dw * proposal.zw, kM));
35
+ if (hP) { aa = aA(view, alpha, u); }
36
+ light = reflect(-view, aa);
37
37
  }
38
38
 
39
39
  if (light.z <= 0.0) { continue; }
40
- vec3 ad = normalize(view + light);
41
- float qH = mg * cW(ad, alpha) / (4.0 * view.z);
42
- float pdf = 0.5 * (light.z * INVPI + qH);
40
+ vec3 aa = normalize(view + light);
41
+ float specularPdf = mG * sampling_ggx_ndf(aa, alpha) / (4.0 * view.z);
42
+ float pdf = 0.5 * (light.z * INVPI + specularPdf);
43
43
 
44
44
 
45
- vec3 aA = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
46
- if (aA.z <= 0.0) { continue; }
47
- float scale = abs(aA.z) / (pdf * float(count));
48
- if (qQ && jl > 0.0) {
49
- float compensation = prepared.diffuseSpecularEnergyCompensation * aw(
50
- prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(aA.z));
51
- float sZ = 0.0;
52
- diffuse += jl * bJ(material, prepared.diffuseColor,
53
- view, aA, compensation, sZ) * scale;
45
+ vec3 au = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
46
+ if (au.z <= 0.0) { continue; }
47
+ float scale = abs(au.z) / (pdf * float(count));
48
+ if (rV && jw > 0.0) {
49
+ float compensation = prepared.diffuseSpecularEnergyCompensation * ar(
50
+ prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(au.z));
51
+ float unusedPdf = 0.0;
52
+ diffuse += jw * bB(material, prepared.diffuseColor,
53
+ view, au, compensation, unusedPdf) * scale;
54
54
  }
55
- if (kY) {
56
- vec3 jn = normalize(view + aA);
57
- float bm = abs(dot(view, jn));
58
- vec3 bG = vec3(0.0);
55
+ if (lp) {
56
+ vec3 evaluatedHalf = normalize(view + au);
57
+ float viewHalf = abs(dot(view, evaluatedHalf));
58
+ vec3 fresnel = vec3(0.0);
59
59
  if (specularWeight > 0.0) {
60
- vec3 dielectric = vec3(af(bm, material.relativeIor));
61
- if (material.thinWalled) { dielectric = av(dielectric, material.transmissionWeight); }
62
- bG += specularWeight * material.specularColor * dielectric;
60
+ vec3 dielectric = vec3(ae(viewHalf, material.relativeIor));
61
+ if (material.thinWalled) { dielectric = aq(dielectric, material.transmissionWeight); }
62
+ fresnel += specularWeight * material.specularColor * dielectric;
63
63
  }
64
- if (gb > 0.0) {
65
- bG += gb * material.specularWeight * cw(bm,
64
+ if (fZ > 0.0) {
65
+ fresnel += fZ * material.specularWeight * openpbr_metal_fresnel(viewHalf,
66
66
  material.baseWeight * material.baseColor, material.specularColor);
67
67
  }
68
- float rJ = cW(jn, alpha) * mg
69
- * aF(aA, alpha) / (4.0 * max(aA.z * view.z, 1e-8));
70
- vec3 reflection = bG * rJ;
71
- if (gb > 0.0 && prepared.metalMsFactor > 0.0) {
72
- float cL = min(prepared.metalMsFactor * aV(prepared.specularAlpha, aA.z), 1.0 / max(aA.z, 1e-8));
73
- reflection += gb * prepared.metalMsScale * cL * INVPI;
68
+ float sT = sampling_ggx_ndf(evaluatedHalf, alpha) * mG
69
+ * aD(au, alpha) / (4.0 * max(au.z * view.z, 1e-8));
70
+ vec3 reflection = fresnel * sT;
71
+ if (fZ > 0.0 && prepared.metalMsFactor > 0.0) {
72
+ float cA = min(prepared.metalMsFactor * aR(prepared.specularAlpha, au.z), 1.0 / max(au.z, 1e-8));
73
+ reflection += fZ * prepared.metalMsScale * cA * INVPI;
74
74
  }
75
75
  if (prepared.dielectricMsProbability > 0.0) {
76
- float oZ = prepared.dielectricMsViewLoss * bb(
77
- prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(aA.z)) / ei;
78
- float cL = min(oZ * prepared.dielectricMsReflectionRatio, 1.0 / abs(aA.z));
79
- reflection += prepared.dielectricMsReflectionScale * cL * INVPI;
76
+ float pX = prepared.dielectricMsViewLoss * aV(
77
+ prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(au.z)) / dY;
78
+ float cA = min(pX * prepared.dielectricMsReflectionRatio, 1.0 / abs(au.z));
79
+ reflection += prepared.dielectricMsReflectionScale * cA * INVPI;
80
80
  }
81
81
  specular += reflection * scale;
82
82
  }
@@ -1,7 +1,7 @@
1
1
  // Generated by scripts/generate-aov-reflectance-samples.mjs; do not edit.
2
2
  // xy: concentric cosine disk; zw: spherical-cap azimuth cosine/sine.
3
3
  export default /* glsl */ `
4
- const vec4 hp[128] = vec4[128](
4
+ const vec4 ht[128] = vec4[128](
5
5
  vec4(-0.971247852, -0.202764958, 0.999698818, 0.0245412290),
6
6
  vec4(-0.808660269, 0.547487736, 0.997290432, 0.0735645667),
7
7
  vec4(-0.942509234, 0.187289074, 0.992479563, 0.122410677),
@@ -11,19 +11,17 @@ import random from './chunks/random.glsl.js';
11
11
  import cameraRay from './chunks/cameraRay.glsl.js';
12
12
  import rand from './chunks/rand.glsl.js';
13
13
  const surface = /* glsl */ `
14
- uint ke(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }
15
- vec3 iN(int offset){return vec3(uintBitsToFloat(ke(offset)),uintBitsToFloat(ke(offset+1)),uintBitsToFloat(ke(offset+2)));}
16
- mat4 ow(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(ke(offset+i*4+j)); return m; }
17
- Ray wJ(vec2 uv) {
18
- vec4 origin = viewProjectionInv*vec4(uv*2.0-1.0,-1.0,1.0);
19
- vec4 target = viewProjectionInv*vec4(uv*2.0-1.0,1.0,1.0);
20
- Ray ray; gC(ray, origin.xyz/origin.w, normalize(target.xyz*origin.w-origin.xyz*target.w)); return ray;
14
+ uint kp(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }
15
+ vec3 iV(int offset){return vec3(uintBitsToFloat(kp(offset)),uintBitsToFloat(kp(offset+1)),uintBitsToFloat(kp(offset+2)));}
16
+ mat4 lC(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(kp(offset+i*4+j)); return m; }
17
+ Ray zl(vec2 uv) {
18
+ return cV(uv);
21
19
  }
22
- bool mQ(Ray wX, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {
23
- Ray ray=wX; si.triangleIndex=-1;
20
+ bool jS(Ray zB, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {
21
+ Ray ray=zB; si.triangleIndex=-1;
24
22
  for(int layer=0;layer<32;layer++) {
25
23
  intersectScene(ray,si,false); if(!si.hit) return false;
26
- dg(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
24
+ getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
27
25
  if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;
28
26
  ray.o=si.position+ray.d*(EPS*0.02);
29
27
  }
@@ -35,7 +33,7 @@ export function aovTraceFragment(center) {
35
33
  outputs: center ? ['id', 'motion'] : ['geometry', 'position', 'diffuse', 'specular'],
36
34
  outputTypes: center ? { id: 'uvec4' } : {}, defines: { DEPTH_QUERY_MODE: true },
37
35
  includes: [core, materials, intersect, random],
38
- uniforms: { viewProjectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),
36
+ uniforms: { viewProjectionInv: Shader.uniform('mat4'), projectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),
39
37
  cameraApertureRadius: Shader.uniform('float', 0), cameraFocusDistance: Shader.uniform('float', 10),
40
38
  viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),
41
39
  previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),
@@ -57,60 +55,70 @@ ${surface}
57
55
  void main() {
58
56
  ${center ? /* glsl */ `
59
57
  out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);
60
- Ray ray=wJ((floor(gl_FragCoord.xy)+0.5)/viewportSize);
58
+ Ray ray=zl((floor(gl_FragCoord.xy)+0.5)/viewportSize);
61
59
  SurfaceInteraction si; OpenPbrResolvedMaterial material;
62
- if(!mQ(ray,si,material)) return;
60
+ if(!jS(ray,si,material)) return;
63
61
  int offset=52+si.instanceIndex*24;
64
- out_id=uvec4(ke(offset),ke(offset+1),ke(int(ke(16))+si.materialIndex),ke(int(ke(17))+si.triangleIndex));
65
- out_motion.z=dot(si.position-iN(36),iN(40));
66
- if(ke(offset+2)==0u)return;
67
- vec4 qA=ow(offset+4)*vec4(si.position,1.0);
68
- vec4 ps=ow(0)*qA;
69
- if(ps.w<=0.0)return;
70
- vec3 tX=ps.xyz/ps.w;vec2 iz=(tX.xy*0.5+0.5)*viewportSize;
71
- if(any(lessThan(iz,vec2(0.0)))||any(greaterThanEqual(iz,viewportSize))||abs(tX.z)>1.0)return;
72
- uvec4 identity=texelFetch(previousId,ivec2(iz),0);float qz=texelFetch(previousMotion,ivec2(iz),0).z;
73
- if(any(notEqual(identity.xy,out_id.xy))||abs(qz-dot(qA.xyz-iN(44),iN(48)))>max(1e-4,abs(qz)*1e-3))return;
74
- out_motion=vec4((iz-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);
62
+ out_id=uvec4(kp(offset),kp(offset+1),kp(int(kp(16))+si.materialIndex),kp(int(kp(17))+si.triangleIndex));
63
+ out_motion.z=dot(si.position-iV(36),iV(40));
64
+ if(kp(offset+2)==0u)return;
65
+ vec4 rF=lC(offset+4)*vec4(si.position,1.0);
66
+ vec4 qp=lC(0)*rF;
67
+ if(qp.w<=0.0)return;
68
+ vec3 vJ=qp.xyz/qp.w;vec2 iF=(vJ.xy*0.5+0.5)*viewportSize;
69
+ if(any(lessThan(iF,vec2(0.0)))||any(greaterThanEqual(iF,viewportSize))||abs(vJ.z)>1.0)return;
70
+ uvec4 identity=texelFetch(previousId,ivec2(iF),0);float rE=texelFetch(previousMotion,ivec2(iF),0).z;
71
+ if(any(notEqual(identity.xy,out_id.xy))||abs(rE-dot(rF.xyz-iV(44),iV(48)))>max(1e-4,abs(rE)*1e-3))return;
72
+ out_motion=vec4((iF-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);
75
73
  ` : /* glsl */ `
76
74
  ivec2 coord=ivec2(gl_FragCoord.xy);
77
75
  out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);
78
76
  out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);
79
77
  out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);
80
78
  out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);
81
- rG(); aZ=uvec2(floor(gl_FragCoord.xy));
82
- gW(floor(gl_FragCoord.xy),int(aQ ^ dG(uint(sequenceSeed))));
83
- Ray ray=wJ((floor(gl_FragCoord.xy)+dZ(CAMERA_PIXEL))/viewportSize);
79
+ sP(); aJ=uvec2(floor(gl_FragCoord.xy));
80
+ fA(floor(gl_FragCoord.xy),int(aC ^ cD(uint(sequenceSeed))));
81
+ Ray ray=zl((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);
84
82
  if(cameraApertureRadius>0.0) {
85
83
  vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);
86
- vec3 jN=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));
87
- vec2 xU=cameraApertureRadius*kN(dZ(CAMERA_LENS));
88
- vec3 origin=(viewInv*vec4(xU,0.0,1.0)).xyz;
89
- gC(ray,origin,normalize(jN-origin));
84
+ vec3 jY=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));
85
+ vec2 wJ=cameraApertureRadius*kX(sample2D(CAMERA_LENS));
86
+ vec3 origin=(viewInv*vec4(wJ,0.0,1.0)).xyz;
87
+ initRay(ray,origin,normalize(jY-origin));
90
88
  }
91
89
  SurfaceInteraction si; OpenPbrResolvedMaterial material;
92
- if(!mQ(ray,si,material)) return;
90
+ if(!jS(ray,si,material)) return;
93
91
  float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);
94
92
  bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;
95
93
  out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);
96
94
  #ifdef AOV_REFLECTANCE
97
95
  if((aovMask&24)!=0 && !unsupported){
98
- vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),fu=-dot(face,ray.d);
96
+ vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),fk=-dot(face,ray.d);
99
97
  if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){
100
- if(cosine<0.0){normal=-normal;cosine=-cosine;}if(fu<0.0){face=-face;fu=-fu;}
98
+ if(cosine<0.0){normal=-normal;cosine=-cosine;}if(fk<0.0){face=-face;fk=-fk;}
101
99
  }
102
- if(fu>=0.0&&cosine<0.0){normal=face;cosine=fu;}
100
+ if(fk>=0.0&&cosine<0.0){normal=face;cosine=fk;}
103
101
  if(cosine<0.0)normal=-normal;
104
102
  material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;
105
103
  vec3 tangent=vec3(0.0);
106
104
  #ifdef USE_TANGENT
107
105
  tangent=si.tangent;
108
106
  #endif
109
- ag prepared=ds(tangent,material,-ray.d,normal);
107
+ OpenPbrPreparedBsdf prepared=bX(tangent,material,-ray.d,normal);
110
108
  vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);
111
- out_diffuse+=vec4(diffuse,1.0);out_specular+=vec4(specular,1.0);
109
+ if((aovMask&8)!=0)out_diffuse+=vec4(diffuse,1.0);
110
+ if((aovMask&16)!=0)out_specular+=vec4(specular,1.0);
112
111
  }
113
112
  #endif
113
+
114
+ if((aovMask&384)!=0 && material.materialType==STANDARD && material.alpha>=1.0 && material.transmissionWeight<=0.0 && dot(material.mediumScattering,material.mediumScattering)<=0.0){
115
+ float metal=clamp(material.baseMetalness,0.0,1.0);
116
+ vec3 base=material.baseWeight*material.baseColor;
117
+ vec3 layer=mix(vec3(1.0),material.coatColor,clamp(material.coatWeight,0.0,1.0));
118
+ float f=(material.specularIor-1.0)/(material.specularIor+1.0);
119
+ if((aovMask&128)!=0)out_diffuse+=vec4(layer*base*(1.0-metal),1.0);
120
+ if((aovMask&256)!=0)out_specular+=vec4(layer*(metal*base+(1.0-metal)*material.specularWeight*material.specularColor*f*f),1.0);
121
+ }
114
122
  out_position+=vec4(si.position,1.0);
115
123
  `}
116
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aovTrace.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/aovTrace.frag.ts"],"names":[],"mappings":"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","sourcesContent":["import bsdf from './chunks/openPbrBsdf.glsl.js';\nimport sampling from './chunks/sampling.glsl.js';\nimport reflectance from './aovReflectance.glsl.js';\nimport {FragmentShader, Shader} from '../shader.js';\nimport common from './chunks/common.glsl.js';\nimport core from './chunks/rayTraceCore.glsl.js';\nimport materials from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport uvProjection from './chunks/uvProjection.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport cameraRay from './chunks/cameraRay.glsl.js';\nimport rand from './chunks/rand.glsl.js';\nconst surface = /* glsl */ `\nuint aovWord(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }\nvec3 aovVector(int offset){return vec3(uintBitsToFloat(aovWord(offset)),uintBitsToFloat(aovWord(offset+1)),uintBitsToFloat(aovWord(offset+2)));}\nmat4 aovMatrix(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(aovWord(offset+i*4+j)); return m; }\nRay aovRay(vec2 uv) {\n vec4 origin = viewProjectionInv*vec4(uv*2.0-1.0,-1.0,1.0);\n vec4 target = viewProjectionInv*vec4(uv*2.0-1.0,1.0,1.0);\n Ray ray; initRay(ray, origin.xyz/origin.w, normalize(target.xyz*origin.w-origin.xyz*target.w)); return ray;\n}\nbool aovSurface(Ray inputRay, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {\n Ray ray=inputRay; si.triangleIndex=-1;\n for(int layer=0;layer<32;layer++) {\n intersectScene(ray,si,false); if(!si.hit) return false;\n getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);\n if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;\n ray.o=si.position+ray.d*(EPS*0.02);\n }\n return false;\n}\n`;\nexport function aovTraceFragment(center: boolean) {\n const shader = new FragmentShader({name: center ? 'AOV center' : 'AOV accumulation',\n outputs: center ? ['id','motion'] : ['geometry','position','diffuse','specular'],\n outputTypes: center ? {id: 'uvec4'} : {}, defines: {DEPTH_QUERY_MODE: true},\n includes: [core,materials,intersect,random],\n uniforms: {viewProjectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float',0), cameraFocusDistance: Shader.uniform('float',10),\n viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),\n previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),\n previousGeometry: Shader.uniform('sampler2D'), previousPosition: Shader.uniform('sampler2D'),\n previousDiffuse: Shader.uniform('sampler2D'), previousSpecular: Shader.uniform('sampler2D'),\n openPbrEnergyLut: Shader.uniform('sampler2D'), aovMask: Shader.uniform('int',0),\n aovSample: Shader.uniform('int',0)},\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n${cameraRay}\n${center ? '' : sampling+bsdf+reflectance}\n${surface}\nvoid main() {\n ${center ? /* glsl */ `\n out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);\n Ray ray=aovRay((floor(gl_FragCoord.xy)+0.5)/viewportSize);\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n int offset=52+si.instanceIndex*24;\n out_id=uvec4(aovWord(offset),aovWord(offset+1),aovWord(int(aovWord(16))+si.materialIndex),aovWord(int(aovWord(17))+si.triangleIndex));\n out_motion.z=dot(si.position-aovVector(36),aovVector(40));\n if(aovWord(offset+2)==0u)return;\n vec4 oldWorld=aovMatrix(offset+4)*vec4(si.position,1.0);\n vec4 oldClip=aovMatrix(0)*oldWorld;\n if(oldClip.w<=0.0)return;\n vec3 oldNdc=oldClip.xyz/oldClip.w;vec2 oldPixel=(oldNdc.xy*0.5+0.5)*viewportSize;\n if(any(lessThan(oldPixel,vec2(0.0)))||any(greaterThanEqual(oldPixel,viewportSize))||abs(oldNdc.z)>1.0)return;\n uvec4 identity=texelFetch(previousId,ivec2(oldPixel),0);float oldDepth=texelFetch(previousMotion,ivec2(oldPixel),0).z;\n if(any(notEqual(identity.xy,out_id.xy))||abs(oldDepth-dot(oldWorld.xyz-aovVector(44),aovVector(48)))>max(1e-4,abs(oldDepth)*1e-3))return;\n out_motion=vec4((oldPixel-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);\n ` : /* glsl */ `\n ivec2 coord=ivec2(gl_FragCoord.xy);\n out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);\n out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);\n out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);\n out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);\n initRandom(); samplingPixel=uvec2(floor(gl_FragCoord.xy));\n rng_initialize(floor(gl_FragCoord.xy),int(pixelSampleIndex ^ sampleHash(uint(sequenceSeed))));\n Ray ray=aovRay((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);\n if(cameraApertureRadius>0.0) {\n vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);\n vec3 focusPoint=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));\n vec2 lens=cameraApertureRadius*sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin=(viewInv*vec4(lens,0.0,1.0)).xyz;\n initRay(ray,origin,normalize(focusPoint-origin));\n }\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);\n bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;\n out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);\n #ifdef AOV_REFLECTANCE\n if((aovMask&24)!=0 && !unsupported){\n vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),faceCosine=-dot(face,ray.d);\n if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){\n if(cosine<0.0){normal=-normal;cosine=-cosine;}if(faceCosine<0.0){face=-face;faceCosine=-faceCosine;}\n }\n if(faceCosine>=0.0&&cosine<0.0){normal=face;cosine=faceCosine;}\n if(cosine<0.0)normal=-normal;\n material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;\n vec3 tangent=vec3(0.0);\n#ifdef USE_TANGENT\n tangent=si.tangent;\n#endif\n OpenPbrPreparedBsdf prepared=openpbr_prepare(tangent,material,-ray.d,normal);\n vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);\n out_diffuse+=vec4(diffuse,1.0);out_specular+=vec4(specular,1.0);\n }\n #endif\n out_position+=vec4(si.position,1.0);\n `}\n}\n`});\n shader.parallelCompile = true;\n return shader;\n}\n"]}
1
+ {"version":3,"file":"aovTrace.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/aovTrace.frag.ts"],"names":[],"mappings":"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","sourcesContent":["import bsdf from './chunks/openPbrBsdf.glsl.js';\nimport sampling from './chunks/sampling.glsl.js';\nimport reflectance from './aovReflectance.glsl.js';\nimport {FragmentShader, Shader} from '../shader.js';\nimport common from './chunks/common.glsl.js';\nimport core from './chunks/rayTraceCore.glsl.js';\nimport materials from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport uvProjection from './chunks/uvProjection.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport cameraRay from './chunks/cameraRay.glsl.js';\nimport rand from './chunks/rand.glsl.js';\nconst surface = /* glsl */ `\nuint aovWord(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }\nvec3 aovVector(int offset){return vec3(uintBitsToFloat(aovWord(offset)),uintBitsToFloat(aovWord(offset+1)),uintBitsToFloat(aovWord(offset+2)));}\nmat4 aovMatrix(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(aovWord(offset+i*4+j)); return m; }\nRay aovRay(vec2 uv) {\n return initCameraRay(uv);\n}\nbool aovSurface(Ray inputRay, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {\n Ray ray=inputRay; si.triangleIndex=-1;\n for(int layer=0;layer<32;layer++) {\n intersectScene(ray,si,false); if(!si.hit) return false;\n getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);\n if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;\n ray.o=si.position+ray.d*(EPS*0.02);\n }\n return false;\n}\n`;\nexport function aovTraceFragment(center: boolean) {\n const shader = new FragmentShader({name: center ? 'AOV center' : 'AOV accumulation',\n outputs: center ? ['id','motion'] : ['geometry','position','diffuse','specular'],\n outputTypes: center ? {id: 'uvec4'} : {}, defines: {DEPTH_QUERY_MODE: true},\n includes: [core,materials,intersect,random],\n uniforms: {viewProjectionInv: Shader.uniform('mat4'), projectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float',0), cameraFocusDistance: Shader.uniform('float',10),\n viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),\n previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),\n previousGeometry: Shader.uniform('sampler2D'), previousPosition: Shader.uniform('sampler2D'),\n previousDiffuse: Shader.uniform('sampler2D'), previousSpecular: Shader.uniform('sampler2D'),\n openPbrEnergyLut: Shader.uniform('sampler2D'), aovMask: Shader.uniform('int',0),\n aovSample: Shader.uniform('int',0)},\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n${cameraRay}\n${center ? '' : sampling+bsdf+reflectance}\n${surface}\nvoid main() {\n ${center ? /* glsl */ `\n out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);\n Ray ray=aovRay((floor(gl_FragCoord.xy)+0.5)/viewportSize);\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n int offset=52+si.instanceIndex*24;\n out_id=uvec4(aovWord(offset),aovWord(offset+1),aovWord(int(aovWord(16))+si.materialIndex),aovWord(int(aovWord(17))+si.triangleIndex));\n out_motion.z=dot(si.position-aovVector(36),aovVector(40));\n if(aovWord(offset+2)==0u)return;\n vec4 oldWorld=aovMatrix(offset+4)*vec4(si.position,1.0);\n vec4 oldClip=aovMatrix(0)*oldWorld;\n if(oldClip.w<=0.0)return;\n vec3 oldNdc=oldClip.xyz/oldClip.w;vec2 oldPixel=(oldNdc.xy*0.5+0.5)*viewportSize;\n if(any(lessThan(oldPixel,vec2(0.0)))||any(greaterThanEqual(oldPixel,viewportSize))||abs(oldNdc.z)>1.0)return;\n uvec4 identity=texelFetch(previousId,ivec2(oldPixel),0);float oldDepth=texelFetch(previousMotion,ivec2(oldPixel),0).z;\n if(any(notEqual(identity.xy,out_id.xy))||abs(oldDepth-dot(oldWorld.xyz-aovVector(44),aovVector(48)))>max(1e-4,abs(oldDepth)*1e-3))return;\n out_motion=vec4((oldPixel-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);\n ` : /* glsl */ `\n ivec2 coord=ivec2(gl_FragCoord.xy);\n out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);\n out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);\n out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);\n out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);\n initRandom(); samplingPixel=uvec2(floor(gl_FragCoord.xy));\n rng_initialize(floor(gl_FragCoord.xy),int(pixelSampleIndex ^ sampleHash(uint(sequenceSeed))));\n Ray ray=aovRay((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);\n if(cameraApertureRadius>0.0) {\n vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);\n vec3 focusPoint=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));\n vec2 lens=cameraApertureRadius*sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin=(viewInv*vec4(lens,0.0,1.0)).xyz;\n initRay(ray,origin,normalize(focusPoint-origin));\n }\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);\n bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;\n out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);\n #ifdef AOV_REFLECTANCE\n if((aovMask&24)!=0 && !unsupported){\n vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),faceCosine=-dot(face,ray.d);\n if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){\n if(cosine<0.0){normal=-normal;cosine=-cosine;}if(faceCosine<0.0){face=-face;faceCosine=-faceCosine;}\n }\n if(faceCosine>=0.0&&cosine<0.0){normal=face;cosine=faceCosine;}\n if(cosine<0.0)normal=-normal;\n material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;\n vec3 tangent=vec3(0.0);\n#ifdef USE_TANGENT\n tangent=si.tangent;\n#endif\n OpenPbrPreparedBsdf prepared=openpbr_prepare(tangent,material,-ray.d,normal);\n vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);\n if((aovMask&8)!=0)out_diffuse+=vec4(diffuse,1.0);\n if((aovMask&16)!=0)out_specular+=vec4(specular,1.0);\n }\n #endif\n // Resolved texture colors (diffuseColor/specularColor), matching WGSL.\n if((aovMask&384)!=0 && material.materialType==STANDARD && material.alpha>=1.0 && material.transmissionWeight<=0.0 && dot(material.mediumScattering,material.mediumScattering)<=0.0){\n float metal=clamp(material.baseMetalness,0.0,1.0);\n vec3 base=material.baseWeight*material.baseColor;\n vec3 layer=mix(vec3(1.0),material.coatColor,clamp(material.coatWeight,0.0,1.0));\n float f=(material.specularIor-1.0)/(material.specularIor+1.0);\n if((aovMask&128)!=0)out_diffuse+=vec4(layer*base*(1.0-metal),1.0);\n if((aovMask&256)!=0)out_specular+=vec4(layer*(metal*base+(1.0-metal)*material.specularWeight*material.specularColor*f*f),1.0);\n }\n out_position+=vec4(si.position,1.0);\n `}\n}\n`});\n shader.parallelCompile = true;\n return shader;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\nRay initCameraRay(vec2 coord) {\n vec4 origin = projectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 center = projectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n vec3 direction = center.xyz * origin.w - origin.xyz * center.w;\n Ray cam;\n initRay(cam, (viewInv * vec4(origin.xyz / origin.w, 1.0)).xyz,\n normalize((viewInv * vec4(direction, 0.0)).xyz));\n return cam;\n}\n";
2
+ export default _default;
@@ -0,0 +1,16 @@
1
+ // Portions adapted from ray-tracing-renderer@0.10.15
2
+ // (https://github.com/hoverinc/ray-tracing-renderer).
3
+ // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
+ // Keep unprojection in camera space to avoid cancellation from world translation.
5
+ export default /* glsl */ `
6
+ Ray cV(vec2 coord) {
7
+ vec4 origin = projectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);
8
+ vec4 center = projectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);
9
+ vec3 direction = center.xyz * origin.w - origin.xyz * center.w;
10
+ Ray cam;
11
+ initRay(cam, (viewInv * vec4(origin.xyz / origin.w, 1.0)).xyz,
12
+ normalize((viewInv * vec4(direction, 0.0)).xyz));
13
+ return cam;
14
+ }
15
+ `;
16
+ //# sourceMappingURL=cameraProjection.glsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraProjection.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/cameraProjection.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,kFAAkF;AAClF,eAAe,UAAU,CAAC;;;;;;;;;;CAUzB,CAAC","sourcesContent":["// 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\n// Keep unprojection in camera space to avoid cancellation from world translation.\nexport default /* glsl */ `\nRay initCameraRay(vec2 coord) {\n vec4 origin = projectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 center = projectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n vec3 direction = center.xyz * origin.w - origin.xyz * center.w;\n Ray cam;\n initRay(cam, (viewInv * vec4(origin.xyz / origin.w, 1.0)).xyz,\n normalize((viewInv * vec4(direction, 0.0)).xyz));\n return cam;\n}\n`;\n"]}
@@ -1,2 +1,2 @@
1
- declare const _default: "\nRay initCameraRay(vec2 coord) {\n vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n Ray cam;\n initRay(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));\n\n return cam;\n}\n\nvec2 sampleCircle(vec2 p) {\n p = 2.0 * p - 1.0;\n bool greater = abs(p.x) > abs(p.y);\n float r = greater ? p.x : p.y;\n float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);\n return r * vec2(cos(theta), sin(theta));\n}\n\nRay primaryCameraRay() {\n Ray cam = initCameraRay(v_Texcoord + pixelJitter());\n if (cameraApertureRadius > 0.0) {\n // Thin lens: the focus plane is perpendicular to the view direction.\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n vec3 focusPoint = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));\n vec2 lensPoint = cameraApertureRadius * sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin = vec3(viewInv * vec4(lensPoint, 0.0, 1.0));\n initRay(cam, origin, normalize(focusPoint - origin));\n }\n return cam;\n}\n";
1
+ declare const _default: string;
2
2
  export default _default;
@@ -1,18 +1,11 @@
1
1
  // Portions adapted from ray-tracing-renderer@0.10.15
2
2
  // (https://github.com/hoverinc/ray-tracing-renderer).
3
3
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
+ import cameraProjection from './cameraProjection.glsl.js';
4
5
  // Shared primary-ray construction keeps beauty and catcher coverage aligned.
5
6
  export default /* glsl */ `
6
- Ray fj(vec2 coord) {
7
- vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);
8
- vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);
9
- Ray cam;
10
- gC(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
11
-
12
- return cam;
13
- }
14
-
15
- vec2 kN(vec2 p) {
7
+ ${cameraProjection}
8
+ vec2 kX(vec2 p) {
16
9
  p = 2.0 * p - 1.0;
17
10
  bool greater = abs(p.x) > abs(p.y);
18
11
  float r = greater ? p.x : p.y;
@@ -20,16 +13,16 @@ float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);
20
13
  return r * vec2(cos(theta), sin(theta));
21
14
  }
22
15
 
23
- Ray oG() {
24
- Ray cam = fj(v_Texcoord + tg());
16
+ Ray pq() {
17
+ Ray cam = cV(v_Texcoord + uH());
25
18
  if (cameraApertureRadius > 0.0) {
26
19
 
27
20
  vec3 eye = viewInv[3].xyz;
28
21
  vec3 forward = -normalize(viewInv[2].xyz);
29
- vec3 jN = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));
30
- vec2 sK = cameraApertureRadius * kN(dZ(CAMERA_LENS));
31
- vec3 origin = vec3(viewInv * vec4(sK, 0.0, 1.0));
32
- gC(cam, origin, normalize(jN - origin));
22
+ vec3 jY = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));
23
+ vec2 uh = cameraApertureRadius * kX(sample2D(CAMERA_LENS));
24
+ vec3 origin = vec3(viewInv * vec4(uh, 0.0, 1.0));
25
+ initRay(cam, origin, normalize(jY - origin));
33
26
  }
34
27
  return cam;
35
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cameraRay.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/cameraRay.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,6EAA6E;AAC7E,eAAe,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BzB,CAAC","sourcesContent":["// 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\n// Shared primary-ray construction keeps beauty and catcher coverage aligned.\nexport default /* glsl */ `\nRay initCameraRay(vec2 coord) {\n vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n Ray cam;\n initRay(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));\n\n return cam;\n}\n\nvec2 sampleCircle(vec2 p) {\n p = 2.0 * p - 1.0;\n bool greater = abs(p.x) > abs(p.y);\n float r = greater ? p.x : p.y;\n float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);\n return r * vec2(cos(theta), sin(theta));\n}\n\nRay primaryCameraRay() {\n Ray cam = initCameraRay(v_Texcoord + pixelJitter());\n if (cameraApertureRadius > 0.0) {\n // Thin lens: the focus plane is perpendicular to the view direction.\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n vec3 focusPoint = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));\n vec2 lensPoint = cameraApertureRadius * sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin = vec3(viewInv * vec4(lensPoint, 0.0, 1.0));\n initRay(cam, origin, normalize(focusPoint - origin));\n }\n return cam;\n}\n`;\n"]}
1
+ {"version":3,"file":"cameraRay.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/cameraRay.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAE1D,6EAA6E;AAC7E,eAAe,UAAU,CAAC;EACxB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;CAsBjB,CAAC","sourcesContent":["// 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 cameraProjection from './cameraProjection.glsl.js';\n\n// Shared primary-ray construction keeps beauty and catcher coverage aligned.\nexport default /* glsl */ `\n${cameraProjection}\nvec2 sampleCircle(vec2 p) {\n p = 2.0 * p - 1.0;\n bool greater = abs(p.x) > abs(p.y);\n float r = greater ? p.x : p.y;\n float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);\n return r * vec2(cos(theta), sin(theta));\n}\n\nRay primaryCameraRay() {\n Ray cam = initCameraRay(v_Texcoord + pixelJitter());\n if (cameraApertureRadius > 0.0) {\n // Thin lens: the focus plane is perpendicular to the view direction.\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n vec3 focusPoint = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));\n vec2 lensPoint = cameraApertureRadius * sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin = vec3(viewInv * vec4(lensPoint, 0.0, 1.0));\n initRay(cam, origin, normalize(focusPoint - origin));\n }\n return cam;\n}\n`;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\nvec4 emissiveTexel(int i) { return fetchData(emissiveLightData,i,emissiveLightColumns); }\nvoid sampleEmissiveSceneLight(vec3 x, vec3 rnd, inout LightSampleRec ls) {\n ls.pdf=0.0;ls.isDelta=false;ls.sourceType=0;ls.sourceIndex=-1;\n if(emissiveChoiceCount<=0) return;\n float scaled=rnd.z*float(emissiveChoiceCount);int column=min(int(scaled),emissiveChoiceCount-1);\n vec4 first=emissiveTexel(emissiveChoiceOffset+column);\n int chosen=fract(scaled)<first.x?column:floatBitsToInt(first.y);\n vec4 choice=emissiveTexel(emissiveChoiceOffset+chosen);int kind=floatBitsToInt(choice.z),index=floatBitsToInt(choice.w);\n float pmf=emissiveTexel(emissivePmfOffset+chosen).x;\n if(kind==1) {\n#ifdef USE_ENVMAP\n sampleEnvLight(rnd.xy,ls);ls.pdf*=pmf;\n#endif\n } else if(kind==2) {\n#ifdef NUM_LIGHTS\n Light light=fetchLight(index);\n \n ls.sourceType=2;ls.sourceIndex=index;\n sampleAnalyticLight(light,x,rnd.xy,ls);ls.pdf*=pmf;\n#endif\n } else if(kind==3) {\n vec4 a=emissiveTexel(index*6),b=emissiveTexel(index*6+1),c=emissiveTexel(index*6+2);\n vec4 d=emissiveTexel(index*6+3),e=emissiveTexel(index*6+4),f=emissiveTexel(index*6+5);\n float u=sqrt(rnd.x);vec3 bary=vec3(1.0-u,u*(1.0-rnd.y),u*rnd.y);\n vec3 p=a.xyz*bary.x+b.xyz*bary.y+c.xyz*bary.z;\n ls.normal=normalize(cross(b.xyz-a.xyz,c.xyz-a.xyz));ls.direction=normalize(p-x);ls.dist=distance(x,p);\n float cosine=dot(ls.normal,-ls.direction);if(cosine<=0.0) return;\n OpenPbrResolvedMaterial m;\n getMaterial(m,int(c.w),bary.x*d.xy+bary.y*d.zw+bary.z*e.xy,bary.x*e.zw+bary.y*f.xy+bary.z*f.zw,0,vec3(1.0));\n ls.emission=m.emission;ls.pdf=pmf*ls.dist*ls.dist/max(b.w*cosine,1e-8);ls.sourceType=1;ls.sourceIndex=index;\n }\n}\n";
2
+ export default _default;
@@ -0,0 +1,35 @@
1
+ export default /* glsl */ `
2
+ vec4 ep(int i) { return fetchData(emissiveLightData,i,emissiveLightColumns); }
3
+ void pc(vec3 x, vec3 rnd, inout LightSampleRec ls) {
4
+ ls.pdf=0.0;ls.isDelta=false;ls.sourceType=0;ls.sourceIndex=-1;
5
+ if(emissiveChoiceCount<=0) return;
6
+ float scaled=rnd.z*float(emissiveChoiceCount);int column=min(int(scaled),emissiveChoiceCount-1);
7
+ vec4 first=ep(emissiveChoiceOffset+column);
8
+ int chosen=fract(scaled)<first.x?column:floatBitsToInt(first.y);
9
+ vec4 choice=ep(emissiveChoiceOffset+chosen);int kind=floatBitsToInt(choice.z),index=floatBitsToInt(choice.w);
10
+ float pmf=ep(emissivePmfOffset+chosen).x;
11
+ if(kind==1) {
12
+ #ifdef USE_ENVMAP
13
+ iM(rnd.xy,ls);ls.pdf*=pmf;
14
+ #endif
15
+ } else if(kind==2) {
16
+ #ifdef NUM_LIGHTS
17
+ Light light=fetchLight(index);
18
+
19
+ ls.sourceType=2;ls.sourceIndex=index;
20
+ sampleAnalyticLight(light,x,rnd.xy,ls);ls.pdf*=pmf;
21
+ #endif
22
+ } else if(kind==3) {
23
+ vec4 a=ep(index*6),b=ep(index*6+1),c=ep(index*6+2);
24
+ vec4 d=ep(index*6+3),e=ep(index*6+4),f=ep(index*6+5);
25
+ float u=sqrt(rnd.x);vec3 bary=vec3(1.0-u,u*(1.0-rnd.y),u*rnd.y);
26
+ vec3 p=a.xyz*bary.x+b.xyz*bary.y+c.xyz*bary.z;
27
+ ls.normal=normalize(cross(b.xyz-a.xyz,c.xyz-a.xyz));ls.direction=normalize(p-x);ls.dist=distance(x,p);
28
+ float cosine=dot(ls.normal,-ls.direction);if(cosine<=0.0) return;
29
+ OpenPbrResolvedMaterial m;
30
+ getMaterial(m,int(c.w),bary.x*d.xy+bary.y*d.zw+bary.z*e.xy,bary.x*e.zw+bary.y*f.xy+bary.z*f.zw,0,vec3(1.0));
31
+ ls.emission=m.emission;ls.pdf=pmf*ls.dist*ls.dist/max(b.w*cosine,1e-8);ls.sourceType=1;ls.sourceIndex=index;
32
+ }
33
+ }
34
+ `;
35
+ //# sourceMappingURL=emissiveLight.glsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emissiveLight.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/emissiveLight.glsl.ts"],"names":[],"mappings":"AAAA,eAAe,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCzB,CAAC","sourcesContent":["export default /* glsl */ `\nvec4 emissiveTexel(int i) { return fetchData(emissiveLightData,i,emissiveLightColumns); }\nvoid sampleEmissiveSceneLight(vec3 x, vec3 rnd, inout LightSampleRec ls) {\n ls.pdf=0.0;ls.isDelta=false;ls.sourceType=0;ls.sourceIndex=-1;\n if(emissiveChoiceCount<=0) return;\n float scaled=rnd.z*float(emissiveChoiceCount);int column=min(int(scaled),emissiveChoiceCount-1);\n vec4 first=emissiveTexel(emissiveChoiceOffset+column);\n int chosen=fract(scaled)<first.x?column:floatBitsToInt(first.y);\n vec4 choice=emissiveTexel(emissiveChoiceOffset+chosen);int kind=floatBitsToInt(choice.z),index=floatBitsToInt(choice.w);\n float pmf=emissiveTexel(emissivePmfOffset+chosen).x;\n if(kind==1) {\n#ifdef USE_ENVMAP\n sampleEnvLight(rnd.xy,ls);ls.pdf*=pmf;\n#endif\n } else if(kind==2) {\n#ifdef NUM_LIGHTS\n Light light=fetchLight(index);\n \n ls.sourceType=2;ls.sourceIndex=index;\n sampleAnalyticLight(light,x,rnd.xy,ls);ls.pdf*=pmf;\n#endif\n } else if(kind==3) {\n vec4 a=emissiveTexel(index*6),b=emissiveTexel(index*6+1),c=emissiveTexel(index*6+2);\n vec4 d=emissiveTexel(index*6+3),e=emissiveTexel(index*6+4),f=emissiveTexel(index*6+5);\n float u=sqrt(rnd.x);vec3 bary=vec3(1.0-u,u*(1.0-rnd.y),u*rnd.y);\n vec3 p=a.xyz*bary.x+b.xyz*bary.y+c.xyz*bary.z;\n ls.normal=normalize(cross(b.xyz-a.xyz,c.xyz-a.xyz));ls.direction=normalize(p-x);ls.dist=distance(x,p);\n float cosine=dot(ls.normal,-ls.direction);if(cosine<=0.0) return;\n OpenPbrResolvedMaterial m;\n getMaterial(m,int(c.w),bary.x*d.xy+bary.y*d.zw+bary.z*e.xy,bary.x*e.zw+bary.y*f.xy+bary.z*f.zw,0,vec3(1.0));\n ls.emission=m.emission;ls.pdf=pmf*ls.dist*ls.dist/max(b.w*cosine,1e-8);ls.sourceType=1;ls.sourceIndex=index;\n }\n}\n`;\n"]}