@meimu/mutracer 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rayTraceCore.wgsl.js","sourceRoot":"","sources":["../../../../src/renderer/wgsl/chunks/rayTraceCore.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,6BAA6B,EAAE,yBAAyB,EAAC,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,uBAAuB,GAAG,IAAI,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,IAAI,EACpB,QAAQ,GAAG,KAAK,EAChB,iBAAiB,GAAG,6BAA6B,EAOlD;IACC,OAAO,QAAQ,CAAC;;;;;;gBAMF,aAAa;yBACJ,qBAAqB;;qBAEzB,mBAAmB;uBACjB,qBAAqB;4BAChB,0BAA0B;qBACjC,mBAAmB;iCACP,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC;+BACnE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;+BAC/D,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;sCACxD,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,KAAK,CAAC;mCACzE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;EAe/F,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;CAE7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;EAQJ,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCU,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;2BAEpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;EAIrC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;CAChB,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;EACf,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;;CAI7B,CAAC,CAAC,CAAC,EAAE;;;;;;EAMF,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;yBAuBf,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;2BAMpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DhC,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8DAmDwC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE9H,CAAC;AACF,CAAC","sourcesContent":["import { materialBufferWgsl } from '../../materialLayoutSchema.js';\nimport {ALL_LIGHT_SHADER_CAPABILITIES, LIGHT_SHADER_CAPABILITIES} from '../../shaderCapabilities.js';\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n CONSTANT_SPOT_LIGHT\n} from '../../lightConstants.js';\n\nexport default function rayTraceCore({\n hasAnisotropyDirections = true,\n hasCoatNormals = false,\n hasSceneAlpha = true,\n caustics = false,\n lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES\n}: {\n hasAnisotropyDirections?: boolean;\n hasCoatNormals?: boolean;\n hasSceneAlpha?: boolean;\n caustics?: boolean;\n lightCapabilities?: number;\n}) {\n return /*wgsl*/ `\n// https://www.w3.org/WAI/GL/wiki/Relative_luminance\nconst luminance = vec3f(0.2126, 0.7152, 0.0722);\nconst RAY_MAX_DISTANCE = 9999.0;\n\nconst STANDARD = 0;\nconst UNLIT = ${UnlitMaterial};\nconst SHADOW_CATCHER = ${ShadowCatcherMaterial};\n\nconst RECT_LIGHT = ${CONSTANT_RECT_LIGHT};\nconst SPHERE_LIGHT = ${CONSTANT_SPHERE_LIGHT};\nconst DIRECTIONAL_LIGHT = ${CONSTANT_DIRECTIONAL_LIGHT};\nconst SPOT_LIGHT = ${CONSTANT_SPOT_LIGHT};\nconst HAS_SCENE_SPHERE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SphereLight) !== 0};\nconst HAS_SCENE_RECT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.RectLight) !== 0};\nconst HAS_SCENE_SPOT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SpotLight) !== 0};\nconst HAS_SCENE_DIRECTIONAL_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.DirectionalLight) !== 0};\nconst HAS_SCENE_EMISSIVE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.emissive) !== 0};\n\nstruct Ray {\n o: vec3f,\n d: vec3f,\n};\n\nstruct SurfaceInteraction {\n position: vec3f,\n // For perfect specular or transmission surface\n // We use the albedo and normal of first diffuse or glossy surface hit instead for denoising\n // See albedo section in https://www.openimagedenoise.org/documentation.html\n albedoSampled: bool,\n\n normal: vec3f, // material shading normal\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f, // independent, built before base normal mapping\n` : ''}\n vertexNormal: vec3f, // interpolated mesh normal before normal mapping\n shadowOffset: vec3f, // smooth-surface offset for direct-light shadow rays\n\n faceNormal: vec3f, // normal of the triangle\n hit: bool,\n\n tangent: vec3f,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n uv: vec2f,\n uv1: vec2f,\n vertexColor: vec3f,\n\n triangleIndex: i32,\n instanceIndex: i32,\n materialIndex: i32,\n barycentrics: vec2f,\n\n wavelength: f32,\n // RGB channel a spectral path carries, 1 to 3. Zero keeps full RGB.\n spectralChannel: i32,\n\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n};\n\n// Texture-resolved OpenPBR inputs used by the surface integrator. The storage\n// buffer keeps its compact legacy layout; getMaterial() is the compatibility\n// boundary that maps it to these canonical names.\nstruct OpenPbrResolvedMaterial {\n baseColor: vec3f,\n transmissionWeight: f32,\n\n emission: vec3f,\n specularAnisotropy: f32,\n\n baseMetalness: f32,\n specularIor: f32,\n specularRoughness: f32,${caustics ? /* wgsl */ `\n causticRoughness: f32,\n causticNormalMapped: bool,` : ''}\n\n transmissionDispersionScale: f32,\n dispersionAbbeNumber: f32,\n thinFilmThickness: f32,\n thinFilmIor: f32,\n thinFilmWeight: f32,\n\n // Medium\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n baseWeight: f32,\n diffuseRoughness: f32,\n specularWeight: f32,\n specularColor: vec3f,\n subsurfaceWeight: f32,\n subsurfaceColor: vec3f,\n transmissionColor: vec3f,\n fuzzWeight: f32,\n fuzzColor: vec3f,\n fuzzRoughness: f32,\n coatWeight: f32,\n coatColor: vec3f,\n coatRoughness: f32,\n coatAnisotropy: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n anisotropyDirection: vec2f,\n anisotropyDirectionEnabled: bool,\n coatAnisotropyRotation: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n` : /* wgsl */ ``}\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f,\n coatNormalEnabled: bool,\n geometricNormal: vec3f, // face normal oriented toward the view\n` : ''}\n coatIor: f32,\n coatDarkening: f32,\n\n // Alpha\n alpha: f32,\n ${hasSceneAlpha ? 'alphaMode: i32,' : ''}\n\n materialType: i32,\n\n bevel: f32,\n\n relativeIor: f32,\n inside: bool,\n\n alphaX: f32,\n alphaY: f32,\n thinWalled: bool,\n};\n\nstruct Path {\n ray: Ray,\n li: vec3f,\n alpha: f32,\n beta: vec3f,\n fromEye: bool,\n abort: bool,\n scatteringPdf: f32,\n scatteringIsDelta: bool,\n isNextRefraction: bool,${caustics ? /* wgsl */ `\n causticK: u32,\n causticSingleT: bool,\n causticReceiverPrimary: bool,\n causticHasReceiver: bool,\n causticPhotonReceiver:bool,\n causticMneeReceiver: bool,` : ''}\n};\n\nstruct LightSampleRec {\n normal: vec3f,\n emission: vec3f,\n direction: vec3f,\n dist: f32,\n pdf: f32,\n // Discrete probability of selecting this light before sampling its\n // conditional point/direction. Light RIS excludes this term from the target\n // and carries it in the unbiased contribution weight instead.\n selectionPmf: f32,\n isDelta: bool,\n // Light source type: environment=0, emissive triangle=1, analytic=2.\n sourceType: u32,\n sourceIndex: u32,\n};\n\nstruct Light {\n position: vec3f,\n litType: f32,\n\n emission: vec3f,\n area: f32,\n\n u: vec3f,\n // Radius for sphere light, spread for rect light\n radiusOrSpread: f32,\n\n v: vec3f,\n textureIndex: f32,\n\n selectionPmf: f32,\n _samplingPadding0: f32,\n _samplingPadding1: f32,\n _samplingPadding2: f32,\n iesReference: vec3f,\n _iesPadding: f32,\n};\n\nstruct EmissiveTriangle {\n p0: vec3f,\n selectionPmf: f32,\n p1: vec3f,\n area: f32,\n p2: vec3f,\n materialIndex: f32,\n uv0: vec2f,\n uv1: vec2f,\n uv2: vec2f,\n secondaryUv0: vec2f,\n secondaryUv1: vec2f,\n secondaryUv2: vec2f,\n};\n\nstruct LightChoice {\n probability: f32,\n aliasIndex: i32,\n sourceType: i32,\n sourceIndex: i32,\n};\n\n${materialBufferWgsl()}\n\nstruct CameraUniform {\n viewProjectionInv: mat4x4<f32>,\n viewInv: mat4x4<f32>,\n apertureRadius: f32,\n focusDistance: f32,\n};\n\nstruct RayTraceUniform {\n outputSize: vec2f,\n sampleCount: f32,\n scaleOffset: vec4f,\n lightsCount: i32,\n transmissiveOutputAlphaMin: f32,\n jitter: vec2f,\n backgroundColor: vec4f,\n groundedBackgroundParams: vec4f,\n groundedBackgroundCenter: vec2f,\n blasOffset: i32,\n isEmpty: i32,\n bevel: i32,\n dispersionWavelengths: i32,\n envLightPmf: f32,\n lightChoiceCount: i32,\n lightWeightTotal: f32,\n lightSamplingTextureWidth: i32,\n lightChoiceTexelOffset: i32,\n bounces: i32,\n varianceMoments: i32,\n adaptiveSampling: i32,\n clamping: f32,\n directLightCandidates: i32,\n backgroundFlags: i32,\n // Fixed at 4: runtime trip bounds discourage thin-film loop unrolling.\n loopUnrollGuard: u32,\n sceneFeatureFlags: u32,\n sequenceSeed: u32,\n zSobolLogSPP: u32,\n sampleSequenceOffset: u32,\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: i32,\n shadowCatcherChoiceCount: i32,\n environmentRotation: mat4x4f,\n backgroundMapTransform: vec4f,\n backgroundMapRotation: mat4x4f,\n}\n\n// Buffers\n@group(0) @binding(0) var<storage, read> bvhBuffer: array<vec4f>;\n@group(0) @binding(1) var<storage, read> instancesBuffer: array<vec4f>;\n@group(0) @binding(2) var<storage, read> attrBuffers: array<${hasAnisotropyDirections ? /* wgsl */ `vec4f` : /* wgsl */ `vec3f`}>;\n@group(0) @binding(3) var<storage, read> materialsBuffer: array<MaterialBuffer>;\n\n// Textures\n@group(1) @binding(0) var mapSampler: sampler;\n@group(1) @binding(1) var map: texture_2d_array<f32>;\n// The first NUM_MAPS entries contain atlas placement; the second half stores\n// per-texture UV scale/offset; the third block stores the UV channel in x.\n@group(1) @binding(3) var<uniform> mapInfo: array<vec4f, NUM_MAPS * 3>;\n@group(1) @binding(4) var envMap: texture_2d<f32>;\n@group(1) @binding(5) var envMapDistribution: texture_2d<f32>;\n@group(1) @binding(6) var backgroundMap: texture_2d<f32>;\n@group(1) @binding(8) var lightSamplingData: texture_2d<f32>;\n@group(1) @binding(9) var openPbrEnergyLut: texture_2d<f32>;\n@group(1) @binding(10) var adaptiveSampleTargets: texture_2d<f32>;\n\nfn iesProfileScalar(baseTexel: i32, scalarIndex: i32) -> f32 {\n let texelIndex = baseTexel + scalarIndex / 4;\n let width = rtUniform.lightSamplingTextureWidth;\n let packed = textureLoad(lightSamplingData, vec2i(texelIndex % width, texelIndex / width), 0);\n return packed[scalarIndex % 4];\n}\n\nfn sampleIESProfile(baseTexel: i32, uv: vec2f) -> f32 {\n if (baseTexel < 0) { return 1.0; }\n let pixel = fract(uv) * 128.0 - vec2f(0.5);\n let x0 = i32(floor(pixel.x));\n let y0 = i32(floor(pixel.y));\n let fx = fract(pixel.x);\n let fy = fract(pixel.y);\n let xa = select(x0, 127, x0 < 0);\n let xb = select(x0 + 1, 0, x0 >= 127);\n let ya = select(y0, 127, y0 < 0);\n let yb = select(y0 + 1, 0, y0 >= 127);\n let a = iesProfileScalar(baseTexel, ya * 128 + xa);\n let b = iesProfileScalar(baseTexel, ya * 128 + xb);\n let c = iesProfileScalar(baseTexel, yb * 128 + xa);\n let d = iesProfileScalar(baseTexel, yb * 128 + xb);\n return mix(mix(a, b, fx), mix(c, d, fx), fy);\n}\n\nfn evaluateSpotEmissionMultiplier(light: Light, lightToSurface: vec3f) -> f32 {\n let axis = normalize(light.u);\n let cosTheta = dot(axis, lightToSurface);\n var cone = select(0.0, 1.0, cosTheta >= light.v.x);\n if (light.v.y > light.v.x + 1e-6) {\n cone = smoothstep(light.v.x, light.v.y, cosTheta);\n }\n if (cone <= 0.0 || light.textureIndex < 0.0) { return cone; }\n let xAxis = light.iesReference;\n let yAxis = cross(axis, xAxis);\n let vertical = acos(clamp(cosTheta, -1.0, 1.0));\n let horizontal = atan2(dot(lightToSurface, yAxis), dot(lightToSurface, xAxis));\n return cone * sampleIESProfile(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));\n}\n\n\n \n// Uniforms\n@group(2) @binding(0) var<uniform> cameraUniform: CameraUniform;\n@group(2) @binding(1) var<uniform> rtUniform: RayTraceUniform;\n\n@group(2) @binding(2) var<uniform> analyticLights: array<Light, NUM_UNIFORM_LIGHTS>;\n// TODO uniform must be aligned to 16 bytes.\n\nfn initRay(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {\n (*ray).o = origin;\n (*ray).d = direction;\n}\n`;\n}\n"]}
1
+ {"version":3,"file":"rayTraceCore.wgsl.js","sourceRoot":"","sources":["../../../../src/renderer/wgsl/chunks/rayTraceCore.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,6BAA6B,EAAE,yBAAyB,EAAC,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC;AACnC,+EAA+E;AAC/E,mBAAmB,GAAG,KAAK,EAC3B,eAAe,GAAG,KAAK,EACvB,uBAAuB,GAAG,IAAI,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,IAAI,EACpB,uBAAuB,GAAG,KAAK,EAC/B,QAAQ,GAAG,KAAK,EAChB,iBAAiB,GAAG,6BAA6B,EAUlD;IACC,OAAO,QAAQ,CAAC;;;;;;gBAMF,aAAa;yBACJ,qBAAqB;;qBAEzB,mBAAmB;uBACjB,qBAAqB;4BAChB,0BAA0B;qBACjC,mBAAmB;iCACP,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC;+BACnE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;+BAC/D,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;sCACxD,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,KAAK,CAAC;mCACzE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;EAe/F,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;CAE7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;EAQJ,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCU,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;2BAEpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;EAIrC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;CAChB,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;EACf,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;;CAI7B,CAAC,CAAC,CAAC,EAAE;;;;;;EAMF,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;yBAyBf,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;2BAMpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DhC,kBAAkB,EAAE;;;;;;qBAMC,uBAAuB,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8DA6CzB,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;EACjI,sBAAsB,CAAC,eAAe,EAAE,uBAAuB,CAAC;;;;;iCAKjC,mBAAmB,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,uBAAuB;;;4BAGrF,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6D5E,CAAC;AACF,CAAC","sourcesContent":["import {vertexAttributeReaders} from './vertexAttributes.wgsl.js';\nimport { materialBufferWgsl } from '../../materialLayoutSchema.js';\nimport {ALL_LIGHT_SHADER_CAPABILITIES, LIGHT_SHADER_CAPABILITIES} from '../../shaderCapabilities.js';\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n CONSTANT_SPOT_LIGHT\n} from '../../lightConstants.js';\n\nexport default function rayTraceCore({\n // Independent mapInfo starts with image width, height and binding-array index.\n independentTextures = false,\n compactVertices = false,\n hasAnisotropyDirections = true,\n hasCoatNormals = false,\n hasSceneAlpha = true,\n cameraProjectionInverse = false,\n caustics = false,\n lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES\n}: {\n independentTextures?: boolean;\n compactVertices?: boolean;\n hasAnisotropyDirections?: boolean;\n hasCoatNormals?: boolean;\n hasSceneAlpha?: boolean;\n cameraProjectionInverse?: boolean;\n caustics?: boolean;\n lightCapabilities?: number;\n}) {\n return /*wgsl*/ `\n// https://www.w3.org/WAI/GL/wiki/Relative_luminance\nconst luminance = vec3f(0.2126, 0.7152, 0.0722);\nconst RAY_MAX_DISTANCE = 9999.0;\n\nconst STANDARD = 0;\nconst UNLIT = ${UnlitMaterial};\nconst SHADOW_CATCHER = ${ShadowCatcherMaterial};\n\nconst RECT_LIGHT = ${CONSTANT_RECT_LIGHT};\nconst SPHERE_LIGHT = ${CONSTANT_SPHERE_LIGHT};\nconst DIRECTIONAL_LIGHT = ${CONSTANT_DIRECTIONAL_LIGHT};\nconst SPOT_LIGHT = ${CONSTANT_SPOT_LIGHT};\nconst HAS_SCENE_SPHERE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SphereLight) !== 0};\nconst HAS_SCENE_RECT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.RectLight) !== 0};\nconst HAS_SCENE_SPOT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SpotLight) !== 0};\nconst HAS_SCENE_DIRECTIONAL_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.DirectionalLight) !== 0};\nconst HAS_SCENE_EMISSIVE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.emissive) !== 0};\n\nstruct Ray {\n o: vec3f,\n d: vec3f,\n};\n\nstruct SurfaceInteraction {\n position: vec3f,\n // For perfect specular or transmission surface\n // We use the albedo and normal of first diffuse or glossy surface hit instead for denoising\n // See albedo section in https://www.openimagedenoise.org/documentation.html\n albedoSampled: bool,\n\n normal: vec3f, // material shading normal\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f, // independent, built before base normal mapping\n` : ''}\n vertexNormal: vec3f, // interpolated mesh normal before normal mapping\n shadowOffset: vec3f, // smooth-surface offset for direct-light shadow rays\n\n faceNormal: vec3f, // normal of the triangle\n hit: bool,\n\n tangent: vec3f,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n uv: vec2f,\n uv1: vec2f,\n vertexColor: vec3f,\n\n triangleIndex: i32,\n instanceIndex: i32,\n materialIndex: i32,\n barycentrics: vec2f,\n\n wavelength: f32,\n // RGB channel a spectral path carries, 1 to 3. Zero keeps full RGB.\n spectralChannel: i32,\n\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n};\n\n// Texture-resolved OpenPBR inputs used by the surface integrator. The storage\n// buffer keeps its compact legacy layout; getMaterial() is the compatibility\n// boundary that maps it to these canonical names.\nstruct OpenPbrResolvedMaterial {\n baseColor: vec3f,\n transmissionWeight: f32,\n\n emission: vec3f,\n specularAnisotropy: f32,\n\n baseMetalness: f32,\n specularIor: f32,\n specularRoughness: f32,${caustics ? /* wgsl */ `\n causticRoughness: f32,\n causticNormalMapped: bool,` : ''}\n\n transmissionDispersionScale: f32,\n dispersionAbbeNumber: f32,\n thinFilmThickness: f32,\n thinFilmIor: f32,\n thinFilmWeight: f32,\n\n // Medium\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n baseWeight: f32,\n diffuseRoughness: f32,\n specularWeight: f32,\n specularColor: vec3f,\n subsurfaceWeight: f32,\n subsurfaceColor: vec3f,\n transmissionColor: vec3f,\n fuzzWeight: f32,\n fuzzColor: vec3f,\n fuzzRoughness: f32,\n coatWeight: f32,\n coatColor: vec3f,\n coatRoughness: f32,\n coatAnisotropy: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n anisotropyDirection: vec2f,\n anisotropyDirectionEnabled: bool,\n coatAnisotropyRotation: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n` : /* wgsl */ ``}\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f,\n coatNormalEnabled: bool,\n geometricNormal: vec3f, // face normal oriented toward the view\n` : ''}\n coatIor: f32,\n coatDarkening: f32,\n\n // Alpha\n alpha: f32,\n ${hasSceneAlpha ? 'alphaMode: i32,' : ''}\n\n materialType: i32,\n\n bevel: f32,\n\n relativeIor: f32,\n inside: bool,\n\n alphaX: f32,\n alphaY: f32,\n thinWalled: bool,\n};\n\nstruct Path {\n // Sticky for this path: an SSS walk must retain its chance to reach the boundary.\n scatteringMediumEntered: bool,\n ray: Ray,\n li: vec3f,\n alpha: f32,\n beta: vec3f,\n fromEye: bool,\n abort: bool,\n scatteringPdf: f32,\n scatteringIsDelta: bool,\n isNextRefraction: bool,${caustics ? /* wgsl */ `\n causticK: u32,\n causticSingleT: bool,\n causticReceiverPrimary: bool,\n causticHasReceiver: bool,\n causticPhotonReceiver:bool,\n causticMneeReceiver: bool,` : ''}\n};\n\nstruct LightSampleRec {\n normal: vec3f,\n emission: vec3f,\n direction: vec3f,\n dist: f32,\n pdf: f32,\n // Discrete probability of selecting this light before sampling its\n // conditional point/direction. Light RIS excludes this term from the target\n // and carries it in the unbiased contribution weight instead.\n selectionPmf: f32,\n isDelta: bool,\n // Light source type: environment=0, emissive triangle=1, analytic=2.\n sourceType: u32,\n sourceIndex: u32,\n};\n\nstruct Light {\n position: vec3f,\n litType: f32,\n\n emission: vec3f,\n area: f32,\n\n u: vec3f,\n // Radius for sphere light, spread for rect light\n radiusOrSpread: f32,\n\n v: vec3f,\n textureIndex: f32,\n\n selectionPmf: f32,\n _samplingPadding0: f32,\n _samplingPadding1: f32,\n _samplingPadding2: f32,\n iesReference: vec3f,\n _iesPadding: f32,\n};\n\nstruct EmissiveTriangle {\n p0: vec3f,\n selectionPmf: f32,\n p1: vec3f,\n area: f32,\n p2: vec3f,\n materialIndex: f32,\n uv0: vec2f,\n uv1: vec2f,\n uv2: vec2f,\n secondaryUv0: vec2f,\n secondaryUv1: vec2f,\n secondaryUv2: vec2f,\n};\n\nstruct LightChoice {\n probability: f32,\n aliasIndex: i32,\n sourceType: i32,\n sourceIndex: i32,\n};\n\n${materialBufferWgsl()}\n\nstruct CameraUniform {\n viewProjectionInv: mat4x4<f32>,\n viewInv: mat4x4<f32>,\n apertureRadius: f32,\n focusDistance: f32,${cameraProjectionInverse ? '\\n projectionInv: mat4x4<f32>,' : ''}\n};\n\nstruct RayTraceUniform {\n outputSize: vec2f,\n sampleCount: f32,\n scaleOffset: vec4f,\n lightsCount: i32,\n transmissiveOutputAlphaMin: f32,\n jitter: vec2f,\n backgroundColor: vec4f,\n groundedBackgroundParams: vec4f,\n groundedBackgroundCenter: vec2f,\n blasOffset: i32,\n isEmpty: i32,\n bevel: i32,\n dispersionWavelengths: i32,\n envLightPmf: f32,\n lightChoiceCount: i32,\n lightWeightTotal: f32,\n lightSamplingTextureWidth: i32,\n lightChoiceTexelOffset: i32,\n bounces: i32,\n varianceMoments: i32,\n adaptiveSampling: i32,\n clamping: f32,\n directLightCandidates: i32,\n backgroundFlags: i32,\n // Fixed at 4: runtime trip bounds discourage thin-film loop unrolling.\n loopUnrollGuard: u32,\n sceneFeatureFlags: u32,\n sequenceSeed: u32,\n zSobolLogSPP: u32,\n sampleSequenceOffset: u32,\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: i32,\n shadowCatcherChoiceCount: i32,\n environmentRotation: mat4x4f,\n backgroundMapTransform: vec4f,\n backgroundMapRotation: mat4x4f,\n}\n\n// Buffers\n@group(0) @binding(0) var<storage, read> bvhBuffer: array<vec4f>;\n@group(0) @binding(1) var<storage, read> instancesBuffer: array<vec4f>;\n@group(0) @binding(2) var<storage, read> attrBuffers: array<${compactVertices ? 'u32' : hasAnisotropyDirections ? 'vec4f' : 'vec3f'}>;\n${vertexAttributeReaders(compactVertices, hasAnisotropyDirections)}\n@group(0) @binding(3) var<storage, read> materialsBuffer: array<MaterialBuffer>;\n\n// Textures\n@group(1) @binding(0) var mapSampler: sampler;\n@group(1) @binding(1) var map: ${independentTextures ? 'binding_array<texture_2d<f32>>' : 'texture_2d_array<f32>'};\n// The first NUM_MAPS entries contain atlas placement; the second half stores\n// per-texture UV scale/offset; the third block stores the UV channel in x.\n@group(1) @binding(3) var<${independentTextures ? 'storage, read' : 'uniform'}> mapInfo: array<vec4f, NUM_MAPS * 3>;\n@group(1) @binding(4) var envMap: texture_2d<f32>;\n@group(1) @binding(5) var envMapDistribution: texture_2d<f32>;\n@group(1) @binding(6) var backgroundMap: texture_2d<f32>;\n@group(1) @binding(8) var lightSamplingData: texture_2d<f32>;\n@group(1) @binding(9) var openPbrEnergyLut: texture_2d<f32>;\n@group(1) @binding(10) var adaptiveSampleTargets: texture_2d<f32>;\n\nfn iesProfileScalar(baseTexel: i32, scalarIndex: i32) -> f32 {\n let texelIndex = baseTexel + scalarIndex / 4;\n let width = rtUniform.lightSamplingTextureWidth;\n let packed = textureLoad(lightSamplingData, vec2i(texelIndex % width, texelIndex / width), 0);\n return packed[scalarIndex % 4];\n}\n\nfn sampleIESProfile(baseTexel: i32, uv: vec2f) -> f32 {\n if (baseTexel < 0) { return 1.0; }\n let pixel = fract(uv) * 128.0 - vec2f(0.5);\n let x0 = i32(floor(pixel.x));\n let y0 = i32(floor(pixel.y));\n let fx = fract(pixel.x);\n let fy = fract(pixel.y);\n let xa = select(x0, 127, x0 < 0);\n let xb = select(x0 + 1, 0, x0 >= 127);\n let ya = select(y0, 127, y0 < 0);\n let yb = select(y0 + 1, 0, y0 >= 127);\n let a = iesProfileScalar(baseTexel, ya * 128 + xa);\n let b = iesProfileScalar(baseTexel, ya * 128 + xb);\n let c = iesProfileScalar(baseTexel, yb * 128 + xa);\n let d = iesProfileScalar(baseTexel, yb * 128 + xb);\n return mix(mix(a, b, fx), mix(c, d, fx), fy);\n}\n\nfn evaluateSpotEmissionMultiplier(light: Light, lightToSurface: vec3f) -> f32 {\n let axis = normalize(light.u);\n let cosTheta = dot(axis, lightToSurface);\n var cone = select(0.0, 1.0, cosTheta >= light.v.x);\n if (light.v.y > light.v.x + 1e-6) {\n cone = smoothstep(light.v.x, light.v.y, cosTheta);\n }\n if (cone <= 0.0 || light.textureIndex < 0.0) { return cone; }\n let xAxis = light.iesReference;\n let yAxis = cross(axis, xAxis);\n let vertical = acos(clamp(cosTheta, -1.0, 1.0));\n let horizontal = atan2(dot(lightToSurface, yAxis), dot(lightToSurface, xAxis));\n return cone * sampleIESProfile(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));\n}\n\n\n \n// Uniforms\n@group(2) @binding(0) var<uniform> cameraUniform: CameraUniform;\n@group(2) @binding(1) var<uniform> rtUniform: RayTraceUniform;\n\n@group(2) @binding(2) var<uniform> analyticLights: array<Light, NUM_UNIFORM_LIGHTS>;\n// TODO uniform must be aligned to 16 bytes.\n\nfn initRay(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {\n (*ray).o = origin;\n (*ray).d = direction;\n}\n`;\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import { LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE, LIGHT_CHOICE_ENVIRONMENT } from '../../lightConstants.js';
2
2
  export default /*wgsl */ `
3
- fn eH(light: Light, fk: vec3f, iY: vec2f, lightSample: ptr<function, LightSampleRec>) {
4
- let iz = light.position - fk;
5
- let ao = length(iz);
3
+ fn eR(light: Light, fB: vec3f, jE: vec2f, lightSample: ptr<function, LightSampleRec>) {
4
+ let iY = light.position - fB;
5
+ let ao = length(iY);
6
6
  if (light.radiusOrSpread <= 0.0) {
7
7
 
8
8
 
@@ -16,7 +16,7 @@ if (ao <= 1e-6) {
16
16
  (*lightSample).isDelta = true;
17
17
  return;
18
18
  }
19
- (*lightSample).direction = iz / ao;
19
+ (*lightSample).direction = iY / ao;
20
20
  (*lightSample).normal = -(*lightSample).direction;
21
21
  (*lightSample).dist = ao;
22
22
  (*lightSample).pdf = 1.0;
@@ -27,21 +27,21 @@ return;
27
27
  }
28
28
  let radius = max(light.radiusOrSpread, 1e-6);
29
29
  (*lightSample).isDelta = false;
30
- var gG: vec3f;
30
+ var gY: vec3f;
31
31
 
32
32
  if (ao <= radius) {
33
- let z = 1.0 - 2.0 * iY.x;
34
- let dr = sqrt(max(0.0, 1.0 - z * z));
35
- let azimuth = TWOPI * iY.y;
36
- gG = vec3f(
37
- dr * cos(azimuth),
38
- dr * sin(azimuth),
33
+ let z = 1.0 - 2.0 * jE.x;
34
+ let dw = sqrt(max(0.0, 1.0 - z * z));
35
+ let azimuth = TWOPI * jE.y;
36
+ gY = vec3f(
37
+ dw * cos(azimuth),
38
+ dw * sin(azimuth),
39
39
  z
40
40
  );
41
41
  (*lightSample).pdf = INV4PI;
42
42
  }
43
43
  else {
44
- let uk = iz / ao;
44
+ let vU = iY / ao;
45
45
  let sinThetaMaxSquared = min(
46
46
  1.0,
47
47
  radius * radius / (ao * ao)
@@ -50,14 +50,14 @@ let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
50
50
 
51
51
 
52
52
  let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
53
- let kZ = iY.x * oneMinusCosThetaMax;
54
- let ct = 1.0 - kZ;
55
- let sinTheta = sqrt(max(0.0, kZ * (2.0 - kZ)));
56
- let azimuth = TWOPI * iY.y;
53
+ let lT = jE.x * oneMinusCosThetaMax;
54
+ let cv = 1.0 - lT;
55
+ let sinTheta = sqrt(max(0.0, lT * (2.0 - lT)));
56
+ let azimuth = TWOPI * jE.y;
57
57
  var tangent: vec3f;
58
58
  var bitangent: vec3f;
59
- sampling_orthonormal_basis(uk, &tangent, &bitangent);
60
- gG = uk * ct
59
+ sampling_orthonormal_basis(vU, &tangent, &bitangent);
60
+ gY = vU * cv
61
61
  + tangent * (sinTheta * cos(azimuth))
62
62
  + bitangent * (sinTheta * sin(azimuth));
63
63
  (*lightSample).pdf = 1.0 / max(
@@ -66,20 +66,20 @@ TWOPI * oneMinusCosThetaMax,
66
66
  );
67
67
  }
68
68
 
69
- let iA = dot(gG, iz);
70
- let qT = dot(iz, iz);
71
- let bj = iA * iA
72
- - qT + radius * radius;
73
- let cI = iA - sqrt(max(0.0, bj));
74
- let cw = iA + sqrt(max(0.0, bj));
75
- (*lightSample).dist = select(cw, cI, cI > 1e-6);
76
- (*lightSample).direction = gG;
77
- let tl = fk + gG * (*lightSample).dist;
78
- (*lightSample).normal = normalize(tl - light.position);
69
+ let iZ = dot(gY, iY);
70
+ let sj = dot(iY, iY);
71
+ let bk = iZ * iZ
72
+ - sj + radius * radius;
73
+ let cK = iZ - sqrt(max(0.0, bk));
74
+ let cB = iZ + sqrt(max(0.0, bk));
75
+ (*lightSample).dist = select(cB, cK, cK > 1e-6);
76
+ (*lightSample).direction = gY;
77
+ let uQ = fB + gY * (*lightSample).dist;
78
+ (*lightSample).normal = normalize(uQ - light.position);
79
79
  (*lightSample).emission = light.emission;
80
80
  }
81
81
 
82
- fn bC(
82
+ fn bD(
83
83
  light: Light,
84
84
  surfacePoint: vec3f,
85
85
  lowerLeft: vec3f,
@@ -90,15 +90,15 @@ return;
90
90
  }
91
91
  let width = length(light.u);
92
92
  let height = length(light.v);
93
- let dU = surfacePoint - lowerLeft;
93
+ let ea = surfacePoint - lowerLeft;
94
94
  let uv = vec2f(
95
- dot(dU, light.u / width) / width,
96
- dot(dU, light.v / height) / height
95
+ dot(ea, light.u / width) / width,
96
+ dot(ea, light.v / height) / height
97
97
  );
98
98
  (*result).emission *= sampleMap(i32(light.textureIndex), uv).rgb;
99
99
  }
100
100
 
101
- fn jZ(
101
+ fn kF(
102
102
  light: Light,
103
103
  shadingPoint: vec3f,
104
104
  samplePoint: vec2f,
@@ -109,27 +109,27 @@ let lowerLeft = light.position - 0.5 * (light.u + light.v);
109
109
  let spread = clamp(light.radiusOrSpread, 0.0, 1.0);
110
110
 
111
111
  if (spread <= 0.001) {
112
- let gg = dot(normal, shadingPoint - light.position);
113
- let surfacePoint = shadingPoint - normal * gg;
114
- let dU = surfacePoint - lowerLeft;
112
+ let gy = dot(normal, shadingPoint - light.position);
113
+ let surfacePoint = shadingPoint - normal * gy;
114
+ let ea = surfacePoint - lowerLeft;
115
115
  let width = length(light.u);
116
116
  let height = length(light.v);
117
117
  let uv = vec2f(
118
- dot(dU, light.u / width) / width,
119
- dot(dU, light.v / height) / height
118
+ dot(ea, light.u / width) / width,
119
+ dot(ea, light.v / height) / height
120
120
  );
121
- if (gg <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
121
+ if (gy <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
122
122
  (*result).emission = vec3f(0.0);
123
123
  (*result).pdf = 0.0;
124
124
  return;
125
125
  }
126
126
  (*result).direction = -normal;
127
- (*result).dist = gg;
127
+ (*result).dist = gy;
128
128
  (*result).normal = normal;
129
129
  (*result).emission = light.emission;
130
130
  (*result).pdf = 1.0;
131
131
  (*result).isDelta = true;
132
- bC(light, surfacePoint, lowerLeft, result);
132
+ bD(light, surfacePoint, lowerLeft, result);
133
133
  return;
134
134
  }
135
135
 
@@ -141,19 +141,19 @@ let bG = dot(offset, offset);
141
141
  (*result).dist = sqrt(bG);
142
142
  (*result).direction = offset / (*result).dist;
143
143
  (*result).normal = normal;
144
- let fY = dot(-(*result).direction, normal);
145
- let pp = cos(0.5 * PI * spread);
146
- if (fY <= 0.0 || fY < pp) {
144
+ let gq = dot(-(*result).direction, normal);
145
+ let qB = cos(0.5 * PI * spread);
146
+ if (gq <= 0.0 || gq < qB) {
147
147
  (*result).emission = vec3f(0.0);
148
148
  (*result).pdf = 0.0;
149
149
  return;
150
150
  }
151
151
  (*result).emission = light.emission;
152
- (*result).pdf = bG / max(light.area * fY, 1e-8);
153
- bC(light, surfacePoint, lowerLeft, result);
152
+ (*result).pdf = bG / max(light.area * gq, 1e-8);
153
+ bD(light, surfacePoint, lowerLeft, result);
154
154
  }
155
155
 
156
- fn gc(
156
+ fn gs(
157
157
  light: Light,
158
158
  result: ptr<function, LightSampleRec>
159
159
  ) {
@@ -165,16 +165,16 @@ result: ptr<function, LightSampleRec>
165
165
  (*result).isDelta = true;
166
166
  }
167
167
 
168
- fn ka(
168
+ fn kG(
169
169
  light: Light,
170
170
  shadingPoint: vec3f,
171
171
  samplePoint: vec2f,
172
172
  result: ptr<function, LightSampleRec>
173
173
  ) {
174
- eH(light, shadingPoint, samplePoint, result);
174
+ eR(light, shadingPoint, samplePoint, result);
175
175
  let surfacePoint = shadingPoint + (*result).direction * (*result).dist;
176
- let dI = normalize(shadingPoint - surfacePoint);
177
- (*result).emission *= evaluateSpotEmissionMultiplier(light, dI);
176
+ let dL = normalize(shadingPoint - surfacePoint);
177
+ (*result).emission *= evaluateSpotEmissionMultiplier(light, dL);
178
178
  }
179
179
 
180
180
  fn sampleAnalyticLight(
@@ -183,40 +183,40 @@ shadingPoint: vec3f,
183
183
  samplePoint: vec2f,
184
184
  result: ptr<function, LightSampleRec>
185
185
  ) {
186
- let dO = i32(light.litType);
187
- if (HAS_SCENE_RECT_LIGHT && dO == RECT_LIGHT) {
188
- jZ(light, shadingPoint, samplePoint, result);
186
+ let dU = i32(light.litType);
187
+ if (HAS_SCENE_RECT_LIGHT && dU == RECT_LIGHT) {
188
+ kF(light, shadingPoint, samplePoint, result);
189
189
  return;
190
190
  }
191
- if (HAS_SCENE_SPHERE_LIGHT && dO == SPHERE_LIGHT) {
192
- eH(light, shadingPoint, samplePoint, result);
191
+ if (HAS_SCENE_SPHERE_LIGHT && dU == SPHERE_LIGHT) {
192
+ eR(light, shadingPoint, samplePoint, result);
193
193
  return;
194
194
  }
195
- if (HAS_SCENE_SPOT_LIGHT && dO == SPOT_LIGHT) {
196
- ka(light, shadingPoint, samplePoint, result);
195
+ if (HAS_SCENE_SPOT_LIGHT && dU == SPOT_LIGHT) {
196
+ kG(light, shadingPoint, samplePoint, result);
197
197
  return;
198
198
  }
199
- if (HAS_SCENE_DIRECTIONAL_LIGHT && dO == DIRECTIONAL_LIGHT) {
200
- gc(light, result);
199
+ if (HAS_SCENE_DIRECTIONAL_LIGHT && dU == DIRECTIONAL_LIGHT) {
200
+ gs(light, result);
201
201
  }
202
202
  }
203
203
 
204
- fn ig(iY: vec2f, lightSample: ptr<function, LightSampleRec>) {
204
+ fn iM(jE: vec2f, lightSample: ptr<function, LightSampleRec>) {
205
205
  var uv: vec2f;
206
206
 
207
207
  var pdf: f32;
208
- let direction = pn(iY, &uv, &pdf);
208
+ let direction = qx(jE, &uv, &pdf);
209
209
  (*lightSample).pdf = pdf;
210
210
  (*lightSample).direction = direction;
211
211
  (*lightSample).emission = textureLinear(envMap, uv).rgb;
212
212
  (*lightSample).dist = INF;
213
213
  }
214
214
 
215
- fn loadLightSamplingTexel(im: i32) -> vec4f {
215
+ fn loadLightSamplingTexel(iR: i32) -> vec4f {
216
216
  let width = rtUniform.lightSamplingTextureWidth;
217
217
  return textureLoad(
218
218
  lightSamplingData,
219
- vec2i(im % width, im / width),
219
+ vec2i(iR % width, iR / width),
220
220
  0
221
221
  );
222
222
  }
@@ -238,9 +238,9 @@ e.zw, f.xy, f.zw
238
238
  );
239
239
  }
240
240
 
241
- fn tJ(index: i32) -> pW {
241
+ fn vn(index: i32) -> ra {
242
242
  let data = loadLightSamplingTexel(rtUniform.lightChoiceTexelOffset + index);
243
- return pW(
243
+ return ra(
244
244
  data.x,
245
245
  bitcast<i32>(data.y),
246
246
  bitcast<i32>(data.z),
@@ -248,35 +248,35 @@ bitcast<i32>(data.w)
248
248
  );
249
249
  }
250
250
 
251
- fn jG(nP: i32, index: i32) -> pW {
252
- return tJ(nP + index);
251
+ fn kk(oO: i32, index: i32) -> ra {
252
+ return vn(oO + index);
253
253
  }
254
254
 
255
- fn nG(
255
+ fn oD(
256
256
  rnd: vec3f,
257
- mE: u32,
257
+ nG: u32,
258
258
  candidateCount: u32
259
259
  ) -> vec3f {
260
- var um = rnd;
260
+ var vW = rnd;
261
261
  let count = max(candidateCount, 1u);
262
- um.z = (rnd.z + f32(min(mE, count - 1u))) /
262
+ vW.z = (rnd.z + f32(min(nG, count - 1u))) /
263
263
  f32(count);
264
- return um;
264
+ return vW;
265
265
  }
266
266
 
267
- fn mr(
267
+ fn nq(
268
268
  triangle: EmissiveTriangle,
269
- fk: vec3f,
270
- iY: vec2f,
269
+ fB: vec3f,
270
+ jE: vec2f,
271
271
  lightSample: ptr<function, LightSampleRec>
272
272
  ) {
273
- let xJ = sqrt(iY.x);
273
+ let zI = sqrt(jE.x);
274
274
  let barycentric = vec3f(
275
- 1.0 - xJ,
276
- xJ * (1.0 - iY.y),
277
- xJ * iY.y
275
+ 1.0 - zI,
276
+ zI * (1.0 - jE.y),
277
+ zI * jE.y
278
278
  );
279
- let ut =
279
+ let wd =
280
280
  barycentric.x * triangle.p0 +
281
281
  barycentric.y * triangle.p1 +
282
282
  barycentric.z * triangle.p2;
@@ -284,12 +284,12 @@ let uv =
284
284
  barycentric.x * triangle.uv0 +
285
285
  barycentric.y * triangle.uv1 +
286
286
  barycentric.z * triangle.uv2;
287
- let cQ =
287
+ let cT =
288
288
  barycentric.x * triangle.secondaryUv0 +
289
289
  barycentric.y * triangle.secondaryUv1 +
290
290
  barycentric.z * triangle.secondaryUv2;
291
291
  let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));
292
- (*lightSample).direction = ut - fk;
292
+ (*lightSample).direction = wd - fB;
293
293
  (*lightSample).dist = length((*lightSample).direction);
294
294
  if ((*lightSample).dist <= EPS) {
295
295
  (*lightSample).emission = vec3f(0.0);
@@ -298,27 +298,27 @@ return;
298
298
  }
299
299
  (*lightSample).direction /= (*lightSample).dist;
300
300
  (*lightSample).normal = normal;
301
- let om = dot(normal, -(*lightSample).direction);
302
- if (om <= 0.0) {
301
+ let pi = dot(normal, -(*lightSample).direction);
302
+ if (pi <= 0.0) {
303
303
  (*lightSample).emission = vec3f(0.0);
304
304
  (*lightSample).pdf = 0.0;
305
305
  return;
306
306
  }
307
307
  (*lightSample).emission = getMaterialEmission(
308
- i32(triangle.materialIndex), uv, cQ
308
+ i32(triangle.materialIndex), uv, cT
309
309
  );
310
310
  (*lightSample).selectionPmf = triangle.selectionPmf;
311
311
  (*lightSample).pdf = triangle.selectionPmf *
312
312
  ((*lightSample).dist * (*lightSample).dist) /
313
- max(triangle.area * om, 1e-8);
313
+ max(triangle.area * pi, 1e-8);
314
314
  }
315
315
 
316
- fn hb(
317
- fk: vec3f,
316
+ fn hz(
317
+ fB: vec3f,
318
318
  rnd: vec3f,
319
- nP: i32,
319
+ oO: i32,
320
320
  choiceCount: i32,
321
- nN: f32,
321
+ oN: f32,
322
322
  lightSample: ptr<function, LightSampleRec>
323
323
  ) {
324
324
  (*lightSample).emission = vec3f(0.0);
@@ -332,19 +332,19 @@ if (choiceCount <= 0) {
332
332
  return;
333
333
  }
334
334
 
335
- let sk = rnd.z * f32(choiceCount);
336
- let column = min(i32(sk), choiceCount - 1);
337
- let rS = jG(nP, column);
338
- let jc = select(
339
- rS.aliasIndex,
335
+ let tM = rnd.z * f32(choiceCount);
336
+ let column = min(i32(tM), choiceCount - 1);
337
+ let tk = kk(oO, column);
338
+ let jG = select(
339
+ tk.aliasIndex,
340
340
  column,
341
- fract(sk) < rS.probability
341
+ fract(tM) < tk.probability
342
342
  );
343
- let choice = jG(nP, jc);
343
+ let choice = kk(oO, jG);
344
344
  if (USE_ENVMAP && choice.sourceType == ${LIGHT_CHOICE_ENVIRONMENT}) {
345
345
  (*lightSample).sourceType = 0u;
346
346
  (*lightSample).sourceIndex = u32(choice.sourceIndex);
347
- ig(rnd.xy, lightSample);
347
+ iM(rnd.xy, lightSample);
348
348
  (*lightSample).selectionPmf = rtUniform.envLightPmf;
349
349
  (*lightSample).pdf *= rtUniform.envLightPmf;
350
350
  }
@@ -352,32 +352,32 @@ else if (choice.sourceType == ${LIGHT_CHOICE_ANALYTIC}) {
352
352
  (*lightSample).sourceType = 2u;
353
353
  (*lightSample).sourceIndex = u32(choice.sourceIndex);
354
354
  let light = analyticLights[choice.sourceIndex];
355
- sampleAnalyticLight(light, fk, rnd.xy, lightSample);
355
+ sampleAnalyticLight(light, fB, rnd.xy, lightSample);
356
356
  (*lightSample).selectionPmf = light.selectionPmf;
357
357
  (*lightSample).pdf *= light.selectionPmf;
358
358
  }
359
359
  else if (HAS_SCENE_EMISSIVE_LIGHT && choice.sourceType == ${LIGHT_CHOICE_EMISSIVE_TRIANGLE}) {
360
360
  (*lightSample).sourceType = 1u;
361
361
  (*lightSample).sourceIndex = u32(choice.sourceIndex);
362
- mr(
362
+ nq(
363
363
  getEmissiveTriangle(choice.sourceIndex),
364
- fk,
364
+ fB,
365
365
  rnd.xy,
366
366
  lightSample
367
367
  );
368
368
  }
369
- (*lightSample).selectionPmf *= nN;
370
- (*lightSample).pdf *= nN;
369
+ (*lightSample).selectionPmf *= oN;
370
+ (*lightSample).pdf *= oN;
371
371
  }
372
372
 
373
373
  fn sampleLight(
374
- fk: vec3f,
374
+ fB: vec3f,
375
375
  rnd: vec3f,
376
376
  lightSample: ptr<function, LightSampleRec>,
377
- tk: bool
377
+ uP: bool
378
378
  ) {
379
- hb(
380
- fk,
379
+ hz(
380
+ fB,
381
381
  rnd,
382
382
  0,
383
383
  rtUniform.lightChoiceCount,
@@ -388,16 +388,16 @@ lightSample
388
388
 
389
389
 
390
390
 
391
- fn nk(
392
- fk: vec3f,
391
+ fn oj(
392
+ fB: vec3f,
393
393
  rnd: vec3f,
394
- mE: u32,
394
+ nG: u32,
395
395
  candidateCount: u32,
396
396
  lightSample: ptr<function, LightSampleRec>
397
397
  ) {
398
- hb(
399
- fk,
400
- nG(rnd, mE, candidateCount),
398
+ hz(
399
+ fB,
400
+ oD(rnd, nG, candidateCount),
401
401
  0,
402
402
  rtUniform.lightChoiceCount,
403
403
  1.0,
@@ -1,3 +1,3 @@
1
- export declare function createSampleMaterialWgsl(hasAnisotropyDirections?: boolean, hasCoatNormals?: boolean, caustics?: boolean, researchContribution?: string, photonMapping?: boolean): string;
1
+ export declare function createSampleMaterialWgsl(hasAnisotropyDirections?: boolean, hasCoatNormals?: boolean, caustics?: boolean, researchContribution?: string, photonMapping?: boolean, channelIndependentRis?: boolean): string;
2
2
  declare const _default: string;
3
3
  export default _default;