@meimu/mutracer 0.0.0-stage → 0.1.0

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