@meimu/mutracer 0.0.0-stage → 0.1.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 (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +240 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14360 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +160 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +274 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +123 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +265 -0
  35. package/lib/Render.js +742 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +79 -0
  38. package/lib/RenderLoop.js +236 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1448 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +126 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +623 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +927 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +105 -0
  511. package/lib/util/fromTHREE.js +1111 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,1737 @@
1
+ /*
2
+ * OpenPBR energy-compensation, EON and thin-film portions Copyright 2026 Adobe.
3
+ * Licensed under the Apache License, Version 2.0.
4
+ * https://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ /*
7
+ * Renderer-specific OpenPBR layered BSDF.
8
+ *
9
+ * The prepare/eval/sample/pdf organization and fixed-lobe composition follow:
10
+ * - https://github.com/adobe/openpbr-bsdf
11
+ * - https://github.com/portsmouth/OpenPBR-viewer
12
+ *
13
+ * This compact GPU implementation reuses the renderer's GGX VNDF and volume
14
+ * integrator. Adobe's opaque-dielectric energy tables are used for the base
15
+ * rough-diffuse/specular coupling; fuzz still uses an analytic approximation.
16
+ */
17
+ import { OPENPBR_METAL_ENERGY_LUT_ROW, OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW, OPENPBR_DIELECTRIC_ENERGY_LUT_ROW, OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW, OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW } from '../../openPbrEnergyLut.js';
18
+ export function createOpenPbrBsdfWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
19
+ return /* wgsl */ `
20
+ const OPENPBR_LOBE_FUZZ: i32 = 0;
21
+ const OPENPBR_LOBE_COAT: i32 = 1;
22
+ const OPENPBR_LOBE_METAL: i32 = 2;
23
+ const OPENPBR_LOBE_SPECULAR: i32 = 3;
24
+ const OPENPBR_LOBE_TRANSMISSION: i32 = 4;
25
+ const OPENPBR_LOBE_DIFFUSE: i32 = 5;
26
+ const OPENPBR_LOBE_SUBSURFACE: i32 = 6;
27
+ const OPENPBR_LOBE_COUNT: i32 = 7;
28
+
29
+ struct bj {
30
+ tangent: vec3f,
31
+ bitangent: vec3f,
32
+ normal: vec3f,
33
+ };
34
+
35
+ struct ag {
36
+ material: J,
37
+ basis: bj,
38
+ ${hasAnisotropyDirections ? /* wgsl */ `
39
+ coatBasis: bj,
40
+ directionFrames: bool,
41
+ ` : /* wgsl */ ``}
42
+ ${hasCoatNormals ? /* wgsl */ ` coatViewLocal: vec3f,` : ''}
43
+ viewLocal: vec3f,
44
+ diffuseColor: vec3f,
45
+ specularEtaTOverEtaI: f32,
46
+ refractionEtaTOverEtaI: f32,
47
+ transmissionReflectionIor: f32,
48
+ thinFilmExteriorIor: f32,
49
+ thinFilmBaseIor: f32,
50
+ specularAlpha: f32,
51
+ diffuseSpecularEnergyCompensation: f32,
52
+ coatBaseScale: vec3f,
53
+ metalMsScale: vec3f,
54
+ metalMsFactor: f32,
55
+ metalMsProbability: f32,
56
+
57
+ dielectricMsReflectionScale: vec3f,
58
+ dielectricMsTransmissionScale: vec3f,
59
+ dielectricMsViewLoss: f32,
60
+ dielectricMsReflectionRatio: f32,
61
+ dielectricMsProbability: f32,
62
+
63
+ weights: array<f32, OPENPBR_LOBE_COUNT>,
64
+ probabilities: array<f32, OPENPBR_LOBE_COUNT>,
65
+ };
66
+
67
+ fn aw(color: vec3f) -> f32 {
68
+ return dot(color, vec3f(0.212671, 0.715160, 0.072169));
69
+ }
70
+
71
+ fn cV(bu: f32) -> f32 {
72
+ let value = (bu - 1.0) / (bu + 1.0);
73
+ return value * value;
74
+ }
75
+
76
+ fn aY(
77
+ bu: f32,
78
+ specularWeight: f32
79
+ ) -> f32 {
80
+ let sE = min(
81
+ cV(bu) * specularWeight,
82
+ 0.9999
83
+ );
84
+ let sG = sqrt(sE);
85
+ let kV = (1.0 + sG) / (1.0 - sG);
86
+ return select(kV, 1.0 / kV, bu < 1.0);
87
+ }
88
+
89
+ fn af(cc: f32, relativeIor: f32) -> f32 {
90
+ if (abs(relativeIor - 1.0) < 1e-6) {
91
+ return 0.0;
92
+ }
93
+ return ct(cc, relativeIor);
94
+ }
95
+
96
+ fn aC(ior: f32) -> f32 {
97
+ if (ior < 1.0) {
98
+ return 15.0 - ((1.0 / ior - 1.0) / 1.5) * 15.0;
99
+ }
100
+ return 16.0 + ((ior - 1.0) / 1.5) * 15.0;
101
+ }
102
+
103
+ fn F(rX: i32, row: i32) -> f32 {
104
+ return textureLoad(openPbrEnergyLut, vec2i(rX, row), 0).r;
105
+ }
106
+
107
+ fn fY(
108
+ dI: f32,
109
+ bR: f32,
110
+ hO: f32
111
+ ) -> f32 {
112
+ let bA = clamp(dI, 0.0, 31.0);
113
+ let aG = clamp(bR, 0.0, 31.0);
114
+ let bt = clamp(hO, 0.0, 31.0);
115
+ let dP = i32(floor(bA));
116
+ let aM = i32(floor(aG));
117
+ let cI = i32(floor(bt));
118
+ let hB = min(dP + 1, 31);
119
+ let cn = min(aM + 1, 31);
120
+ let eO = min(cI + 1, 31);
121
+ let cp = bA - f32(dP);
122
+ let cy = aG - f32(aM);
123
+ let ku = bt - f32(cI);
124
+
125
+ let uk = F(cI, dP * 32 + aM);
126
+ let ul = F(eO, dP * 32 + aM);
127
+ let um = F(cI, dP * 32 + cn);
128
+ let un = F(eO, dP * 32 + cn);
129
+ let uo = F(cI, hB * 32 + aM);
130
+ let uq = F(eO, hB * 32 + aM);
131
+ let ur = F(cI, hB * 32 + cn);
132
+ let us = F(eO, hB * 32 + cn);
133
+ let v00 = mix(uk, uo, cp);
134
+ let v01 = mix(ul, uq, cp);
135
+ let v10 = mix(um, ur, cp);
136
+ let v11 = mix(un, us, cp);
137
+ return mix(
138
+ mix(v00, v10, cy),
139
+ mix(v01, v11, cy),
140
+ ku
141
+ );
142
+ }
143
+
144
+ fn gx(dI: f32, bR: f32) -> f32 {
145
+ let bA = clamp(dI, 0.0, 31.0);
146
+ let aG = clamp(bR, 0.0, 31.0);
147
+ let dP = i32(floor(bA));
148
+ let aM = i32(floor(aG));
149
+ let hB = min(dP + 1, 31);
150
+ let cn = min(aM + 1, 31);
151
+ let cp = bA - f32(dP);
152
+ let cy = aG - f32(aM);
153
+ let v00 = F(aM, 1024 + dP);
154
+ let v01 = F(cn, 1024 + dP);
155
+ let v10 = F(aM, 1024 + hB);
156
+ let v11 = F(cn, 1024 + hB);
157
+ return mix(
158
+ mix(v00, v10, cp),
159
+ mix(v01, v11, cp),
160
+ cy
161
+ );
162
+ }
163
+
164
+
165
+
166
+ fn ef(
167
+ dI: f32,
168
+ bR: f32,
169
+ hO: f32
170
+ ) -> f32 {
171
+ let bA = clamp(dI, 0.0, 31.0);
172
+ let aG = clamp(bR, 0.0, 31.0);
173
+ let bt = clamp(hO, 0.0, 31.0);
174
+ let dP = i32(floor(bA));
175
+ let aM = i32(floor(aG));
176
+ let cI = i32(floor(bt));
177
+ let hB = min(dP + 1, 31);
178
+ let cn = min(aM + 1, 31);
179
+ let eO = min(cI + 1, 31);
180
+ let cp = bA - f32(dP);
181
+ let cy = aG - f32(aM);
182
+ let ku = bt - f32(cI);
183
+
184
+ let uk = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aM);
185
+ let ul = F(eO, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aM);
186
+ let um = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + cn);
187
+ let un = F(eO, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + cn);
188
+ let uo = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aM);
189
+ let uq = F(eO, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aM);
190
+ let ur = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + cn);
191
+ let us = F(eO, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + cn);
192
+ let v00 = mix(uk, uo, cp);
193
+ let v01 = mix(ul, uq, cp);
194
+ let v10 = mix(um, ur, cp);
195
+ let v11 = mix(un, us, cp);
196
+ return mix(
197
+ mix(v00, v10, cy),
198
+ mix(v01, v11, cy),
199
+ ku
200
+ );
201
+ }
202
+
203
+ fn ee(dI: f32, bR: f32) -> f32 {
204
+ let bA = clamp(dI, 0.0, 31.0);
205
+ let aG = clamp(bR, 0.0, 31.0);
206
+ let dP = i32(floor(bA));
207
+ let aM = i32(floor(aG));
208
+ let hB = min(dP + 1, 31);
209
+ let cn = min(aM + 1, 31);
210
+ let cp = bA - f32(dP);
211
+ let cy = aG - f32(aM);
212
+ let v00 = F(aM, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
213
+ let v01 = F(cn, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
214
+ let v10 = F(aM, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
215
+ let v11 = F(cn, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
216
+ return mix(
217
+ mix(v00, v10, cp),
218
+ mix(v01, v11, cp),
219
+ cy
220
+ );
221
+ }
222
+
223
+ fn eF(dI: f32, bR: f32) -> f32 {
224
+ let bA = clamp(dI, 0.0, 31.0);
225
+ let aG = clamp(bR, 0.0, 31.0);
226
+ let dP = i32(floor(bA));
227
+ let aM = i32(floor(aG));
228
+ let hB = min(dP + 1, 31);
229
+ let cn = min(aM + 1, 31);
230
+ let cp = bA - f32(dP);
231
+ let cy = aG - f32(aM);
232
+ let v00 = F(aM, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
233
+ let v01 = F(cn, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
234
+ let v10 = F(aM, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
235
+ let v11 = F(cn, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
236
+ return mix(
237
+ mix(v00, v10, cp),
238
+ mix(v01, v11, cp),
239
+ cy
240
+ );
241
+ }
242
+
243
+ fn bO(ior: f32, alpha: f32, au: f32) -> f32 {
244
+ return ef(aC(ior), sqrt(alpha) * 31.0, au * 31.0);
245
+ }
246
+ fn cO(ior: f32, alpha: f32) -> f32 {
247
+ return ee(aC(ior), sqrt(alpha) * 31.0);
248
+ }
249
+ fn ch(ior: f32, alpha: f32) -> f32 {
250
+ return eF(aC(ior), sqrt(alpha) * 31.0);
251
+ }
252
+
253
+
254
+
255
+ fn bH(alpha: f32, au: f32) -> f32 {
256
+ let ia = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
257
+ let bt = clamp(au * 31.0, 0.0, 31.0);
258
+ let r0 = i32(floor(ia));
259
+ let c0 = i32(floor(bt));
260
+ let r1 = min(r0 + 1, 31);
261
+ let c1 = min(c0 + 1, 31);
262
+ return mix(
263
+ mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bt)),
264
+ mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bt)),
265
+ fract(ia));
266
+ }
267
+
268
+ fn cu(alpha: f32) -> f32 {
269
+ let index = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
270
+ let i0 = i32(floor(index));
271
+ return mix(F(i0, ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}),
272
+ F(min(i0 + 1, 31), ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}), fract(index));
273
+ }
274
+
275
+ fn aX(value: f32, ior: f32) -> f32 {
276
+ if (ior > 2.5 || ior < 0.4) {
277
+ let tI = cV(2.5);
278
+ let progress = (cV(ior) - tI) / (1.0 - tI);
279
+ return (1.0 - progress) * value;
280
+ }
281
+ return value;
282
+ }
283
+
284
+ fn aI(
285
+ ior: f32,
286
+ alpha: f32,
287
+ au: f32
288
+ ) -> f32 {
289
+ let value = fY(
290
+ aC(ior),
291
+ sqrt(alpha) * 31.0,
292
+ au * 31.0
293
+ );
294
+ return aX(value, ior);
295
+ }
296
+
297
+ fn cq(ior: f32, alpha: f32) -> f32 {
298
+ let value = gx(
299
+ aC(ior),
300
+ sqrt(alpha) * 31.0
301
+ );
302
+ return aX(value, ior);
303
+ }
304
+
305
+ fn openpbr_to_world(basis: bj, direction: vec3f) -> vec3f {
306
+ return direction.x * basis.tangent
307
+ + direction.y * basis.bitangent
308
+ + direction.z * basis.normal;
309
+ }
310
+
311
+ fn openpbr_to_local(basis: bj, direction: vec3f) -> vec3f {
312
+ return vec3f(
313
+ dot(direction, basis.tangent),
314
+ dot(direction, basis.bitangent),
315
+ dot(direction, basis.normal)
316
+ );
317
+ }
318
+
319
+ fn fg(
320
+ aU: vec3f,
321
+ normal: vec3f,
322
+ anisotropy: f32
323
+ ) -> bj {
324
+ var basis: bj;
325
+ basis.normal = normal;
326
+ var tangent = aU;
327
+ var bitangent = vec3f(0.0);
328
+ if (dot(tangent, tangent) < 0.001 || anisotropy <= 0.0) {
329
+ aK(normal, &tangent, &bitangent);
330
+ }
331
+ else {
332
+ bitangent = normalize(cross(normal, tangent));
333
+ tangent = normalize(cross(bitangent, normal));
334
+ }
335
+ basis.tangent = tangent;
336
+ basis.bitangent = bitangent;
337
+ return basis;
338
+ }
339
+
340
+ fn jR(
341
+ av: f32,
342
+ ak: f32,
343
+ L: f32,
344
+ S: f32
345
+ ) -> f32 {
346
+ return (av * L - ak * S)
347
+ / (av * L + ak * S);
348
+ }
349
+
350
+ fn jQ(
351
+ av: f32,
352
+ ak: f32,
353
+ L: f32,
354
+ S: f32
355
+ ) -> f32 {
356
+ return (ak * L - av * S)
357
+ / (av * S + ak * L);
358
+ }
359
+
360
+ fn gX(
361
+ av: f32,
362
+ ak: f32,
363
+ L: f32,
364
+ S: f32
365
+ ) -> f32 {
366
+ return 2.0 * av * L
367
+ / (av * L + ak * S);
368
+ }
369
+
370
+ fn gW(
371
+ av: f32,
372
+ ak: f32,
373
+ L: f32,
374
+ S: f32
375
+ ) -> f32 {
376
+ return 2.0 * av * L
377
+ / (av * S + ak * L);
378
+ }
379
+
380
+ fn aV(a: vec2f, b: vec2f) -> vec2f {
381
+ return vec2f(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
382
+ }
383
+
384
+ fn aZ(a: vec2f, b: vec2f) -> vec2f {
385
+ let ap = max(dot(b, b), 1e-9);
386
+ return vec2f(
387
+ (a.x * b.x + a.y * b.y) / ap,
388
+ (a.y * b.x - a.x * b.y) / ap
389
+ );
390
+ }
391
+
392
+ fn hU(value: vec2f) -> vec2f {
393
+ let ns = length(value);
394
+ let sC = sqrt(max(0.0, 0.5 * (ns + value.x)));
395
+ let fc = sqrt(max(0.0, 0.5 * (ns - value.x)));
396
+ return vec2f(sC, select(-fc, fc, value.y >= 0.0));
397
+ }
398
+
399
+ fn bX(
400
+ L: f32,
401
+ av: f32,
402
+ ak: vec2f,
403
+ qu: bool
404
+ ) -> vec2f {
405
+ let ob = sqrt(max(0.0, 1.0 - L * L));
406
+ let sj = aZ(vec2f(av, 0.0), ak);
407
+ let hw = sj * ob;
408
+ var S = hU(
409
+ vec2f(1.0, 0.0) - aV(hw, hw)
410
+ );
411
+ if (aV(ak, S).y < 0.0) {
412
+ S = -S;
413
+ }
414
+
415
+ let fH = vec2f(av * L, 0.0);
416
+ let eA = aV(ak, S);
417
+ if (qu) {
418
+ let ci = ak * L;
419
+ let ce = S * av;
420
+ return aZ(
421
+ ci - ce,
422
+ ci + ce
423
+ );
424
+ }
425
+ return aZ(
426
+ fH - eA,
427
+ fH + eA
428
+ );
429
+ }
430
+
431
+ fn eq(
432
+ iD: f32,
433
+ gG: f32,
434
+ ov: f32,
435
+ mA: f32,
436
+ jW: vec2f,
437
+ phase: f32
438
+ ) -> f32 {
439
+ let mX = vec2f(cos(phase), sin(phase));
440
+ let hX = aV(jW, mX);
441
+ let kC = hX * (gG * mA);
442
+ let ap = vec2f(1.0, 0.0) - hX * ov;
443
+ let hv = vec2f(iD, 0.0)
444
+ + aZ(kC, ap);
445
+ return dot(hv, hv);
446
+ }
447
+
448
+ fn ar(
449
+ L: f32,
450
+ wavelength: f32,
451
+ cm: f32,
452
+ aL: f32,
453
+ ck: f32,
454
+ eu: vec2f
455
+ ) -> f32 {
456
+ let dl = clamp(abs(L), 1e-5, 1.0);
457
+ let hq = pow(aL / ck, 2.0)
458
+ * (1.0 - dl * dl);
459
+ if (hq >= 1.0) {
460
+ return 1.0;
461
+ }
462
+ let cU = sqrt(1.0 - hq);
463
+ let kP = jR(
464
+ aL, ck, dl, cU
465
+ );
466
+ let kO = jQ(
467
+ aL, ck, dl, cU
468
+ );
469
+ let jd = gX(
470
+ aL, ck, dl, cU
471
+ );
472
+ let jc = gW(
473
+ aL, ck, dl, cU
474
+ );
475
+ let gj = ck * cU
476
+ / max(aL * dl, 1e-9);
477
+ let phase = 2.0 * PI * (2.0 * ck * cm * cU) / wavelength;
478
+ var rO = 0.0;
479
+
480
+ for (var jV = 0u; jV < (rtUniform.loopUnrollGuard >> 1u); jV++) {
481
+ let iD = select(kP, kO, jV == 1u);
482
+ let gG = select(jd, jc, jV == 1u);
483
+ let jW = bX(
484
+ cU, ck, eu, jV == 1u);
485
+ rO += eq(iD, gG,
486
+ -iD, gG * gj, jW, phase);
487
+ }
488
+ return clamp(0.5 * rO, 0.0, 1.0);
489
+ }
490
+
491
+
492
+
493
+
494
+ fn dT(au: f32, f0: vec3f, tint: vec3f) -> vec3f {
495
+ let qW = mix(f0, vec3f(1.0), aE(au));
496
+ if (all(tint == vec3f(1.0))) { return qW; }
497
+ let dj = 1.0 / 7.0;
498
+ let lW = 1.0 - dj;
499
+ let fF = mix(f0, vec3f(1.0), aE(dj));
500
+ let dg = 1.0 - au;
501
+ let qh = au * aE(au) * dg
502
+ / (dj * pow(lW, 6.0));
503
+ return clamp(qW - qh * (fF - tint * fF), vec3f(0.0), vec3f(1.0));
504
+ }
505
+
506
+ fn cQ(f0: f32, tb: f32) -> vec2f {
507
+ let dM = clamp(f0, 0.0, 0.99);
508
+ let gF = sqrt(dM);
509
+ let qt = (1.0 - dM) / (1.0 + dM);
510
+ let qr = (1.0 + gF) / max(1.0 - gF, 1e-9);
511
+ let ior = mix(qr, qt, clamp(tb, 0.0, 1.0));
512
+ let jG = (
513
+ (ior + 1.0) * (ior + 1.0) * dM
514
+ - (ior - 1.0) * (ior - 1.0)
515
+ ) / max(1.0 - dM, 1e-9);
516
+ return vec2f(ior, sqrt(max(jG, 0.0)));
517
+ }
518
+
519
+
520
+ fn bN(cm: f32, weight: f32) -> f32 {
521
+ return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, cm);
522
+ }
523
+
524
+
525
+
526
+ fn cD(
527
+ material: J,
528
+ color: vec3f,
529
+ viewLocal: vec3f,
530
+ lightLocal: vec3f,
531
+ fo: f32,
532
+ pdf: ptr<function, f32>
533
+ ) -> vec3f {
534
+ *pdf = 0.0;
535
+ if (lightLocal.z <= 0.0) {
536
+ return vec3f(0.0);
537
+ }
538
+
539
+ let roughness = material.diffuseRoughness;
540
+ let gQ = 0.5 - 2.0 / (3.0 * PI);
541
+ let nU = 2.0 / 3.0 - 28.0 / (15.0 * PI);
542
+ let om = lightLocal.z;
543
+ let mn = viewLocal.z;
544
+ let hM = dot(lightLocal, viewLocal) - om * mn;
545
+ let gN = select(
546
+ hM,
547
+ hM / max(max(om, mn), 1e-7),
548
+ hM > 0.0
549
+ );
550
+ let ih = 1.0 / (1.0 + gQ * roughness);
551
+ let nf = color * INVPI * ih
552
+ * (1.0 + roughness * gN);
553
+
554
+ let dc = 1.0 - om;
555
+ let cP = 1.0 - mn;
556
+ let oc = dc * (
557
+ 0.0571085289 + dc * (
558
+ 0.491881867 + dc * (
559
+ -0.332181442 + dc * 0.0714429953
560
+ )
561
+ )
562
+ );
563
+ let mW = cP * (
564
+ 0.0571085289 + cP * (
565
+ 0.491881867 + cP * (
566
+ -0.332181442 + cP * 0.0714429953
567
+ )
568
+ )
569
+ );
570
+ let pi = (1.0 + roughness * oc)
571
+ / (1.0 + gQ * roughness);
572
+ let oq = (1.0 + roughness * mW)
573
+ / (1.0 + gQ * roughness);
574
+ let fQ = ih * (1.0 + nU * roughness);
575
+ let hC = color * color * fQ
576
+ / max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - fQ));
577
+ let lp = hC * INVPI
578
+ * max(1e-7, 1.0 - oq)
579
+ * max(1e-7, 1.0 - pi)
580
+ / max(1e-7, 1.0 - fQ);
581
+ *pdf = lightLocal.z * INVPI;
582
+ return (nf + lp) * fo;
583
+ }
584
+
585
+ fn aO(viewCosine: f32, roughness: f32) -> f32 {
586
+ let x = clamp(viewCosine, 0.0, 1.0);
587
+ let y = clamp(roughness, 0.01, 1.0);
588
+ let scale = y * (0.0206607 + 1.58491 * y)
589
+ / (0.0379424 + y * (1.32227 + y));
590
+ let mean = y * (-0.193854 + y * (-1.14885 + y * (1.7932 - 0.95943 * y * y)))
591
+ / (0.046391 + y);
592
+ let offset = y * (0.000654023 + (-0.0207818 + 0.119681 * y) * y)
593
+ / (1.26264 + y * (-1.92021 + y));
594
+ let gaussian = exp(-0.5 * pow((x - mean) / scale, 2.0))
595
+ / (scale * sqrt(2.0 * PI));
596
+ return max(gaussian + offset, 0.0);
597
+ }
598
+
599
+ fn jP(
600
+ material: J,
601
+ viewLocal: vec3f,
602
+ lightLocal: vec3f,
603
+ pdf: ptr<function, f32>
604
+ ) -> vec3f {
605
+ *pdf = 0.0;
606
+ if (viewLocal.z <= 0.0 || lightLocal.z <= 0.0) {
607
+ return vec3f(0.0);
608
+ }
609
+ let albedo = aO(
610
+ viewLocal.z,
611
+ material.fuzzRoughness
612
+ );
613
+ *pdf = lightLocal.z * INVPI;
614
+ return material.fuzzColor * albedo * INVPI;
615
+ }
616
+
617
+ fn am(
618
+ material: J,
619
+ viewLocal: vec3f,
620
+ lightLocal: vec3f,
621
+ V: vec3f,
622
+ cK: vec3f,
623
+ pdf: ptr<function, f32>
624
+ ) -> vec3f {
625
+ *pdf = 0.0;
626
+ if (lightLocal.z <= 0.0) {
627
+ return vec3f(0.0);
628
+ }
629
+
630
+ let alpha = vec2f(material.alphaX, material.alphaY);
631
+ let distribution = gE(V, alpha);
632
+ let jM = bk(viewLocal, alpha);
633
+ let ea = jM
634
+ * bk(lightLocal, alpha);
635
+
636
+ *pdf = jM * distribution / (4.0 * max(viewLocal.z, 1e-8));
637
+ return cK * distribution * ea
638
+ / (4.0 * max(lightLocal.z * viewLocal.z, 1e-8));
639
+ }
640
+
641
+ fn dk(
642
+ material: J,
643
+ relativeIor: f32,
644
+ tint: vec3f,
645
+ viewLocal: vec3f,
646
+ lightLocal: vec3f,
647
+ V: vec3f,
648
+ cK: vec3f,
649
+ pdf: ptr<function, f32>
650
+ ) -> vec3f {
651
+ *pdf = 0.0;
652
+ if (lightLocal.z >= 0.0) {
653
+ return vec3f(0.0);
654
+ }
655
+
656
+ let kz = dot(lightLocal, V);
657
+ let bQ = dot(viewLocal, V);
658
+
659
+
660
+ if (bQ <= 0.0 || kz >= 0.0) {
661
+ return vec3f(0.0);
662
+ }
663
+ let alpha = vec2f(material.alphaX, material.alphaY);
664
+ let distribution = gE(V, alpha);
665
+ let jM = bk(viewLocal, alpha);
666
+ let ea = jM
667
+ * bk(lightLocal, alpha);
668
+ var ap = kz + bQ * relativeIor;
669
+ ap *= ap;
670
+ let pn = abs(kz) / max(ap, 1e-8);
671
+ let jm = relativeIor * relativeIor;
672
+
673
+ *pdf = jM * max(0.0, bQ) * distribution * pn
674
+ / max(viewLocal.z, 1e-8);
675
+ return tint * (vec3f(1.0) - cK) * distribution * ea
676
+ * abs(bQ) * pn * jm
677
+ / max(abs(lightLocal.z * viewLocal.z), 1e-8);
678
+ }
679
+
680
+ fn bn(material: J) -> vec3f {
681
+ if (HAS_MEDIUM && material.mediumType > 0) {
682
+ return vec3f(1.0);
683
+ }
684
+ return material.transmissionColor;
685
+ }
686
+
687
+ fn cS(ah: f32) -> f32 {
688
+ return 2.0 * ah / (1.0 + ah);
689
+ }
690
+
691
+ fn aP(
692
+ ah: vec3f,
693
+ transmissionWeight: f32
694
+ ) -> vec3f {
695
+ let gf = 2.0 * ah
696
+ / (vec3f(1.0) + ah);
697
+ return mix(
698
+ ah,
699
+ gf,
700
+ clamp(transmissionWeight, 0.0, 1.0)
701
+ );
702
+ }
703
+
704
+ fn bG(
705
+ material: J,
706
+ L: f32,
707
+ bu: f32
708
+ ) -> vec3f {
709
+ let tint = bn(material);
710
+ if (!material.thinWalled) {
711
+ return tint;
712
+ }
713
+ let iF = max(0.0, 1.0 - L * L);
714
+ let dN = iF
715
+ / max(bu * bu, 1e-9);
716
+ if (dN >= 1.0) {
717
+ return vec3f(0.0);
718
+ }
719
+ let S = sqrt(1.0 - dN);
720
+ return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(S, 1e-5)));
721
+ }
722
+
723
+ fn dL(
724
+ material: J,
725
+ viewLocal: vec3f,
726
+ lightLocal: vec3f,
727
+ pdf: ptr<function, f32>
728
+ ) -> vec3f {
729
+ *pdf = 0.0;
730
+ if (viewLocal.z <= 0.0 || lightLocal.z >= 0.0) {
731
+ return vec3f(0.0);
732
+ }
733
+ let S = -lightLocal.z;
734
+ let nR = ct(
735
+ viewLocal.z,
736
+ material.relativeIor
737
+ );
738
+ *pdf = S * INVPI;
739
+ return vec3f(1.0 - nR) * INVPI;
740
+ }
741
+
742
+ fn dQ(prepared: ptr<function, ag>) {
743
+
744
+
745
+ let nr = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
746
+ var total = (*prepared).probabilities[OPENPBR_LOBE_FUZZ];
747
+ for (var hR = 1; hR < nr; hR++) {
748
+ total += (*prepared).probabilities[hR];
749
+ }
750
+ if (total <= 1e-8) {
751
+ for (var hR = 0; hR < nr; hR++) {
752
+ (*prepared).probabilities[hR] = 0.0;
753
+ }
754
+ return;
755
+ }
756
+ let og = 1.0 / total;
757
+ for (var hR = 0; hR < nr; hR++) {
758
+ (*prepared).probabilities[hR] *= og;
759
+ }
760
+ }
761
+
762
+
763
+
764
+ fn bM(eta: f32) -> f32 {
765
+ if (abs(eta - 1.0) < 1e-6) { return 0.0; }
766
+ if (eta > 1.0) { return (eta - 1.0) / (4.08567 + 1.00071 * eta); }
767
+ return 0.997118 + 0.1014 * eta - 0.965241 * eta * eta - 0.130607 * eta * eta * eta;
768
+ }
769
+
770
+ fn bP(f0: vec3f, tint: vec3f) -> vec3f {
771
+ let dj = 1.0 / 7.0;
772
+ let fF = mix(f0, vec3f(1.0), aE(dj));
773
+ let b = fF * (vec3f(1.0) - tint) / (dj * pow(1.0 - dj, 6.0));
774
+ return clamp(f0 + (vec3f(1.0) - f0) / 21.0 - b / 126.0, vec3f(0.0), vec3f(1.0));
775
+ }
776
+
777
+
778
+
779
+ fn cC(material: J, au: f32) -> vec3f {
780
+ if (au <= 0.0) { return vec3f(1.0); }
781
+ let lr = sqrt(max(0.0, 1.0 - (1.0 - au * au) / (material.coatIor * material.coatIor)));
782
+ let tl = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(lr, 1e-5)));
783
+ return mix(vec3f(1.0), tl, material.coatWeight);
784
+ }
785
+
786
+ fn gi(material: J, au: f32) -> f32 {
787
+ if (material.coatRoughness <= ROUGHNESS_MIN) {
788
+ return af(au, 1.0 / material.coatIor);
789
+ }
790
+
791
+
792
+ return clamp(1.0 - aI(material.coatIor,
793
+ material.coatRoughness * material.coatRoughness, au), 0.0, 1.0);
794
+ }
795
+
796
+ fn gV(prepared: ag) -> vec3f {
797
+ let material = prepared.material;
798
+ let dielectric = 1.0 - material.baseMetalness;
799
+ let opaque = dielectric * (1.0 - material.transmissionWeight) * (1.0 - material.subsurfaceWeight);
800
+ let sss = dielectric * (1.0 - material.transmissionWeight) * material.subsurfaceWeight;
801
+ let tT = dielectric * material.transmissionWeight;
802
+ let fL = bM(prepared.specularEtaTOverEtaI);
803
+ let kI = bM(1.0 / prepared.transmissionReflectionIor);
804
+ let pw = clamp(opaque * fL + (sss + tT) * kI + material.baseMetalness, 0.0, 1.0);
805
+ let ji = mix(1.0, material.specularRoughness, pw);
806
+ let ks = bM(material.coatIor);
807
+ let kr = 1.0 - (1.0 - ks) / (material.coatIor * material.coatIor);
808
+ let k = mix(ks, kr, ji);
809
+ let eb = material.baseMetalness * material.specularWeight * bP(material.baseWeight * material.baseColor, material.specularColor)
810
+ + opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), fL)
811
+ + sss * material.subsurfaceColor + vec3f(tT);
812
+ let qH = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
813
+ return mix(vec3f(1.0), qH, material.coatWeight * material.coatDarkening);
814
+ }
815
+
816
+ fn ds(prepared: ag, kY: f32) -> vec3f {
817
+ if (prepared.material.coatWeight <= 0.0) { return vec3f(1.0); }
818
+ if (prepared.material.inside) {
819
+
820
+ return cC(prepared.material, -kY);
821
+ }
822
+
823
+ return prepared.coatBaseScale * cC(prepared.material, kY);
824
+ }
825
+
826
+
827
+ ${hasAnisotropyDirections ? /* wgsl */ `
828
+ fn du(fallback: bj, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> bj {
829
+ var t = tangent - fallback.normal * dot(fallback.normal, tangent);
830
+ if (dot(t, t) < 1e-8) { t = fallback.tangent; }
831
+ t = normalize(t);
832
+ let b = cross(fallback.normal, t) * select(1.0, -1.0, dot(cross(fallback.normal, t), bitangent) < 0.0);
833
+ t = t * direction.x + b * direction.y;
834
+ if (dot(t, t) < 1e-8) { return fallback; }
835
+ var basis = fallback;
836
+ basis.tangent = normalize(t);
837
+ basis.bitangent = normalize(cross(basis.normal, basis.tangent));
838
+ basis.tangent = normalize(cross(basis.bitangent, basis.normal));
839
+ return basis;
840
+ }
841
+
842
+ ` : /* wgsl */ ``}
843
+ fn eG(
844
+ tangent: vec3f,
845
+ material: J,
846
+ bF: vec3f,
847
+ normal: vec3f
848
+ ) -> ag {
849
+ var prepared: ag;
850
+ prepared.material = material;
851
+ prepared.basis = fg(
852
+ tangent,
853
+ normal,
854
+ max(material.specularAnisotropy, material.coatAnisotropy)
855
+ );
856
+ ${hasAnisotropyDirections ? /* wgsl */ `
857
+ prepared.coatBasis = prepared.basis;
858
+ prepared.directionFrames = false;
859
+ ${hasCoatNormals ? /* wgsl */ `
860
+
861
+
862
+ if (material.coatNormalEnabled) {
863
+ prepared.coatBasis = fg(material.geometryTangent, material.coatNormal, material.coatAnisotropy);
864
+ prepared.directionFrames = true;
865
+ }
866
+ ` : ''}
867
+ if (material.specularAnisotropy > 0.0 && material.anisotropyDirectionEnabled) {
868
+ prepared.basis = du(prepared.basis, material.directionTangent, material.directionBitangent, material.anisotropyDirection);
869
+ prepared.directionFrames = true;
870
+ }
871
+ if (material.coatAnisotropy > 0.0 && material.coatAnisotropyRotation != 0.0) {
872
+ prepared.coatBasis = du(prepared.coatBasis, material.geometryTangent, material.geometryBitangent, vec2f(cos(material.coatAnisotropyRotation), sin(material.coatAnisotropyRotation)));
873
+ prepared.directionFrames = true;
874
+ }
875
+ ` : /* wgsl */ ``}
876
+ prepared.viewLocal = openpbr_to_local(prepared.basis, bF);
877
+ ${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bF);` : ''}
878
+ prepared.diffuseColor = material.baseColor;
879
+
880
+ let cA = 1.0 - material.baseMetalness;
881
+ let dK = cA
882
+ * (1.0 - material.transmissionWeight);
883
+ prepared.weights[OPENPBR_LOBE_FUZZ] = material.fuzzWeight;
884
+ prepared.weights[OPENPBR_LOBE_COAT] = material.coatWeight;
885
+ if (material.inside) { prepared.weights[OPENPBR_LOBE_COAT] = 0.0; }
886
+ prepared.weights[OPENPBR_LOBE_METAL] = material.baseMetalness;
887
+ prepared.weights[OPENPBR_LOBE_SPECULAR] = cA;
888
+ prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cA
889
+ * material.transmissionWeight;
890
+ prepared.weights[OPENPBR_LOBE_DIFFUSE] = dK
891
+ * (1.0 - material.subsurfaceWeight) * material.baseWeight;
892
+ prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dK
893
+ * material.subsurfaceWeight;
894
+
895
+ prepared.specularEtaTOverEtaI = aY(
896
+ 1.0 / material.relativeIor,
897
+ material.specularWeight
898
+ );
899
+ prepared.material.relativeIor = 1.0 / prepared.specularEtaTOverEtaI;
900
+ prepared.refractionEtaTOverEtaI = prepared.specularEtaTOverEtaI;
901
+ prepared.transmissionReflectionIor = prepared.material.relativeIor;
902
+
903
+
904
+ if (material.coatWeight > 0.0) {
905
+ var cj = 1.0;
906
+ if (!material.inside) { cj = mix(1.0, material.coatIor, material.coatWeight); }
907
+ let bq = cj * aY(
908
+ material.specularIor / cj, material.specularWeight);
909
+ var er = bq / cj;
910
+ if (cj > bq && bq >= 1.0) {
911
+ er = 1.0 / er;
912
+ }
913
+ prepared.specularEtaTOverEtaI = er;
914
+ prepared.transmissionReflectionIor = 1.0 / er;
915
+ prepared.refractionEtaTOverEtaI = bq;
916
+ if (material.inside) {
917
+ prepared.refractionEtaTOverEtaI = 1.0 / bq;
918
+ prepared.transmissionReflectionIor = bq;
919
+ }
920
+ prepared.material.relativeIor = 1.0 / prepared.refractionEtaTOverEtaI;
921
+ }
922
+
923
+
924
+
925
+ prepared.thinFilmExteriorIor = 1.0;
926
+ prepared.thinFilmBaseIor = prepared.specularEtaTOverEtaI;
927
+ if (material.coatWeight > 0.0) {
928
+ if (material.inside) {
929
+ prepared.thinFilmExteriorIor = 1.0 / prepared.refractionEtaTOverEtaI;
930
+ prepared.thinFilmBaseIor = 1.0;
931
+ }
932
+ else {
933
+ prepared.thinFilmExteriorIor = mix(1.0, material.coatIor, material.coatWeight);
934
+ prepared.thinFilmBaseIor = prepared.refractionEtaTOverEtaI;
935
+ }
936
+ }
937
+ prepared.specularAlpha = material.specularRoughness
938
+ * material.specularRoughness;
939
+ let viewCosine = abs(prepared.viewLocal.z);
940
+ let ah = af(
941
+ viewCosine,
942
+ 1.0 / prepared.specularEtaTOverEtaI
943
+ );
944
+ let ft = material.specularColor * select(
945
+ ah,
946
+ mix(
947
+ ah,
948
+ cS(ah),
949
+ material.transmissionWeight
950
+ ),
951
+ material.thinWalled
952
+ );
953
+ let hS = material.specularWeight * dT(
954
+ viewCosine,
955
+ material.baseWeight * material.baseColor,
956
+ material.specularColor
957
+ );
958
+ let eL = select(
959
+ af(viewCosine, prepared.transmissionReflectionIor),
960
+ cS(af(viewCosine, prepared.transmissionReflectionIor)),
961
+ material.thinWalled
962
+ );
963
+ let gH = bG(
964
+ material,
965
+ viewCosine,
966
+ prepared.refractionEtaTOverEtaI
967
+ );
968
+ let im = aI(
969
+ prepared.specularEtaTOverEtaI,
970
+ prepared.specularAlpha,
971
+ viewCosine
972
+ );
973
+ let gk = cq(
974
+ prepared.specularEtaTOverEtaI,
975
+ prepared.specularAlpha
976
+ );
977
+ prepared.diffuseSpecularEnergyCompensation = im
978
+ / max(gk, 1e-12);
979
+
980
+ prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
981
+ * aw(material.fuzzColor)
982
+ * max(aO(
983
+ viewCosine,
984
+ material.fuzzRoughness
985
+ ), 0.02);
986
+ prepared.probabilities[OPENPBR_LOBE_COAT] = 0.0;
987
+ prepared.coatBaseScale = vec3f(1.0);
988
+ if (material.coatWeight > 0.0 && !material.inside) {
989
+ ${hasCoatNormals ? /* wgsl */ `let coatViewCosine = select(viewCosine, max(prepared.coatViewLocal.z, 0.0), material.coatNormalEnabled);` : ''}
990
+ let kp = gi(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
991
+ prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kp;
992
+ prepared.coatBaseScale = cC(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
993
+ * (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kp) * gV(prepared);
994
+ }
995
+ prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
996
+ * aw(hS);
997
+ prepared.metalMsScale = vec3f(0.0);
998
+ prepared.metalMsFactor = 0.0;
999
+ prepared.metalMsProbability = 0.0;
1000
+
1001
+
1002
+ if (material.specularRoughness >= 0.04 && prepared.weights[OPENPBR_LOBE_METAL] > 0.0) {
1003
+ let hI = bP(material.baseWeight * material.baseColor, material.specularColor);
1004
+ prepared.metalMsScale = material.specularWeight * hI * hI;
1005
+ let pJ = bH(prepared.specularAlpha, viewCosine);
1006
+ prepared.metalMsFactor = pJ / max(cu(prepared.specularAlpha), 1e-12);
1007
+ let ff = prepared.weights[OPENPBR_LOBE_METAL] * aw(prepared.metalMsScale) * pJ;
1008
+ prepared.probabilities[OPENPBR_LOBE_METAL] += ff;
1009
+ prepared.metalMsProbability = ff / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1010
+ }
1011
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
1012
+ * aw(ft);
1013
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1014
+ * (1.0 - eL)
1015
+ * aw(gH);
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+ prepared.dielectricMsReflectionScale = vec3f(0.0);
1023
+ prepared.dielectricMsTransmissionScale = vec3f(0.0);
1024
+ prepared.dielectricMsViewLoss = 0.0;
1025
+ prepared.dielectricMsReflectionRatio = 0.0;
1026
+ prepared.dielectricMsProbability = 0.0;
1027
+ if (!material.thinWalled && material.transmissionWeight > 0.0 &&
1028
+ prepared.specularAlpha >= 0.0016 && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 &&
1029
+ abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6) {
1030
+ let lq = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
1031
+ prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * lq;
1032
+ prepared.dielectricMsTransmissionScale = gH * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1033
+ + vec3f(prepared.weights[OPENPBR_LOBE_SUBSURFACE]);
1034
+ prepared.dielectricMsReflectionRatio = ch(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
1035
+ prepared.dielectricMsViewLoss = bO(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
1036
+ let nI = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
1037
+ let ff = aw(nI) * prepared.dielectricMsViewLoss;
1038
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += ff;
1039
+ prepared.dielectricMsProbability = ff / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1040
+ }
1041
+ prepared.probabilities[OPENPBR_LOBE_DIFFUSE] = prepared.weights[OPENPBR_LOBE_DIFFUSE]
1042
+ * aw(prepared.diffuseColor)
1043
+ * prepared.diffuseSpecularEnergyCompensation;
1044
+ prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] = prepared.weights[OPENPBR_LOBE_SUBSURFACE]
1045
+ * (1.0 - eL)
1046
+ * aw(material.subsurfaceColor)
1047
+ * prepared.diffuseSpecularEnergyCompensation;
1048
+
1049
+
1050
+ if (material.coatWeight > 0.0 && HAS_THIN_FILM && material.thinFilmWeight > 0.0) {
1051
+ let kW = 0.02 * bN(material.thinFilmThickness, material.thinFilmWeight);
1052
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * kW);
1053
+ prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * kW);
1054
+ }
1055
+ if (material.coatWeight > 0.0 && !material.inside) {
1056
+ let gm = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
1057
+ prepared.probabilities[OPENPBR_LOBE_METAL] *= gm;
1058
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gm;
1059
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gm;
1060
+ prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gm;
1061
+ prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gm;
1062
+ }
1063
+ dQ(&prepared);
1064
+ return prepared;
1065
+ }
1066
+
1067
+
1068
+ fn cR(prepared: ag, au: f32, reflection: bool) -> f32 {
1069
+ if (prepared.material.coatWeight <= 0.0) {
1070
+ return af(au, prepared.material.relativeIor);
1071
+ }
1072
+ let kg = af(au, prepared.transmissionReflectionIor);
1073
+ if (!reflection) { return kg; }
1074
+ let mU = af(au, 1.0 / prepared.specularEtaTOverEtaI);
1075
+ let rC = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
1076
+ return mix(mU, kg, rC);
1077
+ }
1078
+
1079
+ fn mq(
1080
+ prepared: ag,
1081
+ lightDirection: vec3f,
1082
+ gI: i32,
1083
+ pdf: ptr<function, f32>
1084
+ ) -> vec3f {
1085
+ let material = prepared.material;
1086
+ let viewLocal = prepared.viewLocal;
1087
+ let lightLocal = openpbr_to_local(prepared.basis, lightDirection);
1088
+ let reflection = lightLocal.z * viewLocal.z > 0.0;
1089
+ ${hasCoatNormals ? /* wgsl */ `
1090
+ let independentCoat = material.coatNormalEnabled;
1091
+ let geometricReflection = dot(material.geometricNormal, lightDirection) > 0.0;
1092
+ let coatLightCosine = dot(prepared.coatBasis.normal, lightDirection);
1093
+ let coatReflection = geometricReflection && prepared.coatViewLocal.z > 0.0 && coatLightCosine > 0.0;
1094
+ ` : ''}
1095
+
1096
+ var V: vec3f;
1097
+ if (reflection) {
1098
+ V = normalize(lightLocal + viewLocal);
1099
+ }
1100
+ else {
1101
+ V = normalize(lightLocal + viewLocal * material.relativeIor);
1102
+ }
1103
+ if (V.z < 0.0) {
1104
+ V = -V;
1105
+ }
1106
+
1107
+ var response = vec3f(0.0);
1108
+ *pdf = 0.0;
1109
+ var aH = 0.0;
1110
+ let lQ = gI < 0;
1111
+ let uz = lQ || gI == OPENPBR_LOBE_FUZZ;
1112
+ let sQ = lQ || gI == OPENPBR_LOBE_COAT;
1113
+ let rT = lQ || gI == OPENPBR_LOBE_METAL;
1114
+ let pT = lQ || gI == OPENPBR_LOBE_SPECULAR;
1115
+ let jz = lQ ||
1116
+ gI == OPENPBR_LOBE_TRANSMISSION;
1117
+ let sV = lQ || gI == OPENPBR_LOBE_DIFFUSE;
1118
+ let oI = lQ ||
1119
+ gI == OPENPBR_LOBE_SUBSURFACE;
1120
+ let bQ = abs(dot(viewLocal, V));
1121
+
1122
+
1123
+
1124
+ var dd = V;
1125
+ var jg = bQ;
1126
+ if (!reflection && material.thinWalled) {
1127
+ dd = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
1128
+ if (dd.z < 0.0) { dd = -dd; }
1129
+ jg = abs(dot(viewLocal, dd));
1130
+ }
1131
+ let lZ =
1132
+ (reflection && prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0 && pT) ||
1133
+ (!reflection && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 && jz);
1134
+ let pX = reflection && prepared.weights[OPENPBR_LOBE_METAL] > 0.0 && rT;
1135
+ var nj: array<vec3f, 2>;
1136
+ if (lZ) {
1137
+ nj[0] = vec3f(cR(prepared, jg, reflection));
1138
+ }
1139
+ if (pX) {
1140
+ nj[1] = dT(bQ, material.baseWeight * material.baseColor, material.specularColor);
1141
+ }
1142
+ if (HAS_THIN_FILM && material.thinFilmWeight > 0.0) {
1143
+ let wavelengths = vec3f(620.0, 540.0, 450.0);
1144
+
1145
+ for (var kH = 0u; kH < (rtUniform.loopUnrollGuard >> 1u); kH++) {
1146
+ if (!select(lZ, pX, kH == 1u)) { continue; }
1147
+ var wb = vec3f(0.0);
1148
+ let L = select(jg, bQ, kH == 1u);
1149
+ for (var channel = 0u; channel + 1u < rtUniform.loopUnrollGuard; channel++) {
1150
+ var ior = vec2f(prepared.thinFilmBaseIor, 0.0);
1151
+ if (kH == 1u) {
1152
+ ior = cQ(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
1153
+ }
1154
+ wb[channel] = ar(L,
1155
+ wavelengths[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
1156
+ }
1157
+ nj[kH] = mix(nj[kH], wb,
1158
+ bN(material.thinFilmThickness, material.thinFilmWeight));
1159
+ }
1160
+ }
1161
+ let ei = nj[0];
1162
+ let diffuseSpecularEnergyCompensation =
1163
+ prepared.diffuseSpecularEnergyCompensation
1164
+ * aI(
1165
+ prepared.specularEtaTOverEtaI,
1166
+ prepared.specularAlpha,
1167
+ abs(lightLocal.z)
1168
+ );
1169
+
1170
+ ${hasCoatNormals ? /* wgsl */ `
1171
+
1172
+ if (!independentCoat || (lightLocal.z != 0.0 && reflection == geometricReflection)) {
1173
+ ` : ''}
1174
+ if (reflection) {
1175
+ if (prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0 && sV) {
1176
+ response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * cD(
1177
+ material,
1178
+ prepared.diffuseColor,
1179
+ viewLocal,
1180
+ lightLocal,
1181
+ diffuseSpecularEnergyCompensation,
1182
+ &aH
1183
+ );
1184
+ *pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * aH;
1185
+ }
1186
+
1187
+ if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 && material.thinWalled &&
1188
+ oI) {
1189
+ response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * cD(
1190
+ material,
1191
+ material.subsurfaceColor,
1192
+ viewLocal,
1193
+ lightLocal,
1194
+ diffuseSpecularEnergyCompensation,
1195
+ &aH
1196
+ );
1197
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * aH;
1198
+ }
1199
+
1200
+ if (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0 && pT) {
1201
+ var cr = ei;
1202
+ if (material.thinWalled) {
1203
+ cr = aP(
1204
+ cr,
1205
+ material.transmissionWeight
1206
+ );
1207
+ }
1208
+ let cK = material.specularColor * cr;
1209
+ response += prepared.weights[OPENPBR_LOBE_SPECULAR] * am(
1210
+ material,
1211
+ viewLocal,
1212
+ lightLocal,
1213
+ V,
1214
+ cK,
1215
+ &aH
1216
+ );
1217
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * aH;
1218
+ }
1219
+
1220
+ if (prepared.weights[OPENPBR_LOBE_METAL] > 0.0 && rT) {
1221
+ let cK = material.specularWeight * nj[1];
1222
+ response += prepared.weights[OPENPBR_LOBE_METAL] * am(
1223
+ material,
1224
+ viewLocal,
1225
+ lightLocal,
1226
+ V,
1227
+ cK,
1228
+ &aH
1229
+ );
1230
+ if (prepared.metalMsFactor > 0.0) {
1231
+ let dW = min(prepared.metalMsFactor * bH(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
1232
+ response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * dW * INVPI;
1233
+ aH = mix(aH, 0.5 * INVPI, prepared.metalMsProbability);
1234
+ }
1235
+ *pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * aH;
1236
+ }
1237
+ }
1238
+ else {
1239
+ let cK = ei;
1240
+ if (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 && jz) {
1241
+ if (material.thinWalled) {
1242
+ let kM = vec3f(lightLocal.xy, -lightLocal.z);
1243
+ let gf = aP(
1244
+ ei,
1245
+ 1.0
1246
+ );
1247
+ let tint = bG(
1248
+ material,
1249
+ abs(viewLocal.z),
1250
+ prepared.refractionEtaTOverEtaI
1251
+ );
1252
+ response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1253
+ * am(
1254
+ material,
1255
+ viewLocal,
1256
+ kM,
1257
+ dd,
1258
+ tint * (vec3f(1.0) - gf),
1259
+ &aH
1260
+ );
1261
+ }
1262
+ else {
1263
+ response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1264
+ * dk(
1265
+ material,
1266
+ material.relativeIor,
1267
+ bn(material),
1268
+ viewLocal,
1269
+ lightLocal,
1270
+ V,
1271
+ cK,
1272
+ &aH
1273
+ );
1274
+ }
1275
+ if (prepared.dielectricMsProbability > 0.0) {
1276
+ aH *= 1.0 - prepared.dielectricMsProbability;
1277
+ }
1278
+ *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * aH;
1279
+ }
1280
+ if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 && oI) {
1281
+ if (material.thinWalled) {
1282
+ let nT = vec3f(lightLocal.xy, -lightLocal.z);
1283
+ response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
1284
+ * cD(
1285
+ material,
1286
+ material.subsurfaceColor,
1287
+ viewLocal,
1288
+ nT,
1289
+ diffuseSpecularEnergyCompensation,
1290
+ &aH
1291
+ );
1292
+ aH *= 0.5;
1293
+ }
1294
+ else {
1295
+ response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dL(
1296
+ material,
1297
+ viewLocal,
1298
+ lightLocal,
1299
+ &aH
1300
+ );
1301
+ }
1302
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * aH;
1303
+ }
1304
+ }
1305
+
1306
+
1307
+
1308
+
1309
+ if (prepared.dielectricMsProbability > 0.0 && jz) {
1310
+ let au = abs(lightLocal.z);
1311
+ if (au > 0.0) {
1312
+ let ior = select(1.0 / prepared.refractionEtaTOverEtaI, prepared.refractionEtaTOverEtaI, reflection);
1313
+ let iU = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
1314
+ let td = prepared.dielectricMsViewLoss * bO(ior, prepared.specularAlpha, au)
1315
+ / max(cO(ior, prepared.specularAlpha), 1e-12);
1316
+ let dW = min(td * iU, 1.0 / au);
1317
+ let scale = select(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, reflection);
1318
+ response += scale * dW * INVPI;
1319
+ *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * iU * 0.5 * INVPI;
1320
+ }
1321
+ }
1322
+
1323
+ ${hasCoatNormals ? /* wgsl */ ` } ` : ''}
1324
+ if (material.coatWeight > 0.0) {
1325
+ response *= ds(prepared, ${hasCoatNormals ? 'select(lightLocal.z, coatLightCosine, independentCoat)' : 'lightLocal.z'});
1326
+ }
1327
+ ${hasCoatNormals ? /* wgsl */ `
1328
+
1329
+ if (independentCoat) { response *= abs(lightLocal.z); }
1330
+ ` : ''}
1331
+
1332
+ ${hasAnisotropyDirections ? /* wgsl */ `
1333
+ if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_COAT] > 0.0) {
1334
+ var dH = viewLocal;
1335
+ var kt = lightLocal;
1336
+ var gq = V;
1337
+ var jD = bQ;
1338
+ if (prepared.directionFrames) {
1339
+ dH = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
1340
+ kt = openpbr_to_local(prepared.coatBasis, lightDirection);
1341
+ gq = normalize(kt + dH);
1342
+ if (gq.z < 0.0) { gq = -gq; }
1343
+ jD = abs(dot(dH, gq));
1344
+ }
1345
+
1346
+ let kU = vec3f(af(
1347
+ jD,
1348
+ 1.0 / material.coatIor
1349
+ ));
1350
+ var dG = material;
1351
+ let jp = aJ(material.coatRoughness, material.coatAnisotropy);
1352
+ dG.alphaX = jp.x;
1353
+ dG.alphaY = jp.y;
1354
+ if (sQ) {
1355
+ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * am(
1356
+ dG,
1357
+ dH,
1358
+ kt,
1359
+ gq,
1360
+ kU,
1361
+ &aH
1362
+ );
1363
+ *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aH;
1364
+ }
1365
+ }
1366
+ ` : /* wgsl */ `
1367
+ if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_COAT] > 0.0) {
1368
+ let kU = vec3f(af(
1369
+ bQ,
1370
+ 1.0 / material.coatIor
1371
+ ));
1372
+ var dG = material;
1373
+ let jp = aJ(material.coatRoughness, material.coatAnisotropy);
1374
+ dG.alphaX = jp.x;
1375
+ dG.alphaY = jp.y;
1376
+ if (sQ) {
1377
+ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * am(
1378
+ dG,
1379
+ viewLocal,
1380
+ lightLocal,
1381
+ V,
1382
+ kU,
1383
+ &aH
1384
+ );
1385
+ *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aH;
1386
+ }
1387
+ }
1388
+ `}
1389
+
1390
+ if (${hasCoatNormals ? 'select(reflection, geometricReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_FUZZ] > 0.0) {
1391
+ let qn = aO(
1392
+ abs(viewLocal.z),
1393
+ material.fuzzRoughness
1394
+ );
1395
+ response *= max(
1396
+ vec3f(0.0),
1397
+ vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * qn)
1398
+ );
1399
+ if (uz) {
1400
+ response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * jP(
1401
+ material,
1402
+ viewLocal,
1403
+ lightLocal,
1404
+ &aH
1405
+ );
1406
+ *pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * aH;
1407
+ }
1408
+ }
1409
+
1410
+ return response * ${hasCoatNormals ? 'select(abs(lightLocal.z), 1.0, independentCoat)' : 'abs(lightLocal.z)'};
1411
+ }
1412
+
1413
+ fn bI(
1414
+ prepared: ag,
1415
+ lightDirection: vec3f,
1416
+ pdf: ptr<function, f32>
1417
+ ) -> vec3f {
1418
+ return mq(prepared, lightDirection, -1, pdf);
1419
+ }
1420
+
1421
+
1422
+
1423
+
1424
+
1425
+ fn qU(
1426
+ tangent: vec3f,
1427
+ material: J,
1428
+ bF: vec3f,
1429
+ normal: vec3f,
1430
+ lightDirection: vec3f,
1431
+ pdf: ptr<function, f32>
1432
+ ) -> vec3f {
1433
+ let prepared = eG(
1434
+ tangent,
1435
+ material,
1436
+ bF,
1437
+ normal
1438
+ );
1439
+ return bI(prepared, lightDirection, pdf);
1440
+ }
1441
+
1442
+
1443
+
1444
+
1445
+
1446
+ fn mV(
1447
+ prepared: ag, cl: vec3f,
1448
+ lightDirection: ptr<function, vec3f>, isTransmissionEvent: ptr<function, bool>,
1449
+ aA: ptr<function, f32>, aT: ptr<function, bool>,
1450
+ bE: ptr<function, bool>, aR: ptr<function, u32>
1451
+ ) -> bool {
1452
+ let material = prepared.material;
1453
+ let viewLocal = prepared.viewLocal;
1454
+ var cx = cl.x;
1455
+ let fp = cl.y;
1456
+ let bm = cl.z;
1457
+ *isTransmissionEvent = false;
1458
+ *aA = 1.0;
1459
+ *aT = false;
1460
+ *bE = false;
1461
+ *aR = u32(OPENPBR_LOBE_DIFFUSE);
1462
+ *lightDirection = prepared.basis.normal;
1463
+
1464
+ var cdf: array<f32, OPENPBR_LOBE_COUNT>;
1465
+ cdf[OPENPBR_LOBE_FUZZ] = prepared.probabilities[OPENPBR_LOBE_FUZZ];
1466
+ let nr = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
1467
+ for (var hR = 1; hR < nr; hR++) {
1468
+ cdf[hR] = cdf[hR - 1] + prepared.probabilities[hR];
1469
+ }
1470
+ if (cdf[OPENPBR_LOBE_SUBSURFACE] <= 0.0) {
1471
+ return false;
1472
+ }
1473
+
1474
+ var lightLocal: vec3f;
1475
+ if (bm < cdf[OPENPBR_LOBE_FUZZ] || (
1476
+ bm >= cdf[OPENPBR_LOBE_TRANSMISSION] && bm < cdf[OPENPBR_LOBE_DIFFUSE]
1477
+ )) {
1478
+ let pv = bm < cdf[OPENPBR_LOBE_FUZZ];
1479
+ *aA = select(
1480
+ 1.0,
1481
+ material.fuzzRoughness,
1482
+ pv
1483
+ );
1484
+ *bE = !pv;
1485
+ *aR = select(
1486
+ u32(OPENPBR_LOBE_DIFFUSE),
1487
+ u32(OPENPBR_LOBE_FUZZ),
1488
+ pv
1489
+ );
1490
+ lightLocal = bi(vec2f(cx, fp));
1491
+ }
1492
+ ${hasAnisotropyDirections ? /* wgsl */ `
1493
+ else if (bm < cdf[OPENPBR_LOBE_COAT]) {
1494
+ *aA = material.coatRoughness;
1495
+ *aT = true;
1496
+ *aR = u32(OPENPBR_LOBE_COAT);
1497
+ var dH = viewLocal;
1498
+ if (prepared.directionFrames) { dH = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, material.coatNormalEnabled)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'}; }
1499
+ var V = aQ(
1500
+ dH,
1501
+
1502
+ aJ(material.coatRoughness, material.coatAnisotropy),
1503
+ vec2f(cx, fp)
1504
+ );
1505
+ if (V.z < 0.0) {
1506
+ V = -V;
1507
+ }
1508
+ lightLocal = normalize(reflect(-dH, V));
1509
+ ${hasCoatNormals ? /* wgsl */ `
1510
+ if (material.coatNormalEnabled) {
1511
+
1512
+ *lightDirection = openpbr_to_world(prepared.coatBasis, lightLocal);
1513
+ return lightLocal.z > 0.0 && dot(material.geometricNormal, *lightDirection) > 0.0;
1514
+ }
1515
+ ` : ''}
1516
+ if (prepared.directionFrames) { lightLocal = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.coatBasis, lightLocal)); }
1517
+ }
1518
+ ` : /* wgsl */ `
1519
+ else if (bm < cdf[OPENPBR_LOBE_COAT]) {
1520
+ *aA = material.coatRoughness;
1521
+ *aT = true;
1522
+ *aR = u32(OPENPBR_LOBE_COAT);
1523
+ var V = aQ(
1524
+ viewLocal,
1525
+
1526
+ aJ(material.coatRoughness, material.coatAnisotropy),
1527
+ vec2f(cx, fp)
1528
+ );
1529
+ if (V.z < 0.0) {
1530
+ V = -V;
1531
+ }
1532
+ lightLocal = normalize(reflect(-viewLocal, V));
1533
+ }
1534
+ `}
1535
+ else if (bm < cdf[OPENPBR_LOBE_SPECULAR]) {
1536
+ *aA = material.specularRoughness;
1537
+ *aT = true;
1538
+ *aR = select(
1539
+ u32(OPENPBR_LOBE_SPECULAR),
1540
+ u32(OPENPBR_LOBE_METAL),
1541
+ bm < cdf[OPENPBR_LOBE_METAL]
1542
+ );
1543
+ let tg = bm < cdf[OPENPBR_LOBE_METAL];
1544
+ let rw = (bm - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1545
+ if (tg && rw < prepared.metalMsProbability) {
1546
+ let z = cx;
1547
+ let fi = sqrt(max(0.0, 1.0 - z * z));
1548
+ let br = TWOPI * fp;
1549
+ lightLocal = vec3f(fi * cos(br), fi * sin(br), z);
1550
+ }
1551
+ else {
1552
+ var V = aQ(
1553
+ viewLocal,
1554
+ vec2f(material.alphaX, material.alphaY),
1555
+ vec2f(cx, fp)
1556
+ );
1557
+ if (V.z < 0.0) {
1558
+ V = -V;
1559
+ }
1560
+ lightLocal = normalize(reflect(-viewLocal, V));
1561
+ }
1562
+ }
1563
+ else if (bm < cdf[OPENPBR_LOBE_TRANSMISSION]) {
1564
+ *aA = material.specularRoughness;
1565
+ *aT = true;
1566
+ *isTransmissionEvent = true;
1567
+ *aR = u32(OPENPBR_LOBE_TRANSMISSION);
1568
+
1569
+
1570
+ let ue = (bm - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1571
+ if (prepared.dielectricMsProbability > 0.0 && ue < prepared.dielectricMsProbability) {
1572
+ let iU = prepared.dielectricMsReflectionRatio;
1573
+ let lM = cx < iU;
1574
+ var z: f32;
1575
+ if (lM) { z = min(cx / iU, 0.99999994); }
1576
+ else { z = -min((cx - iU) / (1.0 - iU), 0.99999994); }
1577
+ let fi = sqrt(max(0.0, 1.0 - z * z));
1578
+ let br = TWOPI * fp;
1579
+ lightLocal = vec3f(fi * cos(br), fi * sin(br), z);
1580
+ *isTransmissionEvent = !lM;
1581
+ *aR = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), lM);
1582
+ }
1583
+ else {
1584
+ var V = aQ(
1585
+ viewLocal,
1586
+ vec2f(material.alphaX, material.alphaY),
1587
+ vec2f(cx, fp)
1588
+ );
1589
+ if (V.z < 0.0) {
1590
+ V = -V;
1591
+ }
1592
+ if (material.thinWalled) {
1593
+ let hW = normalize(reflect(-viewLocal, V));
1594
+ lightLocal = vec3f(hW.xy, -hW.z);
1595
+ }
1596
+ else {
1597
+ lightLocal = refract(
1598
+ -viewLocal,
1599
+ V,
1600
+ prepared.material.relativeIor
1601
+ );
1602
+ if (dot(lightLocal, lightLocal) <= 1e-8) {
1603
+ *isTransmissionEvent = false;
1604
+ return false;
1605
+ }
1606
+ lightLocal = normalize(lightLocal);
1607
+ }
1608
+ }
1609
+ }
1610
+ else {
1611
+ *aA = 1.0;
1612
+ *bE = true;
1613
+ *isTransmissionEvent = true;
1614
+ *aR = u32(OPENPBR_LOBE_SUBSURFACE);
1615
+ if (material.thinWalled) {
1616
+ let pH = cx >= 0.5;
1617
+ if (pH) {
1618
+ cx = (cx - 0.5) * 2.0;
1619
+ }
1620
+ else {
1621
+ cx *= 2.0;
1622
+ }
1623
+ lightLocal = bi(vec2f(cx, fp));
1624
+ if (pH) {
1625
+ lightLocal.z = -lightLocal.z;
1626
+ }
1627
+ else {
1628
+ *isTransmissionEvent = false;
1629
+ }
1630
+ }
1631
+ else {
1632
+ lightLocal = bi(vec2f(cx, fp));
1633
+ lightLocal.z = -lightLocal.z;
1634
+ }
1635
+ }
1636
+
1637
+ *lightDirection = openpbr_to_world(prepared.basis, lightLocal);
1638
+
1639
+
1640
+
1641
+ if (lightLocal.z == 0.0 || (lightLocal.z < 0.0) != *isTransmissionEvent) {
1642
+ return false;
1643
+ }
1644
+ ${hasCoatNormals ? /* wgsl */ `
1645
+ if (material.coatNormalEnabled &&
1646
+ ((dot(material.geometricNormal, *lightDirection) <= 0.0) != *isTransmissionEvent)) { return false; }
1647
+ ` : ''}
1648
+ return true;
1649
+ }
1650
+
1651
+ fn dv(
1652
+ prepared: ag,
1653
+ cl: vec3f,
1654
+ lightDirection: ptr<function, vec3f>,
1655
+ pdf: ptr<function, f32>,
1656
+ isTransmissionEvent: ptr<function, bool>,
1657
+ aA: ptr<function, f32>,
1658
+ aT: ptr<function, bool>,
1659
+ bE: ptr<function, bool>,
1660
+ aR: ptr<function, u32>,
1661
+ la: ptr<function, f32>,
1662
+ gR: ptr<function, vec3f>
1663
+ ) -> vec3f {
1664
+ *pdf = 0.0;
1665
+ *la = 0.0;
1666
+ *gR = vec3f(0.0);
1667
+
1668
+
1669
+
1670
+
1671
+ if (!prepared.material.thinWalled &&
1672
+ abs(prepared.material.relativeIor - 1.0) <= 1e-6 &&
1673
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6) {
1674
+ *lightDirection = openpbr_to_world(
1675
+ prepared.basis,
1676
+ -prepared.viewLocal
1677
+ );
1678
+ let nu = bn(prepared.material)
1679
+ * ds(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
1680
+ *pdf = 1.0;
1681
+ *la = 1.0;
1682
+ *gR = nu;
1683
+ *isTransmissionEvent = true;
1684
+ *aA = 0.0;
1685
+ *aT = true;
1686
+ *bE = false;
1687
+ *aR = u32(OPENPBR_LOBE_TRANSMISSION);
1688
+ return nu;
1689
+ }
1690
+ if (!mV(prepared, cl, lightDirection,
1691
+ isTransmissionEvent, aA, aT,
1692
+ bE, aR)) { return vec3f(0.0); }
1693
+ let response = bI(prepared, *lightDirection, pdf);
1694
+ *la = *pdf;
1695
+ *gR = response;
1696
+ return response;
1697
+ }
1698
+
1699
+ fn su(
1700
+ tangent: vec3f,
1701
+ material: J,
1702
+ cl: vec3f,
1703
+ bF: vec3f,
1704
+ normal: vec3f,
1705
+ lightDirection: ptr<function, vec3f>,
1706
+ pdf: ptr<function, f32>,
1707
+ isTransmissionEvent: ptr<function, bool>,
1708
+ aA: ptr<function, f32>,
1709
+ aT: ptr<function, bool>,
1710
+ bE: ptr<function, bool>,
1711
+ aR: ptr<function, u32>,
1712
+ la: ptr<function, f32>
1713
+ ) -> vec3f {
1714
+ let prepared = eG(
1715
+ tangent,
1716
+ material,
1717
+ bF,
1718
+ normal
1719
+ );
1720
+ var gR = vec3f(0.0);
1721
+ return dv(
1722
+ prepared,
1723
+ cl,
1724
+ lightDirection,
1725
+ pdf,
1726
+ isTransmissionEvent,
1727
+ aA,
1728
+ aT,
1729
+ bE,
1730
+ aR,
1731
+ la,
1732
+ &gR
1733
+ );
1734
+ }`;
1735
+ }
1736
+ export default createOpenPbrBsdfWgsl();
1737
+ //# sourceMappingURL=openPbrBsdf.wgsl.js.map