@luma.gl/shaders 0.0.0-stage → 10.0.0-alpha.11

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 (765) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +25 -2
  3. package/dist/dist.dev.js +21598 -0
  4. package/dist/dist.min.js +13439 -0
  5. package/dist/glsl.cjs +33 -0
  6. package/dist/glsl.cjs.map +6 -0
  7. package/dist/glsl.d.ts +6 -0
  8. package/dist/glsl.d.ts.map +1 -0
  9. package/dist/glsl.js +7 -0
  10. package/dist/glsl.js.map +1 -0
  11. package/dist/index.cjs +278 -0
  12. package/dist/index.cjs.map +6 -0
  13. package/dist/index.d.ts +108 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +74 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/color/normalize-byte-colors.cjs +50 -0
  18. package/dist/lib/color/normalize-byte-colors.d.ts +23 -0
  19. package/dist/lib/color/normalize-byte-colors.d.ts.map +1 -0
  20. package/dist/lib/color/normalize-byte-colors.js +42 -0
  21. package/dist/lib/color/normalize-byte-colors.js.map +1 -0
  22. package/dist/lib/filters/prop-types.cjs +90 -0
  23. package/dist/lib/filters/prop-types.d.ts +44 -0
  24. package/dist/lib/filters/prop-types.d.ts.map +1 -0
  25. package/dist/lib/filters/prop-types.js +96 -0
  26. package/dist/lib/filters/prop-types.js.map +1 -0
  27. package/dist/lib/glsl-shader-assembler.cjs +50 -0
  28. package/dist/lib/glsl-shader-assembler.d.ts +19 -0
  29. package/dist/lib/glsl-shader-assembler.d.ts.map +1 -0
  30. package/dist/lib/glsl-shader-assembler.js +29 -0
  31. package/dist/lib/glsl-shader-assembler.js.map +1 -0
  32. package/dist/lib/glsl-utils/get-shader-info.cjs +52 -0
  33. package/dist/lib/glsl-utils/get-shader-info.d.ts +9 -0
  34. package/dist/lib/glsl-utils/get-shader-info.d.ts.map +1 -0
  35. package/dist/lib/glsl-utils/get-shader-info.js +33 -0
  36. package/dist/lib/glsl-utils/get-shader-info.js.map +1 -0
  37. package/dist/lib/glsl-utils/shader-utils.cjs +126 -0
  38. package/dist/lib/glsl-utils/shader-utils.d.ts +23 -0
  39. package/dist/lib/glsl-utils/shader-utils.d.ts.map +1 -0
  40. package/dist/lib/glsl-utils/shader-utils.js +92 -0
  41. package/dist/lib/glsl-utils/shader-utils.js.map +1 -0
  42. package/dist/lib/preprocessor/preprocessor.cjs +128 -0
  43. package/dist/lib/preprocessor/preprocessor.d.ts +15 -0
  44. package/dist/lib/preprocessor/preprocessor.d.ts.map +1 -0
  45. package/dist/lib/preprocessor/preprocessor.js +120 -0
  46. package/dist/lib/preprocessor/preprocessor.js.map +1 -0
  47. package/dist/lib/shader-assembler-base.cjs +132 -0
  48. package/dist/lib/shader-assembler-base.d.ts +51 -0
  49. package/dist/lib/shader-assembler-base.d.ts.map +1 -0
  50. package/dist/lib/shader-assembler-base.js +127 -0
  51. package/dist/lib/shader-assembler-base.js.map +1 -0
  52. package/dist/lib/shader-assembler.cjs +33 -0
  53. package/dist/lib/shader-assembler.d.ts +4 -0
  54. package/dist/lib/shader-assembler.d.ts.map +1 -0
  55. package/dist/lib/shader-assembler.js +7 -0
  56. package/dist/lib/shader-assembler.js.map +1 -0
  57. package/dist/lib/shader-assembly/assemble-glsl-shaders.cjs +181 -0
  58. package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts +70 -0
  59. package/dist/lib/shader-assembly/assemble-glsl-shaders.d.ts.map +1 -0
  60. package/dist/lib/shader-assembly/assemble-glsl-shaders.js +208 -0
  61. package/dist/lib/shader-assembly/assemble-glsl-shaders.js.map +1 -0
  62. package/dist/lib/shader-assembly/assemble-shaders.cjs +42 -0
  63. package/dist/lib/shader-assembly/assemble-shaders.d.ts +10 -0
  64. package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -0
  65. package/dist/lib/shader-assembly/assemble-shaders.js +10 -0
  66. package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -0
  67. package/dist/lib/shader-assembly/assemble-wgsl-shaders.cjs +498 -0
  68. package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts +70 -0
  69. package/dist/lib/shader-assembly/assemble-wgsl-shaders.d.ts.map +1 -0
  70. package/dist/lib/shader-assembly/assemble-wgsl-shaders.js +480 -0
  71. package/dist/lib/shader-assembly/assemble-wgsl-shaders.js.map +1 -0
  72. package/dist/lib/shader-assembly/platform-defines.cjs +79 -0
  73. package/dist/lib/shader-assembly/platform-defines.d.ts +4 -0
  74. package/dist/lib/shader-assembly/platform-defines.d.ts.map +1 -0
  75. package/dist/lib/shader-assembly/platform-defines.js +52 -0
  76. package/dist/lib/shader-assembly/platform-defines.js.map +1 -0
  77. package/dist/lib/shader-assembly/platform-info.cjs +15 -0
  78. package/dist/lib/shader-assembly/platform-info.d.ts +20 -0
  79. package/dist/lib/shader-assembly/platform-info.d.ts.map +1 -0
  80. package/dist/lib/shader-assembly/platform-info.js +5 -0
  81. package/dist/lib/shader-assembly/platform-info.js.map +1 -0
  82. package/dist/lib/shader-assembly/shader-assembly-shared.cjs +96 -0
  83. package/dist/lib/shader-assembly/shader-assembly-shared.d.ts +16 -0
  84. package/dist/lib/shader-assembly/shader-assembly-shared.d.ts.map +1 -0
  85. package/dist/lib/shader-assembly/shader-assembly-shared.js +79 -0
  86. package/dist/lib/shader-assembly/shader-assembly-shared.js.map +1 -0
  87. package/dist/lib/shader-assembly/shader-assembly-types.cjs +15 -0
  88. package/dist/lib/shader-assembly/shader-assembly-types.d.ts +132 -0
  89. package/dist/lib/shader-assembly/shader-assembly-types.d.ts.map +1 -0
  90. package/dist/lib/shader-assembly/shader-assembly-types.js +5 -0
  91. package/dist/lib/shader-assembly/shader-assembly-types.js.map +1 -0
  92. package/dist/lib/shader-assembly/shader-injection-targets.cjs +103 -0
  93. package/dist/lib/shader-assembly/shader-injection-targets.d.ts +46 -0
  94. package/dist/lib/shader-assembly/shader-injection-targets.d.ts.map +1 -0
  95. package/dist/lib/shader-assembly/shader-injection-targets.js +83 -0
  96. package/dist/lib/shader-assembly/shader-injection-targets.js.map +1 -0
  97. package/dist/lib/shader-assembly/shader-injections.cjs +204 -0
  98. package/dist/lib/shader-assembly/shader-injections.d.ts +49 -0
  99. package/dist/lib/shader-assembly/shader-injections.d.ts.map +1 -0
  100. package/dist/lib/shader-assembly/shader-injections.js +207 -0
  101. package/dist/lib/shader-assembly/shader-injections.js.map +1 -0
  102. package/dist/lib/shader-assembly/shader-plugin-varyings.cjs +434 -0
  103. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts +15 -0
  104. package/dist/lib/shader-assembly/shader-plugin-varyings.d.ts.map +1 -0
  105. package/dist/lib/shader-assembly/shader-plugin-varyings.js +438 -0
  106. package/dist/lib/shader-assembly/shader-plugin-varyings.js.map +1 -0
  107. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.cjs +254 -0
  108. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts +12 -0
  109. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.d.ts.map +1 -0
  110. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js +237 -0
  111. package/dist/lib/shader-assembly/shader-plugin-vertex-inputs.js.map +1 -0
  112. package/dist/lib/shader-assembly/wgsl-binding-debug.cjs +166 -0
  113. package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts +37 -0
  114. package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts.map +1 -0
  115. package/dist/lib/shader-assembly/wgsl-binding-debug.js +144 -0
  116. package/dist/lib/shader-assembly/wgsl-binding-debug.js.map +1 -0
  117. package/dist/lib/shader-assembly/wgsl-binding-scan.cjs +184 -0
  118. package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts +19 -0
  119. package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts.map +1 -0
  120. package/dist/lib/shader-assembly/wgsl-binding-scan.js +151 -0
  121. package/dist/lib/shader-assembly/wgsl-binding-scan.js.map +1 -0
  122. package/dist/lib/shader-assembly/wgsl-injection-target-names.cjs +163 -0
  123. package/dist/lib/shader-assembly/wgsl-injection-target-names.d.ts +8 -0
  124. package/dist/lib/shader-assembly/wgsl-injection-target-names.d.ts.map +1 -0
  125. package/dist/lib/shader-assembly/wgsl-injection-target-names.js +145 -0
  126. package/dist/lib/shader-assembly/wgsl-injection-target-names.js.map +1 -0
  127. package/dist/lib/shader-assembly/wgsl-interface-scan.cjs +502 -0
  128. package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts +14 -0
  129. package/dist/lib/shader-assembly/wgsl-interface-scan.d.ts.map +1 -0
  130. package/dist/lib/shader-assembly/wgsl-interface-scan.js +498 -0
  131. package/dist/lib/shader-assembly/wgsl-interface-scan.js.map +1 -0
  132. package/dist/lib/shader-generator/generate-shader.cjs +36 -0
  133. package/dist/lib/shader-generator/generate-shader.d.ts +8 -0
  134. package/dist/lib/shader-generator/generate-shader.d.ts.map +1 -0
  135. package/dist/lib/shader-generator/generate-shader.js +15 -0
  136. package/dist/lib/shader-generator/generate-shader.js.map +1 -0
  137. package/dist/lib/shader-generator/glsl/generate-glsl.cjs +94 -0
  138. package/dist/lib/shader-generator/glsl/generate-glsl.d.ts +7 -0
  139. package/dist/lib/shader-generator/glsl/generate-glsl.d.ts.map +1 -0
  140. package/dist/lib/shader-generator/glsl/generate-glsl.js +79 -0
  141. package/dist/lib/shader-generator/glsl/generate-glsl.js.map +1 -0
  142. package/dist/lib/shader-generator/utils/capitalize.cjs +29 -0
  143. package/dist/lib/shader-generator/utils/capitalize.d.ts +7 -0
  144. package/dist/lib/shader-generator/utils/capitalize.d.ts.map +1 -0
  145. package/dist/lib/shader-generator/utils/capitalize.js +12 -0
  146. package/dist/lib/shader-generator/utils/capitalize.js.map +1 -0
  147. package/dist/lib/shader-generator/wgsl/generate-wgsl.cjs +46 -0
  148. package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts +7 -0
  149. package/dist/lib/shader-generator/wgsl/generate-wgsl.d.ts.map +1 -0
  150. package/dist/lib/shader-generator/wgsl/generate-wgsl.js +23 -0
  151. package/dist/lib/shader-generator/wgsl/generate-wgsl.js.map +1 -0
  152. package/dist/lib/shader-module/composite-shader-pass.cjs +15 -0
  153. package/dist/lib/shader-module/composite-shader-pass.d.ts +41 -0
  154. package/dist/lib/shader-module/composite-shader-pass.d.ts.map +1 -0
  155. package/dist/lib/shader-module/composite-shader-pass.js +5 -0
  156. package/dist/lib/shader-module/composite-shader-pass.js.map +1 -0
  157. package/dist/lib/shader-module/shader-module-dependencies.cjs +83 -0
  158. package/dist/lib/shader-module/shader-module-dependencies.d.ts +39 -0
  159. package/dist/lib/shader-module/shader-module-dependencies.d.ts.map +1 -0
  160. package/dist/lib/shader-module/shader-module-dependencies.js +103 -0
  161. package/dist/lib/shader-module/shader-module-dependencies.js.map +1 -0
  162. package/dist/lib/shader-module/shader-module-uniform-layout.cjs +224 -0
  163. package/dist/lib/shader-module/shader-module-uniform-layout.d.ts +91 -0
  164. package/dist/lib/shader-module/shader-module-uniform-layout.d.ts.map +1 -0
  165. package/dist/lib/shader-module/shader-module-uniform-layout.js +253 -0
  166. package/dist/lib/shader-module/shader-module-uniform-layout.js.map +1 -0
  167. package/dist/lib/shader-module/shader-module.cjs +99 -0
  168. package/dist/lib/shader-module/shader-module.d.ts +94 -0
  169. package/dist/lib/shader-module/shader-module.d.ts.map +1 -0
  170. package/dist/lib/shader-module/shader-module.js +101 -0
  171. package/dist/lib/shader-module/shader-module.js.map +1 -0
  172. package/dist/lib/shader-module/shader-pass.cjs +15 -0
  173. package/dist/lib/shader-module/shader-pass.d.ts +48 -0
  174. package/dist/lib/shader-module/shader-pass.d.ts.map +1 -0
  175. package/dist/lib/shader-module/shader-pass.js +5 -0
  176. package/dist/lib/shader-module/shader-pass.js.map +1 -0
  177. package/dist/lib/shader-plugin.cjs +156 -0
  178. package/dist/lib/shader-plugin.d.ts +61 -0
  179. package/dist/lib/shader-plugin.d.ts.map +1 -0
  180. package/dist/lib/shader-plugin.js +147 -0
  181. package/dist/lib/shader-plugin.js.map +1 -0
  182. package/dist/lib/shader-transpiler/shader-transpiler.cjs +15 -0
  183. package/dist/lib/shader-transpiler/shader-transpiler.d.ts +27 -0
  184. package/dist/lib/shader-transpiler/shader-transpiler.d.ts.map +1 -0
  185. package/dist/lib/shader-transpiler/shader-transpiler.js +5 -0
  186. package/dist/lib/shader-transpiler/shader-transpiler.js.map +1 -0
  187. package/dist/lib/shader-transpiler/transpile-glsl-shader.cjs +71 -0
  188. package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts +9 -0
  189. package/dist/lib/shader-transpiler/transpile-glsl-shader.d.ts.map +1 -0
  190. package/dist/lib/shader-transpiler/transpile-glsl-shader.js +69 -0
  191. package/dist/lib/shader-transpiler/transpile-glsl-shader.js.map +1 -0
  192. package/dist/lib/utils/assert.cjs +34 -0
  193. package/dist/lib/utils/assert.d.ts +2 -0
  194. package/dist/lib/utils/assert.d.ts.map +1 -0
  195. package/dist/lib/utils/assert.js +13 -0
  196. package/dist/lib/utils/assert.js.map +1 -0
  197. package/dist/lib/utils/uniform-types.cjs +15 -0
  198. package/dist/lib/utils/uniform-types.d.ts +18 -0
  199. package/dist/lib/utils/uniform-types.d.ts.map +1 -0
  200. package/dist/lib/utils/uniform-types.js +5 -0
  201. package/dist/lib/utils/uniform-types.js.map +1 -0
  202. package/dist/lib/wgsl-shader-assembler.cjs +99 -0
  203. package/dist/lib/wgsl-shader-assembler.d.ts +34 -0
  204. package/dist/lib/wgsl-shader-assembler.d.ts.map +1 -0
  205. package/dist/lib/wgsl-shader-assembler.js +84 -0
  206. package/dist/lib/wgsl-shader-assembler.js.map +1 -0
  207. package/dist/module-injectors.cjs +59 -0
  208. package/dist/module-injectors.d.ts +3 -0
  209. package/dist/module-injectors.d.ts.map +1 -0
  210. package/dist/module-injectors.js +31 -0
  211. package/dist/module-injectors.js.map +1 -0
  212. package/dist/modules/color/float-colors.cjs +275 -0
  213. package/dist/modules/color/float-colors.d.ts +132 -0
  214. package/dist/modules/color/float-colors.d.ts.map +1 -0
  215. package/dist/modules/color/float-colors.js +248 -0
  216. package/dist/modules/color/float-colors.js.map +1 -0
  217. package/dist/modules/engine/clip/clip.cjs +142 -0
  218. package/dist/modules/engine/clip/clip.d.ts +12 -0
  219. package/dist/modules/engine/clip/clip.d.ts.map +1 -0
  220. package/dist/modules/engine/clip/clip.js +119 -0
  221. package/dist/modules/engine/clip/clip.js.map +1 -0
  222. package/dist/modules/engine/filter/filter.cjs +103 -0
  223. package/dist/modules/engine/filter/filter.d.ts +12 -0
  224. package/dist/modules/engine/filter/filter.d.ts.map +1 -0
  225. package/dist/modules/engine/filter/filter.js +80 -0
  226. package/dist/modules/engine/filter/filter.js.map +1 -0
  227. package/dist/modules/engine/geometry/geometry.cjs +63 -0
  228. package/dist/modules/engine/geometry/geometry.d.ts +9 -0
  229. package/dist/modules/engine/geometry/geometry.d.ts.map +1 -0
  230. package/dist/modules/engine/geometry/geometry.js +42 -0
  231. package/dist/modules/engine/geometry/geometry.js.map +1 -0
  232. package/dist/modules/engine/gpu-animation/gpu-animation.cjs +255 -0
  233. package/dist/modules/engine/gpu-animation/gpu-animation.d.ts +34 -0
  234. package/dist/modules/engine/gpu-animation/gpu-animation.d.ts.map +1 -0
  235. package/dist/modules/engine/gpu-animation/gpu-animation.js +228 -0
  236. package/dist/modules/engine/gpu-animation/gpu-animation.js.map +1 -0
  237. package/dist/modules/engine/picking/picking.cjs +210 -0
  238. package/dist/modules/engine/picking/picking.d.ts +77 -0
  239. package/dist/modules/engine/picking/picking.d.ts.map +1 -0
  240. package/dist/modules/engine/picking/picking.js +198 -0
  241. package/dist/modules/engine/picking/picking.js.map +1 -0
  242. package/dist/modules/engine/project/project.cjs +138 -0
  243. package/dist/modules/engine/project/project.d.ts +39 -0
  244. package/dist/modules/engine/project/project.d.ts.map +1 -0
  245. package/dist/modules/engine/project/project.js +129 -0
  246. package/dist/modules/engine/project/project.js.map +1 -0
  247. package/dist/modules/engine/skin/skin.cjs +212 -0
  248. package/dist/modules/engine/skin/skin.d.ts +52 -0
  249. package/dist/modules/engine/skin/skin.d.ts.map +1 -0
  250. package/dist/modules/engine/skin/skin.js +179 -0
  251. package/dist/modules/engine/skin/skin.js.map +1 -0
  252. package/dist/modules/engine/transform/transform.cjs +72 -0
  253. package/dist/modules/engine/transform/transform.d.ts +6 -0
  254. package/dist/modules/engine/transform/transform.d.ts.map +1 -0
  255. package/dist/modules/engine/transform/transform.js +49 -0
  256. package/dist/modules/engine/transform/transform.js.map +1 -0
  257. package/dist/modules/geometry/path-dash/path-dash.cjs +93 -0
  258. package/dist/modules/geometry/path-dash/path-dash.d.ts +10 -0
  259. package/dist/modules/geometry/path-dash/path-dash.d.ts.map +1 -0
  260. package/dist/modules/geometry/path-dash/path-dash.js +66 -0
  261. package/dist/modules/geometry/path-dash/path-dash.js.map +1 -0
  262. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.cjs +117 -0
  263. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts +3 -0
  264. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.d.ts.map +1 -0
  265. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js +87 -0
  266. package/dist/modules/geometry/pattern-fill/pattern-fill-shaders.js.map +1 -0
  267. package/dist/modules/geometry/pattern-fill/pattern-fill.cjs +64 -0
  268. package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts +14 -0
  269. package/dist/modules/geometry/pattern-fill/pattern-fill.d.ts.map +1 -0
  270. package/dist/modules/geometry/pattern-fill/pattern-fill.js +43 -0
  271. package/dist/modules/geometry/pattern-fill/pattern-fill.js.map +1 -0
  272. package/dist/modules/geometry/point-glow/point-glow.cjs +104 -0
  273. package/dist/modules/geometry/point-glow/point-glow.d.ts +11 -0
  274. package/dist/modules/geometry/point-glow/point-glow.d.ts.map +1 -0
  275. package/dist/modules/geometry/point-glow/point-glow.js +77 -0
  276. package/dist/modules/geometry/point-glow/point-glow.js.map +1 -0
  277. package/dist/modules/geometry/precipitation/precipitation.cjs +122 -0
  278. package/dist/modules/geometry/precipitation/precipitation.d.ts +40 -0
  279. package/dist/modules/geometry/precipitation/precipitation.d.ts.map +1 -0
  280. package/dist/modules/geometry/precipitation/precipitation.js +95 -0
  281. package/dist/modules/geometry/precipitation/precipitation.js.map +1 -0
  282. package/dist/modules/geometry/sketch-stroke/sketch-stroke.cjs +158 -0
  283. package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts +60 -0
  284. package/dist/modules/geometry/sketch-stroke/sketch-stroke.d.ts.map +1 -0
  285. package/dist/modules/geometry/sketch-stroke/sketch-stroke.js +137 -0
  286. package/dist/modules/geometry/sketch-stroke/sketch-stroke.js.map +1 -0
  287. package/dist/modules/geospatial/dggs/dggs-wgsl.cjs +2304 -0
  288. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts +3 -0
  289. package/dist/modules/geospatial/dggs/dggs-wgsl.d.ts.map +1 -0
  290. package/dist/modules/geospatial/dggs/dggs-wgsl.js +2283 -0
  291. package/dist/modules/geospatial/dggs/dggs-wgsl.js.map +1 -0
  292. package/dist/modules/geospatial/dggs/dggs.cjs +31 -0
  293. package/dist/modules/geospatial/dggs/dggs.d.ts +6 -0
  294. package/dist/modules/geospatial/dggs/dggs.d.ts.map +1 -0
  295. package/dist/modules/geospatial/dggs/dggs.js +10 -0
  296. package/dist/modules/geospatial/dggs/dggs.js.map +1 -0
  297. package/dist/modules/lighting/area-lighting/area-light-types.cjs +68 -0
  298. package/dist/modules/lighting/area-lighting/area-light-types.d.ts +34 -0
  299. package/dist/modules/lighting/area-lighting/area-light-types.d.ts.map +1 -0
  300. package/dist/modules/lighting/area-lighting/area-light-types.js +40 -0
  301. package/dist/modules/lighting/area-lighting/area-light-types.js.map +1 -0
  302. package/dist/modules/lighting/area-lighting/area-lighting-shaders.cjs +101 -0
  303. package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts +3 -0
  304. package/dist/modules/lighting/area-lighting/area-lighting-shaders.d.ts.map +1 -0
  305. package/dist/modules/lighting/area-lighting/area-lighting-shaders.js +71 -0
  306. package/dist/modules/lighting/area-lighting/area-lighting-shaders.js.map +1 -0
  307. package/dist/modules/lighting/area-lighting/area-lighting.cjs +62 -0
  308. package/dist/modules/lighting/area-lighting/area-lighting.d.ts +89 -0
  309. package/dist/modules/lighting/area-lighting/area-lighting.d.ts.map +1 -0
  310. package/dist/modules/lighting/area-lighting/area-lighting.js +41 -0
  311. package/dist/modules/lighting/area-lighting/area-lighting.js.map +1 -0
  312. package/dist/modules/lighting/area-lighting/ltc-shaders.cjs +192 -0
  313. package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts +3 -0
  314. package/dist/modules/lighting/area-lighting/ltc-shaders.d.ts.map +1 -0
  315. package/dist/modules/lighting/area-lighting/ltc-shaders.js +162 -0
  316. package/dist/modules/lighting/area-lighting/ltc-shaders.js.map +1 -0
  317. package/dist/modules/lighting/atmosphere/atmosphere.cjs +253 -0
  318. package/dist/modules/lighting/atmosphere/atmosphere.d.ts +45 -0
  319. package/dist/modules/lighting/atmosphere/atmosphere.d.ts.map +1 -0
  320. package/dist/modules/lighting/atmosphere/atmosphere.js +228 -0
  321. package/dist/modules/lighting/atmosphere/atmosphere.js.map +1 -0
  322. package/dist/modules/lighting/clouds/clouds.cjs +216 -0
  323. package/dist/modules/lighting/clouds/clouds.d.ts +58 -0
  324. package/dist/modules/lighting/clouds/clouds.d.ts.map +1 -0
  325. package/dist/modules/lighting/clouds/clouds.js +192 -0
  326. package/dist/modules/lighting/clouds/clouds.js.map +1 -0
  327. package/dist/modules/lighting/clustered-light-grid/clustered-light-grid.cjs +40 -0
  328. package/dist/modules/lighting/clustered-light-grid/clustered-light-grid.d.ts +6 -0
  329. package/dist/modules/lighting/clustered-light-grid/clustered-light-grid.d.ts.map +1 -0
  330. package/dist/modules/lighting/clustered-light-grid/clustered-light-grid.js +15 -0
  331. package/dist/modules/lighting/clustered-light-grid/clustered-light-grid.js.map +1 -0
  332. package/dist/modules/lighting/contact-shadow/contact-shadow.cjs +348 -0
  333. package/dist/modules/lighting/contact-shadow/contact-shadow.d.ts +188 -0
  334. package/dist/modules/lighting/contact-shadow/contact-shadow.d.ts.map +1 -0
  335. package/dist/modules/lighting/contact-shadow/contact-shadow.js +307 -0
  336. package/dist/modules/lighting/contact-shadow/contact-shadow.js.map +1 -0
  337. package/dist/modules/lighting/firefly/firefly.cjs +74 -0
  338. package/dist/modules/lighting/firefly/firefly.d.ts +36 -0
  339. package/dist/modules/lighting/firefly/firefly.d.ts.map +1 -0
  340. package/dist/modules/lighting/firefly/firefly.js +53 -0
  341. package/dist/modules/lighting/firefly/firefly.js.map +1 -0
  342. package/dist/modules/lighting/globe-clouds/globe-clouds.cjs +143 -0
  343. package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts +53 -0
  344. package/dist/modules/lighting/globe-clouds/globe-clouds.d.ts.map +1 -0
  345. package/dist/modules/lighting/globe-clouds/globe-clouds.js +119 -0
  346. package/dist/modules/lighting/globe-clouds/globe-clouds.js.map +1 -0
  347. package/dist/modules/lighting/gouraud-material/gouraud-material.cjs +61 -0
  348. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts +12 -0
  349. package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts.map +1 -0
  350. package/dist/modules/lighting/gouraud-material/gouraud-material.js +40 -0
  351. package/dist/modules/lighting/gouraud-material/gouraud-material.js.map +1 -0
  352. package/dist/modules/lighting/height-fog/height-fog-functions.cjs +139 -0
  353. package/dist/modules/lighting/height-fog/height-fog-functions.d.ts +14 -0
  354. package/dist/modules/lighting/height-fog/height-fog-functions.d.ts.map +1 -0
  355. package/dist/modules/lighting/height-fog/height-fog-functions.js +114 -0
  356. package/dist/modules/lighting/height-fog/height-fog-functions.js.map +1 -0
  357. package/dist/modules/lighting/height-fog/height-fog.cjs +104 -0
  358. package/dist/modules/lighting/height-fog/height-fog.d.ts +60 -0
  359. package/dist/modules/lighting/height-fog/height-fog.d.ts.map +1 -0
  360. package/dist/modules/lighting/height-fog/height-fog.js +77 -0
  361. package/dist/modules/lighting/height-fog/height-fog.js.map +1 -0
  362. package/dist/modules/lighting/ibl/ibl.cjs +63 -0
  363. package/dist/modules/lighting/ibl/ibl.d.ts +25 -0
  364. package/dist/modules/lighting/ibl/ibl.d.ts.map +1 -0
  365. package/dist/modules/lighting/ibl/ibl.js +33 -0
  366. package/dist/modules/lighting/ibl/ibl.js.map +1 -0
  367. package/dist/modules/lighting/lambert-material/lambert-material.cjs +54 -0
  368. package/dist/modules/lighting/lambert-material/lambert-material.d.ts +10 -0
  369. package/dist/modules/lighting/lambert-material/lambert-material.d.ts.map +1 -0
  370. package/dist/modules/lighting/lambert-material/lambert-material.js +33 -0
  371. package/dist/modules/lighting/lambert-material/lambert-material.js.map +1 -0
  372. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.cjs +88 -0
  373. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts +3 -0
  374. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts.map +1 -0
  375. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js +60 -0
  376. package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js.map +1 -0
  377. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.cjs +97 -0
  378. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts +2 -0
  379. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.d.ts.map +1 -0
  380. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js +73 -0
  381. package/dist/modules/lighting/lambert-material/lambert-shaders-wgsl.js.map +1 -0
  382. package/dist/modules/lighting/lights/lighting-glsl.cjs +116 -0
  383. package/dist/modules/lighting/lights/lighting-glsl.d.ts +2 -0
  384. package/dist/modules/lighting/lights/lighting-glsl.d.ts.map +1 -0
  385. package/dist/modules/lighting/lights/lighting-glsl.js +92 -0
  386. package/dist/modules/lighting/lights/lighting-glsl.js.map +1 -0
  387. package/dist/modules/lighting/lights/lighting-wgsl.cjs +115 -0
  388. package/dist/modules/lighting/lights/lighting-wgsl.d.ts +2 -0
  389. package/dist/modules/lighting/lights/lighting-wgsl.d.ts.map +1 -0
  390. package/dist/modules/lighting/lights/lighting-wgsl.js +91 -0
  391. package/dist/modules/lighting/lights/lighting-wgsl.js.map +1 -0
  392. package/dist/modules/lighting/lights/lighting.cjs +210 -0
  393. package/dist/modules/lighting/lights/lighting.d.ts +163 -0
  394. package/dist/modules/lighting/lights/lighting.d.ts.map +1 -0
  395. package/dist/modules/lighting/lights/lighting.js +208 -0
  396. package/dist/modules/lighting/lights/lighting.js.map +1 -0
  397. package/dist/modules/lighting/no-material/dirlight.cjs +112 -0
  398. package/dist/modules/lighting/no-material/dirlight.d.ts +33 -0
  399. package/dist/modules/lighting/no-material/dirlight.d.ts.map +1 -0
  400. package/dist/modules/lighting/no-material/dirlight.js +86 -0
  401. package/dist/modules/lighting/no-material/dirlight.js.map +1 -0
  402. package/dist/modules/lighting/pbr-ambient-occlusion/pbr-ambient-occlusion.cjs +87 -0
  403. package/dist/modules/lighting/pbr-ambient-occlusion/pbr-ambient-occlusion.d.ts +21 -0
  404. package/dist/modules/lighting/pbr-ambient-occlusion/pbr-ambient-occlusion.d.ts.map +1 -0
  405. package/dist/modules/lighting/pbr-ambient-occlusion/pbr-ambient-occlusion.js +61 -0
  406. package/dist/modules/lighting/pbr-ambient-occlusion/pbr-ambient-occlusion.js.map +1 -0
  407. package/dist/modules/lighting/pbr-contact-shadow/pbr-contact-shadow.cjs +87 -0
  408. package/dist/modules/lighting/pbr-contact-shadow/pbr-contact-shadow.d.ts +21 -0
  409. package/dist/modules/lighting/pbr-contact-shadow/pbr-contact-shadow.d.ts.map +1 -0
  410. package/dist/modules/lighting/pbr-contact-shadow/pbr-contact-shadow.js +61 -0
  411. package/dist/modules/lighting/pbr-contact-shadow/pbr-contact-shadow.js.map +1 -0
  412. package/dist/modules/lighting/pbr-material/pbr-material-glsl.cjs +1789 -0
  413. package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts +3 -0
  414. package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts.map +1 -0
  415. package/dist/modules/lighting/pbr-material/pbr-material-glsl.js +1767 -0
  416. package/dist/modules/lighting/pbr-material/pbr-material-glsl.js.map +1 -0
  417. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.cjs +2084 -0
  418. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts +3 -0
  419. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts.map +1 -0
  420. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js +2062 -0
  421. package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js.map +1 -0
  422. package/dist/modules/lighting/pbr-material/pbr-material.cjs +315 -0
  423. package/dist/modules/lighting/pbr-material/pbr-material.d.ts +516 -0
  424. package/dist/modules/lighting/pbr-material/pbr-material.d.ts.map +1 -0
  425. package/dist/modules/lighting/pbr-material/pbr-material.js +292 -0
  426. package/dist/modules/lighting/pbr-material/pbr-material.js.map +1 -0
  427. package/dist/modules/lighting/pbr-material/pbr-projection.cjs +63 -0
  428. package/dist/modules/lighting/pbr-material/pbr-projection.d.ts +10 -0
  429. package/dist/modules/lighting/pbr-material/pbr-projection.d.ts.map +1 -0
  430. package/dist/modules/lighting/pbr-material/pbr-projection.js +37 -0
  431. package/dist/modules/lighting/pbr-material/pbr-projection.js.map +1 -0
  432. package/dist/modules/lighting/pbr-material/pbr-scene.cjs +109 -0
  433. package/dist/modules/lighting/pbr-material/pbr-scene.d.ts +52 -0
  434. package/dist/modules/lighting/pbr-material/pbr-scene.d.ts.map +1 -0
  435. package/dist/modules/lighting/pbr-material/pbr-scene.js +83 -0
  436. package/dist/modules/lighting/pbr-material/pbr-scene.js.map +1 -0
  437. package/dist/modules/lighting/pbr-shadow/pbr-shadow.cjs +97 -0
  438. package/dist/modules/lighting/pbr-shadow/pbr-shadow.d.ts +15 -0
  439. package/dist/modules/lighting/pbr-shadow/pbr-shadow.d.ts.map +1 -0
  440. package/dist/modules/lighting/pbr-shadow/pbr-shadow.js +69 -0
  441. package/dist/modules/lighting/pbr-shadow/pbr-shadow.js.map +1 -0
  442. package/dist/modules/lighting/pbr-surface/pbr-surface.cjs +114 -0
  443. package/dist/modules/lighting/pbr-surface/pbr-surface.d.ts +15 -0
  444. package/dist/modules/lighting/pbr-surface/pbr-surface.d.ts.map +1 -0
  445. package/dist/modules/lighting/pbr-surface/pbr-surface.js +88 -0
  446. package/dist/modules/lighting/pbr-surface/pbr-surface.js.map +1 -0
  447. package/dist/modules/lighting/phong-material/phong-material.cjs +61 -0
  448. package/dist/modules/lighting/phong-material/phong-material.d.ts +13 -0
  449. package/dist/modules/lighting/phong-material/phong-material.d.ts.map +1 -0
  450. package/dist/modules/lighting/phong-material/phong-material.js +40 -0
  451. package/dist/modules/lighting/phong-material/phong-material.js.map +1 -0
  452. package/dist/modules/lighting/phong-material/phong-shaders-glsl.cjs +100 -0
  453. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts +3 -0
  454. package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts.map +1 -0
  455. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js +72 -0
  456. package/dist/modules/lighting/phong-material/phong-shaders-glsl.js.map +1 -0
  457. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.cjs +153 -0
  458. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts +2 -0
  459. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.d.ts.map +1 -0
  460. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js +129 -0
  461. package/dist/modules/lighting/phong-material/phong-shaders-wgsl.js.map +1 -0
  462. package/dist/modules/lighting/prefiltered-environment/prefiltered-environment.cjs +379 -0
  463. package/dist/modules/lighting/prefiltered-environment/prefiltered-environment.d.ts +41 -0
  464. package/dist/modules/lighting/prefiltered-environment/prefiltered-environment.d.ts.map +1 -0
  465. package/dist/modules/lighting/prefiltered-environment/prefiltered-environment.js +345 -0
  466. package/dist/modules/lighting/prefiltered-environment/prefiltered-environment.js.map +1 -0
  467. package/dist/modules/lighting/shadow/shadow-glsl.cjs +228 -0
  468. package/dist/modules/lighting/shadow/shadow-glsl.d.ts +3 -0
  469. package/dist/modules/lighting/shadow/shadow-glsl.d.ts.map +1 -0
  470. package/dist/modules/lighting/shadow/shadow-glsl.js +204 -0
  471. package/dist/modules/lighting/shadow/shadow-glsl.js.map +1 -0
  472. package/dist/modules/lighting/shadow/shadow-types.cjs +15 -0
  473. package/dist/modules/lighting/shadow/shadow-types.d.ts +63 -0
  474. package/dist/modules/lighting/shadow/shadow-types.d.ts.map +1 -0
  475. package/dist/modules/lighting/shadow/shadow-types.js +5 -0
  476. package/dist/modules/lighting/shadow/shadow-types.js.map +1 -0
  477. package/dist/modules/lighting/shadow/shadow.cjs +458 -0
  478. package/dist/modules/lighting/shadow/shadow.d.ts +117 -0
  479. package/dist/modules/lighting/shadow/shadow.d.ts.map +1 -0
  480. package/dist/modules/lighting/shadow/shadow.js +450 -0
  481. package/dist/modules/lighting/shadow/shadow.js.map +1 -0
  482. package/dist/modules/lighting/surface-weather/surface-weather.cjs +199 -0
  483. package/dist/modules/lighting/surface-weather/surface-weather.d.ts +54 -0
  484. package/dist/modules/lighting/surface-weather/surface-weather.d.ts.map +1 -0
  485. package/dist/modules/lighting/surface-weather/surface-weather.js +175 -0
  486. package/dist/modules/lighting/surface-weather/surface-weather.js.map +1 -0
  487. package/dist/modules/lighting/unlit-material/unlit-material.cjs +60 -0
  488. package/dist/modules/lighting/unlit-material/unlit-material.d.ts +9 -0
  489. package/dist/modules/lighting/unlit-material/unlit-material.d.ts.map +1 -0
  490. package/dist/modules/lighting/unlit-material/unlit-material.js +40 -0
  491. package/dist/modules/lighting/unlit-material/unlit-material.js.map +1 -0
  492. package/dist/modules/lighting/water-material/river-water-material.cjs +56 -0
  493. package/dist/modules/lighting/water-material/river-water-material.d.ts +21 -0
  494. package/dist/modules/lighting/water-material/river-water-material.d.ts.map +1 -0
  495. package/dist/modules/lighting/water-material/river-water-material.js +36 -0
  496. package/dist/modules/lighting/water-material/river-water-material.js.map +1 -0
  497. package/dist/modules/lighting/water-material/river-water-shaders.cjs +261 -0
  498. package/dist/modules/lighting/water-material/river-water-shaders.d.ts +3 -0
  499. package/dist/modules/lighting/water-material/river-water-shaders.d.ts.map +1 -0
  500. package/dist/modules/lighting/water-material/river-water-shaders.js +233 -0
  501. package/dist/modules/lighting/water-material/river-water-shaders.js.map +1 -0
  502. package/dist/modules/lighting/water-material/water-material.cjs +188 -0
  503. package/dist/modules/lighting/water-material/water-material.d.ts +28 -0
  504. package/dist/modules/lighting/water-material/water-material.d.ts.map +1 -0
  505. package/dist/modules/lighting/water-material/water-material.js +179 -0
  506. package/dist/modules/lighting/water-material/water-material.js.map +1 -0
  507. package/dist/modules/lighting/water-material/water-shaders-glsl.cjs +260 -0
  508. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts +3 -0
  509. package/dist/modules/lighting/water-material/water-shaders-glsl.d.ts.map +1 -0
  510. package/dist/modules/lighting/water-material/water-shaders-glsl.js +232 -0
  511. package/dist/modules/lighting/water-material/water-shaders-glsl.js.map +1 -0
  512. package/dist/modules/lighting/water-material/water-shaders-wgsl.cjs +254 -0
  513. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts +2 -0
  514. package/dist/modules/lighting/water-material/water-shaders-wgsl.d.ts.map +1 -0
  515. package/dist/modules/lighting/water-material/water-shaders-wgsl.js +230 -0
  516. package/dist/modules/lighting/water-material/water-shaders-wgsl.js.map +1 -0
  517. package/dist/modules/math/fp16/fp16-utils.cjs +112 -0
  518. package/dist/modules/math/fp16/fp16-utils.d.ts +13 -0
  519. package/dist/modules/math/fp16/fp16-utils.d.ts.map +1 -0
  520. package/dist/modules/math/fp16/fp16-utils.js +118 -0
  521. package/dist/modules/math/fp16/fp16-utils.js.map +1 -0
  522. package/dist/modules/math/fp32/fp32.cjs +310 -0
  523. package/dist/modules/math/fp32/fp32.d.ts +9 -0
  524. package/dist/modules/math/fp32/fp32.d.ts.map +1 -0
  525. package/dist/modules/math/fp32/fp32.js +288 -0
  526. package/dist/modules/math/fp32/fp32.js.map +1 -0
  527. package/dist/modules/math/fp64/fp64-arithmetic-glsl.cjs +229 -0
  528. package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts +2 -0
  529. package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts.map +1 -0
  530. package/dist/modules/math/fp64/fp64-arithmetic-glsl.js +205 -0
  531. package/dist/modules/math/fp64/fp64-arithmetic-glsl.js.map +1 -0
  532. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.cjs +144 -0
  533. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts +10 -0
  534. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.d.ts.map +1 -0
  535. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js +128 -0
  536. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.js.map +1 -0
  537. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.cjs +583 -0
  538. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts +11 -0
  539. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.d.ts.map +1 -0
  540. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js +563 -0
  541. package/dist/modules/math/fp64/fp64-arithmetic-wgsl-integer.js.map +1 -0
  542. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.cjs +946 -0
  543. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts +3 -0
  544. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.d.ts.map +1 -0
  545. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js +923 -0
  546. package/dist/modules/math/fp64/fp64-arithmetic-wgsl.js.map +1 -0
  547. package/dist/modules/math/fp64/fp64-functions-glsl.cjs +699 -0
  548. package/dist/modules/math/fp64/fp64-functions-glsl.d.ts +2 -0
  549. package/dist/modules/math/fp64/fp64-functions-glsl.d.ts.map +1 -0
  550. package/dist/modules/math/fp64/fp64-functions-glsl.js +675 -0
  551. package/dist/modules/math/fp64/fp64-functions-glsl.js.map +1 -0
  552. package/dist/modules/math/fp64/fp64-functions-wgsl.cjs +180 -0
  553. package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts +3 -0
  554. package/dist/modules/math/fp64/fp64-functions-wgsl.d.ts.map +1 -0
  555. package/dist/modules/math/fp64/fp64-functions-wgsl.js +157 -0
  556. package/dist/modules/math/fp64/fp64-functions-wgsl.js.map +1 -0
  557. package/dist/modules/math/fp64/fp64-utils.cjs +50 -0
  558. package/dist/modules/math/fp64/fp64-utils.d.ts +22 -0
  559. package/dist/modules/math/fp64/fp64-utils.d.ts.map +1 -0
  560. package/dist/modules/math/fp64/fp64-utils.js +42 -0
  561. package/dist/modules/math/fp64/fp64-utils.js.map +1 -0
  562. package/dist/modules/math/fp64/fp64.cjs +68 -0
  563. package/dist/modules/math/fp64/fp64.d.ts +24 -0
  564. package/dist/modules/math/fp64/fp64.d.ts.map +1 -0
  565. package/dist/modules/math/fp64/fp64.js +46 -0
  566. package/dist/modules/math/fp64/fp64.js.map +1 -0
  567. package/dist/modules/math/random/random.cjs +46 -0
  568. package/dist/modules/math/random/random.d.ts +7 -0
  569. package/dist/modules/math/random/random.d.ts.map +1 -0
  570. package/dist/modules/math/random/random.js +21 -0
  571. package/dist/modules/math/random/random.js.map +1 -0
  572. package/dist/modules/math/value-noise/value-noise.cjs +95 -0
  573. package/dist/modules/math/value-noise/value-noise.d.ts +7 -0
  574. package/dist/modules/math/value-noise/value-noise.d.ts.map +1 -0
  575. package/dist/modules/math/value-noise/value-noise.js +68 -0
  576. package/dist/modules/math/value-noise/value-noise.js.map +1 -0
  577. package/dist/modules/volume/volume-raymarch.cjs +107 -0
  578. package/dist/modules/volume/volume-raymarch.d.ts +6 -0
  579. package/dist/modules/volume/volume-raymarch.d.ts.map +1 -0
  580. package/dist/modules/volume/volume-raymarch.js +84 -0
  581. package/dist/modules/volume/volume-raymarch.js.map +1 -0
  582. package/dist/types/align-to.cjs +38 -0
  583. package/dist/types/align-to.d.ts +3 -0
  584. package/dist/types/align-to.d.ts.map +1 -0
  585. package/dist/types/align-to.js +13 -0
  586. package/dist/types/align-to.js.map +1 -0
  587. package/dist/types/primitive-data-types.cjs +15 -0
  588. package/dist/types/primitive-data-types.d.ts +7 -0
  589. package/dist/types/primitive-data-types.d.ts.map +1 -0
  590. package/dist/types/primitive-data-types.js +5 -0
  591. package/dist/types/primitive-data-types.js.map +1 -0
  592. package/dist/types/sampler-props.cjs +15 -0
  593. package/dist/types/sampler-props.d.ts +26 -0
  594. package/dist/types/sampler-props.d.ts.map +1 -0
  595. package/dist/types/sampler-props.js +5 -0
  596. package/dist/types/sampler-props.js.map +1 -0
  597. package/dist/types/shader-block-layout.cjs +184 -0
  598. package/dist/types/shader-block-layout.d.ts +72 -0
  599. package/dist/types/shader-block-layout.d.ts.map +1 -0
  600. package/dist/types/shader-block-layout.js +209 -0
  601. package/dist/types/shader-block-layout.js.map +1 -0
  602. package/dist/types/shader-layout.cjs +15 -0
  603. package/dist/types/shader-layout.d.ts +178 -0
  604. package/dist/types/shader-layout.d.ts.map +1 -0
  605. package/dist/types/shader-layout.js +5 -0
  606. package/dist/types/shader-layout.js.map +1 -0
  607. package/dist/types/shader-type-decoder.cjs +240 -0
  608. package/dist/types/shader-type-decoder.d.ts +41 -0
  609. package/dist/types/shader-type-decoder.d.ts.map +1 -0
  610. package/dist/types/shader-type-decoder.js +210 -0
  611. package/dist/types/shader-type-decoder.js.map +1 -0
  612. package/dist/types/shader-types.cjs +15 -0
  613. package/dist/types/shader-types.d.ts +101 -0
  614. package/dist/types/shader-types.d.ts.map +1 -0
  615. package/dist/types/shader-types.js +30 -0
  616. package/dist/types/shader-types.js.map +1 -0
  617. package/dist/types/texture-formats.cjs +15 -0
  618. package/dist/types/texture-formats.d.ts +24 -0
  619. package/dist/types/texture-formats.d.ts.map +1 -0
  620. package/dist/types/texture-formats.js +5 -0
  621. package/dist/types/texture-formats.js.map +1 -0
  622. package/dist/types.cjs +53 -0
  623. package/dist/types.cjs.map +6 -0
  624. package/dist/types.d.ts +14 -0
  625. package/dist/types.d.ts.map +1 -0
  626. package/dist/types.js +7 -0
  627. package/dist/types.js.map +1 -0
  628. package/dist/wgsl.cjs +55 -0
  629. package/dist/wgsl.cjs.map +6 -0
  630. package/dist/wgsl.d.ts +8 -0
  631. package/dist/wgsl.d.ts.map +1 -0
  632. package/dist/wgsl.js +9 -0
  633. package/dist/wgsl.js.map +1 -0
  634. package/package.json +65 -4
  635. package/src/glsl.ts +13 -0
  636. package/src/index.ts +307 -0
  637. package/src/lib/color/normalize-byte-colors.ts +57 -0
  638. package/src/lib/filters/prop-types.ts +150 -0
  639. package/src/lib/glsl-shader-assembler.ts +39 -0
  640. package/src/lib/glsl-utils/get-shader-info.ts +42 -0
  641. package/src/lib/glsl-utils/shader-utils.ts +110 -0
  642. package/src/lib/preprocessor/preprocessor.ts +157 -0
  643. package/src/lib/shader-assembler-base.ts +169 -0
  644. package/src/lib/shader-assembler.ts +7 -0
  645. package/src/lib/shader-assembly/assemble-glsl-shaders.ts +305 -0
  646. package/src/lib/shader-assembly/assemble-shaders.ts +13 -0
  647. package/src/lib/shader-assembly/assemble-wgsl-shaders.ts +830 -0
  648. package/src/lib/shader-assembly/platform-defines.ts +58 -0
  649. package/src/lib/shader-assembly/platform-info.ts +23 -0
  650. package/src/lib/shader-assembly/shader-assembly-shared.ts +95 -0
  651. package/src/lib/shader-assembly/shader-assembly-types.ts +146 -0
  652. package/src/lib/shader-assembly/shader-injection-targets.ts +148 -0
  653. package/src/lib/shader-assembly/shader-injections.ts +298 -0
  654. package/src/lib/shader-assembly/shader-plugin-varyings.ts +555 -0
  655. package/src/lib/shader-assembly/shader-plugin-vertex-inputs.ts +279 -0
  656. package/src/lib/shader-assembly/wgsl-binding-debug.ts +227 -0
  657. package/src/lib/shader-assembly/wgsl-binding-scan.ts +228 -0
  658. package/src/lib/shader-assembly/wgsl-injection-target-names.ts +180 -0
  659. package/src/lib/shader-assembly/wgsl-interface-scan.ts +676 -0
  660. package/src/lib/shader-generator/generate-shader.ts +27 -0
  661. package/src/lib/shader-generator/glsl/generate-glsl.ts +101 -0
  662. package/src/lib/shader-generator/utils/capitalize.ts +12 -0
  663. package/src/lib/shader-generator/wgsl/generate-wgsl.ts +40 -0
  664. package/src/lib/shader-module/composite-shader-pass.ts +47 -0
  665. package/src/lib/shader-module/shader-module-dependencies.ts +128 -0
  666. package/src/lib/shader-module/shader-module-uniform-layout.ts +420 -0
  667. package/src/lib/shader-module/shader-module.ts +237 -0
  668. package/src/lib/shader-module/shader-pass.ts +69 -0
  669. package/src/lib/shader-plugin.ts +236 -0
  670. package/src/lib/shader-transpiler/shader-transpiler.ts +34 -0
  671. package/src/lib/shader-transpiler/transpile-glsl-shader.ts +78 -0
  672. package/src/lib/utils/assert.ts +13 -0
  673. package/src/lib/utils/uniform-types.ts +89 -0
  674. package/src/lib/wgsl-shader-assembler.ts +122 -0
  675. package/src/module-injectors.ts +32 -0
  676. package/src/modules/color/float-colors.ts +334 -0
  677. package/src/modules/engine/clip/clip.ts +139 -0
  678. package/src/modules/engine/filter/filter.ts +99 -0
  679. package/src/modules/engine/geometry/geometry.ts +45 -0
  680. package/src/modules/engine/gpu-animation/gpu-animation.ts +244 -0
  681. package/src/modules/engine/picking/README.md +88 -0
  682. package/src/modules/engine/picking/picking.ts +252 -0
  683. package/src/modules/engine/project/project.ts +166 -0
  684. package/src/modules/engine/skin/skin.ts +233 -0
  685. package/src/modules/engine/transform/transform.ts +50 -0
  686. package/src/modules/geometry/path-dash/path-dash.ts +68 -0
  687. package/src/modules/geometry/pattern-fill/pattern-fill-shaders.ts +88 -0
  688. package/src/modules/geometry/pattern-fill/pattern-fill.ts +54 -0
  689. package/src/modules/geometry/point-glow/point-glow.ts +87 -0
  690. package/src/modules/geometry/precipitation/README.md +19 -0
  691. package/src/modules/geometry/precipitation/precipitation.ts +108 -0
  692. package/src/modules/geometry/sketch-stroke/sketch-stroke.ts +160 -0
  693. package/src/modules/geospatial/dggs/dggs-wgsl.ts +2284 -0
  694. package/src/modules/geospatial/dggs/dggs.ts +12 -0
  695. package/src/modules/lighting/area-lighting/area-light-types.ts +71 -0
  696. package/src/modules/lighting/area-lighting/area-lighting-shaders.ts +72 -0
  697. package/src/modules/lighting/area-lighting/area-lighting.ts +63 -0
  698. package/src/modules/lighting/area-lighting/ltc-shaders.ts +163 -0
  699. package/src/modules/lighting/atmosphere/README.md +25 -0
  700. package/src/modules/lighting/atmosphere/atmosphere.ts +246 -0
  701. package/src/modules/lighting/clouds/README.md +24 -0
  702. package/src/modules/lighting/clouds/clouds.ts +216 -0
  703. package/src/modules/lighting/clustered-light-grid/clustered-light-grid.ts +17 -0
  704. package/src/modules/lighting/contact-shadow/contact-shadow.ts +365 -0
  705. package/src/modules/lighting/firefly/firefly.ts +64 -0
  706. package/src/modules/lighting/globe-clouds/globe-clouds.ts +124 -0
  707. package/src/modules/lighting/gouraud-material/gouraud-material.ts +55 -0
  708. package/src/modules/lighting/height-fog/README.md +36 -0
  709. package/src/modules/lighting/height-fog/height-fog-functions.ts +116 -0
  710. package/src/modules/lighting/height-fog/height-fog.ts +96 -0
  711. package/src/modules/lighting/ibl/ibl.ts +43 -0
  712. package/src/modules/lighting/lambert-material/lambert-material.ts +42 -0
  713. package/src/modules/lighting/lambert-material/lambert-shaders-glsl.ts +61 -0
  714. package/src/modules/lighting/lambert-material/lambert-shaders-wgsl.ts +73 -0
  715. package/src/modules/lighting/lights/lighting-glsl.ts +92 -0
  716. package/src/modules/lighting/lights/lighting-wgsl.ts +91 -0
  717. package/src/modules/lighting/lights/lighting.ts +385 -0
  718. package/src/modules/lighting/no-material/dirlight.ts +101 -0
  719. package/src/modules/lighting/pbr-ambient-occlusion/pbr-ambient-occlusion.ts +78 -0
  720. package/src/modules/lighting/pbr-contact-shadow/pbr-contact-shadow.ts +78 -0
  721. package/src/modules/lighting/pbr-material/pbr-material-glsl.ts +1770 -0
  722. package/src/modules/lighting/pbr-material/pbr-material-wgsl.ts +2065 -0
  723. package/src/modules/lighting/pbr-material/pbr-material.ts +517 -0
  724. package/src/modules/lighting/pbr-material/pbr-projection.ts +50 -0
  725. package/src/modules/lighting/pbr-material/pbr-scene.ts +112 -0
  726. package/src/modules/lighting/pbr-shadow/pbr-shadow.ts +85 -0
  727. package/src/modules/lighting/pbr-surface/pbr-surface.ts +103 -0
  728. package/src/modules/lighting/phong-material/phong-material.ts +53 -0
  729. package/src/modules/lighting/phong-material/phong-shaders-glsl.ts +73 -0
  730. package/src/modules/lighting/phong-material/phong-shaders-wgsl.ts +129 -0
  731. package/src/modules/lighting/prefiltered-environment/prefiltered-environment.ts +370 -0
  732. package/src/modules/lighting/shadow/shadow-glsl.ts +204 -0
  733. package/src/modules/lighting/shadow/shadow-types.ts +68 -0
  734. package/src/modules/lighting/shadow/shadow.ts +536 -0
  735. package/src/modules/lighting/surface-weather/README.md +28 -0
  736. package/src/modules/lighting/surface-weather/surface-weather.ts +198 -0
  737. package/src/modules/lighting/unlit-material/unlit-material.ts +44 -0
  738. package/src/modules/lighting/water-material/river-water-material.ts +58 -0
  739. package/src/modules/lighting/water-material/river-water-shaders.ts +234 -0
  740. package/src/modules/lighting/water-material/water-material.ts +234 -0
  741. package/src/modules/lighting/water-material/water-shaders-glsl.ts +233 -0
  742. package/src/modules/lighting/water-material/water-shaders-wgsl.ts +230 -0
  743. package/src/modules/math/fp16/fp16-utils.ts +156 -0
  744. package/src/modules/math/fp32/fp32.ts +291 -0
  745. package/src/modules/math/fp64/fp64-arithmetic-glsl.ts +205 -0
  746. package/src/modules/math/fp64/fp64-arithmetic-wgsl-hybrid.ts +129 -0
  747. package/src/modules/math/fp64/fp64-arithmetic-wgsl-integer.ts +564 -0
  748. package/src/modules/math/fp64/fp64-arithmetic-wgsl.ts +924 -0
  749. package/src/modules/math/fp64/fp64-functions-glsl.ts +675 -0
  750. package/src/modules/math/fp64/fp64-functions-wgsl.ts +157 -0
  751. package/src/modules/math/fp64/fp64-utils.ts +46 -0
  752. package/src/modules/math/fp64/fp64.ts +64 -0
  753. package/src/modules/math/random/random.ts +25 -0
  754. package/src/modules/math/value-noise/value-noise.ts +70 -0
  755. package/src/modules/volume/volume-raymarch.ts +87 -0
  756. package/src/types/align-to.ts +13 -0
  757. package/src/types/primitive-data-types.ts +10 -0
  758. package/src/types/sampler-props.ts +39 -0
  759. package/src/types/shader-block-layout.ts +340 -0
  760. package/src/types/shader-layout.ts +208 -0
  761. package/src/types/shader-type-decoder.ts +285 -0
  762. package/src/types/shader-types.ts +207 -0
  763. package/src/types/texture-formats.ts +157 -0
  764. package/src/types.ts +116 -0
  765. package/src/wgsl.ts +34 -0
@@ -0,0 +1,2065 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // SPDX-FileCopyrightText: Copyright (c) vis.gl contributors
4
+ // SPDX-FileCopyrightText: Copyright (c) 2016-2017 Mohamad Moneimne and Contributors
5
+
6
+ // Attribution:
7
+ // MIT license, Copyright (c) 2016-2017 Mohamad Moneimne and Contributors
8
+ // This fragment shader defines a reference implementation for Physically Based Shading of
9
+ // a microfacet surface material defined by a glTF model.
10
+
11
+ // TODO - better do the checks outside of shader
12
+
13
+ export const pbrMaterialUniforms = /* wgsl */ `\
14
+ uniform Projection {
15
+ // Projection
16
+ vec3 u_Camera;
17
+ };
18
+
19
+ uniform pbrMaterialUniforms {
20
+ // Material is unlit
21
+ bool unlit;
22
+
23
+ // Base color map
24
+ bool baseColorMapEnabled;
25
+ vec4 baseColorFactor;
26
+
27
+ bool normalMapEnabled;
28
+ float normalScale; // #ifdef HAS_NORMALMAP
29
+
30
+ bool emissiveMapEnabled;
31
+ bool lightmapMapEnabled;
32
+ vec3 emissiveFactor; // #ifdef HAS_EMISSIVEMAP
33
+
34
+ vec2 metallicRoughnessValues;
35
+ bool metallicRoughnessMapEnabled;
36
+
37
+ bool occlusionMapEnabled;
38
+ float occlusionStrength; // #ifdef HAS_OCCLUSIONMAP
39
+
40
+ bool alphaCutoffEnabled;
41
+ float alphaCutoff; // #ifdef ALPHA_CUTOFF
42
+
43
+ vec3 specularColorFactor;
44
+ float specularIntensityFactor;
45
+ bool specularColorMapEnabled;
46
+ bool specularIntensityMapEnabled;
47
+
48
+ float ior;
49
+
50
+ float transmissionFactor;
51
+ bool transmissionMapEnabled;
52
+
53
+ float thicknessFactor;
54
+ float attenuationDistance;
55
+ vec3 attenuationColor;
56
+
57
+ float clearcoatFactor;
58
+ float clearcoatRoughnessFactor;
59
+ bool clearcoatMapEnabled;
60
+ bool clearcoatRoughnessMapEnabled;
61
+
62
+ vec3 sheenColorFactor;
63
+ float sheenRoughnessFactor;
64
+ bool sheenColorMapEnabled;
65
+ bool sheenRoughnessMapEnabled;
66
+
67
+ float iridescenceFactor;
68
+ float iridescenceIor;
69
+ vec2 iridescenceThicknessRange;
70
+ bool iridescenceMapEnabled;
71
+
72
+ float anisotropyStrength;
73
+ float anisotropyRotation;
74
+ vec2 anisotropyDirection;
75
+ bool anisotropyMapEnabled;
76
+
77
+ float emissiveStrength;
78
+ float lightmapIntensity;
79
+ float dispersion;
80
+
81
+ // IBL
82
+ bool IBLenabled;
83
+ vec2 scaleIBLAmbient; // #ifdef USE_IBL
84
+
85
+ // debugging flags used for shader output of intermediate PBR variables
86
+ // #ifdef PBR_DEBUG
87
+ vec4 scaleDiffBaseMR;
88
+ vec4 scaleFGDSpec;
89
+ // #endif
90
+ };
91
+
92
+ // Samplers
93
+ #ifdef HAS_BASECOLORMAP
94
+ uniform sampler2D u_BaseColorSampler;
95
+ #endif
96
+ #ifdef HAS_NORMALMAP
97
+ uniform sampler2D u_NormalSampler;
98
+ #endif
99
+ #ifdef HAS_EMISSIVEMAP
100
+ uniform sampler2D u_EmissiveSampler;
101
+ #endif
102
+ #ifdef HAS_LIGHTMAP
103
+ uniform sampler2D u_LightmapSampler;
104
+ #endif
105
+ #ifdef HAS_METALROUGHNESSMAP
106
+ uniform sampler2D u_MetallicRoughnessSampler;
107
+ #endif
108
+ #ifdef HAS_OCCLUSIONMAP
109
+ uniform sampler2D u_OcclusionSampler;
110
+ #endif
111
+ #ifdef HAS_SPECULARCOLORMAP
112
+ uniform sampler2D u_SpecularColorSampler;
113
+ #endif
114
+ #ifdef HAS_SPECULARINTENSITYMAP
115
+ uniform sampler2D u_SpecularIntensitySampler;
116
+ #endif
117
+ #ifdef HAS_TRANSMISSIONMAP
118
+ uniform sampler2D u_TransmissionSampler;
119
+ #endif
120
+ #ifdef HAS_THICKNESSMAP
121
+ uniform sampler2D u_ThicknessSampler;
122
+ #endif
123
+ #ifdef HAS_CLEARCOATMAP
124
+ uniform sampler2D u_ClearcoatSampler;
125
+ #endif
126
+ #ifdef HAS_CLEARCOATROUGHNESSMAP
127
+ uniform sampler2D u_ClearcoatRoughnessSampler;
128
+ #endif
129
+ #ifdef HAS_CLEARCOATNORMALMAP
130
+ uniform sampler2D u_ClearcoatNormalSampler;
131
+ #endif
132
+ #ifdef HAS_SHEENCOLORMAP
133
+ uniform sampler2D u_SheenColorSampler;
134
+ #endif
135
+ #ifdef HAS_SHEENROUGHNESSMAP
136
+ uniform sampler2D u_SheenRoughnessSampler;
137
+ #endif
138
+ #ifdef HAS_IRIDESCENCEMAP
139
+ uniform sampler2D u_IridescenceSampler;
140
+ #endif
141
+ #ifdef HAS_IRIDESCENCETHICKNESSMAP
142
+ uniform sampler2D u_IridescenceThicknessSampler;
143
+ #endif
144
+ #ifdef HAS_ANISOTROPYMAP
145
+ uniform sampler2D u_AnisotropySampler;
146
+ #endif
147
+ #ifdef USE_IBL
148
+ uniform samplerCube u_DiffuseEnvSampler;
149
+ uniform samplerCube u_SpecularEnvSampler;
150
+ uniform sampler2D u_brdfLUT;
151
+ #endif
152
+
153
+ `;
154
+
155
+ export const source = /* wgsl */ `\
156
+ #ifdef DOUBLE_SIDED
157
+ var<private> pbr_frontFacing: bool = true;
158
+ #endif
159
+ struct PBRFragmentInputs {
160
+ pbr_vPosition: vec3f,
161
+ pbr_vUV0: vec2f,
162
+ pbr_vUV1: vec2f,
163
+ pbr_vTBN: mat3x3f,
164
+ pbr_vNormal: vec3f
165
+ };
166
+
167
+ var<private> fragmentInputs: PBRFragmentInputs;
168
+
169
+ fn pbr_setPositionNormalTangentUV(
170
+ position: vec4f,
171
+ normal: vec4f,
172
+ tangent: vec4f,
173
+ uv0: vec2f,
174
+ uv1: vec2f
175
+ )
176
+ {
177
+ var pos: vec4f = pbrProjection.modelMatrix * position;
178
+ fragmentInputs.pbr_vPosition = pos.xyz / pos.w;
179
+ fragmentInputs.pbr_vNormal = vec3f(0.0, 0.0, 1.0);
180
+ fragmentInputs.pbr_vTBN = mat3x3f(
181
+ vec3f(1.0, 0.0, 0.0),
182
+ vec3f(0.0, 1.0, 0.0),
183
+ vec3f(0.0, 0.0, 1.0)
184
+ );
185
+ fragmentInputs.pbr_vUV0 = vec2f(0.0, 0.0);
186
+ fragmentInputs.pbr_vUV1 = uv1;
187
+
188
+ #ifdef HAS_NORMALS
189
+ let normalW: vec3f = normalize((pbrProjection.normalMatrix * vec4f(normal.xyz, 0.0)).xyz);
190
+ fragmentInputs.pbr_vNormal = normalW;
191
+ #ifdef HAS_TANGENTS
192
+ let tangentW: vec3f = normalize((pbrProjection.modelMatrix * vec4f(tangent.xyz, 0.0)).xyz);
193
+ let bitangentW: vec3f = cross(normalW, tangentW) * tangent.w;
194
+ fragmentInputs.pbr_vTBN = mat3x3f(tangentW, bitangentW, normalW);
195
+ #endif
196
+ #endif
197
+
198
+ #ifdef HAS_UV
199
+ fragmentInputs.pbr_vUV0 = uv0;
200
+ #endif
201
+ }
202
+
203
+ struct pbrMaterialUniforms {
204
+ // Material is unlit
205
+ unlit: u32,
206
+
207
+ // Base color map
208
+ baseColorMapEnabled: u32,
209
+ baseColorFactor: vec4f,
210
+
211
+ normalMapEnabled : u32,
212
+ normalScale: f32, // #ifdef HAS_NORMALMAP
213
+
214
+ emissiveMapEnabled: u32,
215
+ emissiveFactor: vec3f, // #ifdef HAS_EMISSIVEMAP
216
+
217
+ metallicRoughnessValues: vec2f,
218
+ metallicRoughnessMapEnabled: u32,
219
+
220
+ occlusionMapEnabled: i32,
221
+ occlusionStrength: f32, // #ifdef HAS_OCCLUSIONMAP
222
+
223
+ alphaCutoffEnabled: i32,
224
+ alphaCutoff: f32, // #ifdef ALPHA_CUTOFF
225
+
226
+ specularColorFactor: vec3f,
227
+ specularIntensityFactor: f32,
228
+ specularColorMapEnabled: i32,
229
+ specularIntensityMapEnabled: i32,
230
+
231
+ ior: f32,
232
+
233
+ transmissionFactor: f32,
234
+ transmissionMapEnabled: i32,
235
+
236
+ thicknessFactor: f32,
237
+ attenuationDistance: f32,
238
+ attenuationColor: vec3f,
239
+
240
+ clearcoatFactor: f32,
241
+ clearcoatRoughnessFactor: f32,
242
+ clearcoatMapEnabled: i32,
243
+ clearcoatRoughnessMapEnabled: i32,
244
+
245
+ sheenColorFactor: vec3f,
246
+ sheenRoughnessFactor: f32,
247
+ sheenColorMapEnabled: i32,
248
+ sheenRoughnessMapEnabled: i32,
249
+
250
+ iridescenceFactor: f32,
251
+ iridescenceIor: f32,
252
+ iridescenceThicknessRange: vec2f,
253
+ iridescenceMapEnabled: i32,
254
+
255
+ anisotropyStrength: f32,
256
+ anisotropyRotation: f32,
257
+ anisotropyDirection: vec2f,
258
+ anisotropyMapEnabled: i32,
259
+
260
+ emissiveStrength: f32,
261
+ dispersion: f32,
262
+
263
+ // IBL
264
+ IBLenabled: i32,
265
+ scaleIBLAmbient: vec2f, // #ifdef USE_IBL
266
+
267
+ // debugging flags used for shader output of intermediate PBR variables
268
+ // #ifdef PBR_DEBUG
269
+ scaleDiffBaseMR: vec4f,
270
+ scaleFGDSpec: vec4f,
271
+ // #endif
272
+
273
+ baseColorUVSet: i32,
274
+ baseColorUVTransform: mat3x3f,
275
+ metallicRoughnessUVSet: i32,
276
+ metallicRoughnessUVTransform: mat3x3f,
277
+ normalUVSet: i32,
278
+ normalUVTransform: mat3x3f,
279
+ occlusionUVSet: i32,
280
+ occlusionUVTransform: mat3x3f,
281
+ emissiveUVSet: i32,
282
+ emissiveUVTransform: mat3x3f,
283
+ specularColorUVSet: i32,
284
+ specularColorUVTransform: mat3x3f,
285
+ specularIntensityUVSet: i32,
286
+ specularIntensityUVTransform: mat3x3f,
287
+ transmissionUVSet: i32,
288
+ transmissionUVTransform: mat3x3f,
289
+ thicknessUVSet: i32,
290
+ thicknessUVTransform: mat3x3f,
291
+ clearcoatUVSet: i32,
292
+ clearcoatUVTransform: mat3x3f,
293
+ clearcoatRoughnessUVSet: i32,
294
+ clearcoatRoughnessUVTransform: mat3x3f,
295
+ clearcoatNormalUVSet: i32,
296
+ clearcoatNormalUVTransform: mat3x3f,
297
+ sheenColorUVSet: i32,
298
+ sheenColorUVTransform: mat3x3f,
299
+ sheenRoughnessUVSet: i32,
300
+ sheenRoughnessUVTransform: mat3x3f,
301
+ iridescenceUVSet: i32,
302
+ iridescenceUVTransform: mat3x3f,
303
+ iridescenceThicknessUVSet: i32,
304
+ iridescenceThicknessUVTransform: mat3x3f,
305
+ anisotropyUVSet: i32,
306
+ anisotropyUVTransform: mat3x3f,
307
+
308
+ bumpFactor: f32,
309
+ bumpMapEnabled: i32,
310
+ diffuseTransmissionFactor: f32,
311
+ diffuseTransmissionMapEnabled: i32,
312
+ diffuseTransmissionColorFactor: vec3f,
313
+ diffuseTransmissionColorMapEnabled: i32,
314
+ multiscatterColorFactor: vec3f,
315
+ multiscatterColorMapEnabled: i32,
316
+ scatterAnisotropy: f32,
317
+
318
+ bumpUVSet: i32,
319
+ bumpUVTransform: mat3x3f,
320
+ diffuseTransmissionUVSet: i32,
321
+ diffuseTransmissionUVTransform: mat3x3f,
322
+ diffuseTransmissionColorUVSet: i32,
323
+ diffuseTransmissionColorUVTransform: mat3x3f,
324
+ multiscatterColorUVSet: i32,
325
+ multiscatterColorUVTransform: mat3x3f,
326
+ lightmapMapEnabled: u32,
327
+ lightmapIntensity: f32,
328
+ lightmapUVSet: i32,
329
+ lightmapUVTransform: mat3x3f,
330
+ scatterStrengthFactor: f32,
331
+ }
332
+
333
+ @group(3) @binding(auto) var<uniform> pbrMaterial : pbrMaterialUniforms;
334
+
335
+ // Samplers
336
+ #ifdef HAS_BASECOLORMAP
337
+ @group(3) @binding(auto) var pbr_baseColorSampler: texture_2d<f32>;
338
+ @group(3) @binding(auto) var pbr_baseColorSamplerSampler: sampler;
339
+ #endif
340
+ #ifdef HAS_NORMALMAP
341
+ @group(3) @binding(auto) var pbr_normalSampler: texture_2d<f32>;
342
+ @group(3) @binding(auto) var pbr_normalSamplerSampler: sampler;
343
+ #endif
344
+ #ifdef HAS_EMISSIVEMAP
345
+ @group(3) @binding(auto) var pbr_emissiveSampler: texture_2d<f32>;
346
+ @group(3) @binding(auto) var pbr_emissiveSamplerSampler: sampler;
347
+ #endif
348
+ #ifdef HAS_LIGHTMAP
349
+ @group(3) @binding(auto) var pbr_lightmapSampler: texture_2d<f32>;
350
+ @group(3) @binding(auto) var pbr_lightmapSamplerSampler: sampler;
351
+ #endif
352
+ #ifdef HAS_METALROUGHNESSMAP
353
+ @group(3) @binding(auto) var pbr_metallicRoughnessSampler: texture_2d<f32>;
354
+ @group(3) @binding(auto) var pbr_metallicRoughnessSamplerSampler: sampler;
355
+ #endif
356
+ #ifdef HAS_OCCLUSIONMAP
357
+ @group(3) @binding(auto) var pbr_occlusionSampler: texture_2d<f32>;
358
+ @group(3) @binding(auto) var pbr_occlusionSamplerSampler: sampler;
359
+ #endif
360
+ #ifdef HAS_SPECULARCOLORMAP
361
+ @group(3) @binding(auto) var pbr_specularColorSampler: texture_2d<f32>;
362
+ @group(3) @binding(auto) var pbr_specularColorSamplerSampler: sampler;
363
+ #endif
364
+ #ifdef HAS_SPECULARINTENSITYMAP
365
+ @group(3) @binding(auto) var pbr_specularIntensitySampler: texture_2d<f32>;
366
+ @group(3) @binding(auto) var pbr_specularIntensitySamplerSampler: sampler;
367
+ #endif
368
+ #ifdef HAS_TRANSMISSIONMAP
369
+ @group(3) @binding(auto) var pbr_transmissionSampler: texture_2d<f32>;
370
+ @group(3) @binding(auto) var pbr_transmissionSamplerSampler: sampler;
371
+ #endif
372
+ #ifdef HAS_THICKNESSMAP
373
+ @group(3) @binding(auto) var pbr_thicknessSampler: texture_2d<f32>;
374
+ @group(3) @binding(auto) var pbr_thicknessSamplerSampler: sampler;
375
+ #endif
376
+ #ifdef HAS_CLEARCOATMAP
377
+ @group(3) @binding(auto) var pbr_clearcoatSampler: texture_2d<f32>;
378
+ @group(3) @binding(auto) var pbr_clearcoatSamplerSampler: sampler;
379
+ #endif
380
+ #ifdef HAS_CLEARCOATROUGHNESSMAP
381
+ @group(3) @binding(auto) var pbr_clearcoatRoughnessSampler: texture_2d<f32>;
382
+ @group(3) @binding(auto) var pbr_clearcoatRoughnessSamplerSampler: sampler;
383
+ #endif
384
+ #ifdef HAS_CLEARCOATNORMALMAP
385
+ @group(3) @binding(auto) var pbr_clearcoatNormalSampler: texture_2d<f32>;
386
+ @group(3) @binding(auto) var pbr_clearcoatNormalSamplerSampler: sampler;
387
+ #endif
388
+ #ifdef HAS_SHEENCOLORMAP
389
+ @group(3) @binding(auto) var pbr_sheenColorSampler: texture_2d<f32>;
390
+ @group(3) @binding(auto) var pbr_sheenColorSamplerSampler: sampler;
391
+ #endif
392
+ #ifdef HAS_SHEENROUGHNESSMAP
393
+ @group(3) @binding(auto) var pbr_sheenRoughnessSampler: texture_2d<f32>;
394
+ @group(3) @binding(auto) var pbr_sheenRoughnessSamplerSampler: sampler;
395
+ #endif
396
+ #ifdef HAS_IRIDESCENCEMAP
397
+ @group(3) @binding(auto) var pbr_iridescenceSampler: texture_2d<f32>;
398
+ @group(3) @binding(auto) var pbr_iridescenceSamplerSampler: sampler;
399
+ #endif
400
+ #ifdef HAS_IRIDESCENCETHICKNESSMAP
401
+ @group(3) @binding(auto) var pbr_iridescenceThicknessSampler: texture_2d<f32>;
402
+ @group(3) @binding(auto) var pbr_iridescenceThicknessSamplerSampler: sampler;
403
+ #endif
404
+ #ifdef HAS_ANISOTROPYMAP
405
+ @group(3) @binding(auto) var pbr_anisotropySampler: texture_2d<f32>;
406
+ @group(3) @binding(auto) var pbr_anisotropySamplerSampler: sampler;
407
+ #endif
408
+ #ifdef HAS_BUMPMAP
409
+ @group(3) @binding(auto) var pbr_bumpSampler: texture_2d<f32>;
410
+ @group(3) @binding(auto) var pbr_bumpSamplerSampler: sampler;
411
+ #endif
412
+ #ifdef HAS_DIFFUSETRANSMISSIONMAP
413
+ @group(3) @binding(auto) var pbr_diffuseTransmissionSampler: texture_2d<f32>;
414
+ @group(3) @binding(auto) var pbr_diffuseTransmissionSamplerSampler: sampler;
415
+ #endif
416
+ #ifdef HAS_DIFFUSETRANSMISSIONCOLORMAP
417
+ @group(3) @binding(auto) var pbr_diffuseTransmissionColorSampler: texture_2d<f32>;
418
+ @group(3) @binding(auto) var pbr_diffuseTransmissionColorSamplerSampler: sampler;
419
+ #endif
420
+ #ifdef HAS_MULTISCATTERCOLORMAP
421
+ @group(3) @binding(auto) var pbr_multiscatterColorSampler: texture_2d<f32>;
422
+ @group(3) @binding(auto) var pbr_multiscatterColorSamplerSampler: sampler;
423
+ #endif
424
+ // Encapsulate the various inputs used by the various functions in the shading equation
425
+ // We store values in this struct to simplify the integration of alternative implementations
426
+ // of the shading terms, outlined in the Readme.MD Appendix.
427
+ struct PBRInfo {
428
+ NdotL: f32, // cos angle between normal and light direction
429
+ NdotV: f32, // cos angle between normal and view direction
430
+ NdotH: f32, // cos angle between normal and half vector
431
+ LdotH: f32, // cos angle between light direction and half vector
432
+ VdotH: f32, // cos angle between view direction and half vector
433
+ perceptualRoughness: f32, // roughness value, as authored by the model creator (input to shader)
434
+ metalness: f32, // metallic value at the surface
435
+ reflectance0: vec3f, // full reflectance color (normal incidence angle)
436
+ reflectance90: vec3f, // reflectance color at grazing angle
437
+ alphaRoughness: f32, // roughness mapped to a more linear change in the roughness (proposed by [2])
438
+ diffuseColor: vec3f, // color contribution from diffuse lighting
439
+ specularColor: vec3f, // color contribution from specular lighting
440
+ n: vec3f, // normal at surface point
441
+ v: vec3f, // vector from surface point to camera
442
+ l: vec3f, // direction from the surface toward the current light
443
+ h: vec3f // half vector between the current light and camera
444
+ };
445
+
446
+ const M_PI = 3.141592653589793;
447
+ const c_MinRoughness = 0.04;
448
+
449
+ // Widen sub-pixel specular lobes using the screen-space normal footprint.
450
+ // This is geometric specular antialiasing: the normal variance is converted
451
+ // into an additional squared perceptual roughness before evaluating BRDFs.
452
+ fn widenSpecularRoughness(perceptualRoughness: f32, normal: vec3f) -> f32 {
453
+ let normalDerivativeX = dpdx(normal);
454
+ let normalDerivativeY = dpdy(normal);
455
+ let normalVariance =
456
+ dot(normalDerivativeX, normalDerivativeX) +
457
+ dot(normalDerivativeY, normalDerivativeY);
458
+ let kernelRoughnessSquared = min(2.0 * normalVariance, 1.0);
459
+ return clamp(
460
+ sqrt(perceptualRoughness * perceptualRoughness + kernelRoughnessSquared),
461
+ c_MinRoughness,
462
+ 1.0
463
+ );
464
+ }
465
+
466
+ fn SRGBtoLINEAR(srgbIn: vec4f ) -> vec4f
467
+ {
468
+ var linOut: vec3f = srgbIn.xyz;
469
+ #ifdef MANUAL_SRGB
470
+ let bLess: vec3f = step(vec3f(0.04045), srgbIn.xyz);
471
+ linOut = mix(
472
+ srgbIn.xyz / vec3f(12.92),
473
+ pow((srgbIn.xyz + vec3f(0.055)) / vec3f(1.055), vec3f(2.4)),
474
+ bLess
475
+ );
476
+ #ifdef SRGB_FAST_APPROXIMATION
477
+ linOut = pow(srgbIn.xyz, vec3f(2.2));
478
+ #endif
479
+ #endif
480
+ return vec4f(linOut, srgbIn.w);
481
+ }
482
+
483
+ fn getMaterialUV(uvSet: i32, uvTransform: mat3x3f) -> vec2f
484
+ {
485
+ var baseUV = fragmentInputs.pbr_vUV0;
486
+ if (uvSet == 1) {
487
+ baseUV = fragmentInputs.pbr_vUV1;
488
+ }
489
+ return (uvTransform * vec3f(baseUV, 1.0)).xy;
490
+ }
491
+
492
+ // Build the tangent basis from interpolated attributes or screen-space derivatives.
493
+ fn getTBN(uv: vec2f) -> mat3x3f
494
+ {
495
+ let pos_dx: vec3f = dpdx(fragmentInputs.pbr_vPosition);
496
+ let pos_dy: vec3f = dpdy(fragmentInputs.pbr_vPosition);
497
+ let tex_dx: vec3f = dpdx(vec3f(uv, 0.0));
498
+ let tex_dy: vec3f = dpdy(vec3f(uv, 0.0));
499
+ var t: vec3f = (tex_dy.y * pos_dx - tex_dx.y * pos_dy) / (tex_dx.x * tex_dy.y - tex_dy.x * tex_dx.y);
500
+
501
+ var ng: vec3f = cross(pos_dy, pos_dx);
502
+ #ifdef HAS_NORMALS
503
+ ng = normalize(fragmentInputs.pbr_vNormal);
504
+ #endif
505
+ t = normalize(t - ng * dot(ng, t));
506
+ var b: vec3f = normalize(cross(ng, t));
507
+ var tbn: mat3x3f = mat3x3f(t, b, ng);
508
+ #ifdef HAS_TANGENTS
509
+ tbn = fragmentInputs.pbr_vTBN;
510
+ #endif
511
+
512
+ #ifdef DOUBLE_SIDED
513
+ #ifdef HAS_NORMALS
514
+ // Derivative normals already face the viewer; only flip an authored basis.
515
+ if (!pbr_frontFacing) { tbn = mat3x3f(-tbn[0], -tbn[1], -tbn[2]); }
516
+ #endif
517
+ #endif
518
+ return tbn;
519
+ }
520
+
521
+ // Find the normal for this fragment, pulling either from a predefined normal map
522
+ // or from the interpolated mesh normal and tangent attributes.
523
+ fn getMappedNormal(
524
+ normalSampler: texture_2d<f32>,
525
+ normalSamplerBinding: sampler,
526
+ tbn: mat3x3f,
527
+ normalScale: f32,
528
+ uv: vec2f
529
+ ) -> vec3f
530
+ {
531
+ let n = textureSample(normalSampler, normalSamplerBinding, uv).rgb;
532
+ return normalize(tbn * ((2.0 * n - 1.0) * vec3f(normalScale, normalScale, 1.0)));
533
+ }
534
+
535
+ fn getNormal(tbn: mat3x3f, uv: vec2f) -> vec3f
536
+ {
537
+ // The tbn matrix is linearly interpolated, so we need to re-normalize
538
+ var n: vec3f = normalize(tbn[2].xyz);
539
+ #ifdef HAS_NORMALMAP
540
+ n = getMappedNormal(
541
+ pbr_normalSampler,
542
+ pbr_normalSamplerSampler,
543
+ tbn,
544
+ pbrMaterial.normalScale,
545
+ uv
546
+ );
547
+ #endif
548
+
549
+ #ifdef HAS_BUMPMAP
550
+ let bumpUV = getMaterialUV(pbrMaterial.bumpUVSet, pbrMaterial.bumpUVTransform);
551
+ let bumpTexelSize = 1.0 / vec2f(textureDimensions(pbr_bumpSampler, 0));
552
+ let bumpHeight = textureSample(pbr_bumpSampler, pbr_bumpSamplerSampler, bumpUV).r;
553
+ let bumpGradient = vec2f(
554
+ textureSample(
555
+ pbr_bumpSampler,
556
+ pbr_bumpSamplerSampler,
557
+ bumpUV + vec2f(bumpTexelSize.x, 0.0)
558
+ ).r - bumpHeight,
559
+ textureSample(
560
+ pbr_bumpSampler,
561
+ pbr_bumpSamplerSampler,
562
+ bumpUV + vec2f(0.0, bumpTexelSize.y)
563
+ ).r - bumpHeight
564
+ );
565
+ n = normalize(n - pbrMaterial.bumpFactor *
566
+ (tbn[0] * bumpGradient.x + tbn[1] * bumpGradient.y));
567
+ #endif
568
+
569
+ return n;
570
+ }
571
+
572
+ fn getClearcoatNormal(tbn: mat3x3f, baseNormal: vec3f, uv: vec2f) -> vec3f
573
+ {
574
+ #ifdef HAS_CLEARCOATNORMALMAP
575
+ return getMappedNormal(
576
+ pbr_clearcoatNormalSampler,
577
+ pbr_clearcoatNormalSamplerSampler,
578
+ tbn,
579
+ 1.0,
580
+ uv
581
+ );
582
+ #else
583
+ return baseNormal;
584
+ #endif
585
+ }
586
+
587
+ // Calculation of the lighting contribution from an optional Image Based Light source.
588
+ // Precomputed Environment Maps are required uniform inputs and are computed as outlined in [1].
589
+ // See our README.md on Environment Maps [3] for additional discussion.
590
+ #ifdef USE_IBL
591
+ fn getIBLContribution(pbrInfo: PBRInfo, n: vec3f, reflection: vec3f) -> vec3f
592
+ {
593
+ #ifdef USE_SCENE_ENVIRONMENT
594
+ let maximumMipLevel = max(pbrScene.environmentMipCount - 1.0, 0.0);
595
+ let rotationSine = sin(pbrScene.environmentRotation);
596
+ let rotationCosine = cos(pbrScene.environmentRotation);
597
+ let environmentRotation = mat2x2f(
598
+ vec2f(rotationCosine, rotationSine),
599
+ vec2f(-rotationSine, rotationCosine)
600
+ );
601
+ let rotatedNormal = environmentRotation * n.xz;
602
+ let rotatedReflection = environmentRotation * reflection.xz;
603
+ let environmentNormal = vec3f(rotatedNormal.x, n.y, rotatedNormal.y);
604
+ let environmentReflection = vec3f(rotatedReflection.x, reflection.y, rotatedReflection.y);
605
+ #else
606
+ let maximumMipLevel = 9.0;
607
+ let environmentNormal = n;
608
+ let environmentReflection = reflection;
609
+ #endif
610
+ let lod = pbrInfo.perceptualRoughness * maximumMipLevel;
611
+ // retrieve a scale and bias to F0. See [1], Figure 3
612
+ let brdfSample = textureSampleLevel(
613
+ pbr_brdfLUT,
614
+ pbr_brdfLUTSampler,
615
+ vec2f(pbrInfo.NdotV, 1.0 - pbrInfo.perceptualRoughness),
616
+ 0.0
617
+ );
618
+ let diffuseSample = textureSampleLevel(
619
+ pbr_diffuseEnvSampler,
620
+ pbr_diffuseEnvSamplerSampler,
621
+ environmentNormal,
622
+ 0.0
623
+ );
624
+ var specularSample = textureSampleLevel(
625
+ pbr_specularEnvSampler,
626
+ pbr_specularEnvSamplerSampler,
627
+ environmentReflection,
628
+ 0.0
629
+ );
630
+ #ifdef USE_TEX_LOD
631
+ specularSample = textureSampleLevel(
632
+ pbr_specularEnvSampler,
633
+ pbr_specularEnvSamplerSampler,
634
+ environmentReflection,
635
+ lod
636
+ );
637
+ #endif
638
+
639
+ #ifdef USE_SCENE_ENVIRONMENT
640
+ let brdf = brdfSample.rgb;
641
+ let diffuseLight = diffuseSample.rgb;
642
+ let specularLight = specularSample.rgb;
643
+ #else
644
+ let brdf = SRGBtoLINEAR(brdfSample).rgb;
645
+ let diffuseLight = SRGBtoLINEAR(diffuseSample).rgb;
646
+ let specularLight = SRGBtoLINEAR(specularSample).rgb;
647
+ #endif
648
+
649
+ let diffuse = diffuseLight * pbrInfo.diffuseColor * pbrMaterial.scaleIBLAmbient.x;
650
+ let specular =
651
+ specularLight * (pbrInfo.specularColor * brdf.x + brdf.y) * pbrMaterial.scaleIBLAmbient.y;
652
+
653
+ #ifdef USE_SCENE_ENVIRONMENT
654
+ return (diffuse + specular) * max(pbrScene.environmentIntensity, 0.0);
655
+ #else
656
+ return diffuse + specular;
657
+ #endif
658
+ }
659
+ #endif
660
+
661
+ // Basic Lambertian diffuse
662
+ // Implementation from Lambert's Photometria https://archive.org/details/lambertsphotome00lambgoog
663
+ // See also [1], Equation 1
664
+ fn diffuse(pbrInfo: PBRInfo) -> vec3<f32> {
665
+ return pbrInfo.diffuseColor / M_PI;
666
+ }
667
+
668
+ // The following equation models the Fresnel reflectance term of the spec equation (aka F())
669
+ // Implementation of fresnel from [4], Equation 15
670
+ fn specularReflection(pbrInfo: PBRInfo) -> vec3<f32> {
671
+ return pbrInfo.reflectance0 +
672
+ (pbrInfo.reflectance90 - pbrInfo.reflectance0) *
673
+ pow(clamp(1.0 - pbrInfo.VdotH, 0.0, 1.0), 5.0);
674
+ }
675
+
676
+ // This calculates the specular geometric attenuation (aka G()),
677
+ // where rougher material will reflect less light back to the viewer.
678
+ // This implementation is based on [1] Equation 4, and we adopt their modifications to
679
+ // alphaRoughness as input as originally proposed in [2].
680
+ fn geometricOcclusion(pbrInfo: PBRInfo) -> f32 {
681
+ let NdotL: f32 = pbrInfo.NdotL;
682
+ let NdotV: f32 = pbrInfo.NdotV;
683
+ let r: f32 = pbrInfo.alphaRoughness;
684
+
685
+ let attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL)));
686
+ let attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV)));
687
+ return attenuationL * attenuationV;
688
+ }
689
+
690
+ // The following equation(s) model the distribution of microfacet normals across
691
+ // the area being drawn (aka D())
692
+ // Implementation from "Average Irregularity Representation of a Roughened Surface
693
+ // for Ray Reflection" by T. S. Trowbridge, and K. P. Reitz
694
+ // Follows the distribution function recommended in the SIGGRAPH 2013 course notes
695
+ // from EPIC Games [1], Equation 3.
696
+ fn microfacetDistribution(pbrInfo: PBRInfo) -> f32 {
697
+ let roughnessSq = pbrInfo.alphaRoughness * pbrInfo.alphaRoughness;
698
+ let f = (pbrInfo.NdotH * roughnessSq - pbrInfo.NdotH) * pbrInfo.NdotH + 1.0;
699
+ return roughnessSq / (M_PI * f * f);
700
+ }
701
+
702
+ fn maxComponent(value: vec3f) -> f32 {
703
+ return max(max(value.r, value.g), value.b);
704
+ }
705
+
706
+ fn getDielectricF0(ior: f32) -> f32 {
707
+ let clampedIor = max(ior, 1.0);
708
+ let ratio = (clampedIor - 1.0) / (clampedIor + 1.0);
709
+ return ratio * ratio;
710
+ }
711
+
712
+ fn normalizeDirection(direction: vec2f) -> vec2f {
713
+ let directionLength = length(direction);
714
+ if (directionLength > 0.0001) {
715
+ return direction / directionLength;
716
+ }
717
+
718
+ return vec2f(1.0, 0.0);
719
+ }
720
+
721
+ fn rotateDirection(direction: vec2f, rotation: f32) -> vec2f {
722
+ let s = sin(rotation);
723
+ let c = cos(rotation);
724
+ return vec2f(direction.x * c - direction.y * s, direction.x * s + direction.y * c);
725
+ }
726
+
727
+ fn encodeLinearSRGB(linearColor: vec3f) -> vec3f {
728
+ let positiveColor = max(linearColor, vec3f(0.0));
729
+ return select(
730
+ positiveColor * 12.92,
731
+ 1.055 * pow(positiveColor, vec3f(1.0 / 2.4)) - 0.055,
732
+ positiveColor > vec3f(0.0031308)
733
+ );
734
+ }
735
+
736
+ fn toneMapKhronosPBRNeutral(inputColor: vec3f) -> vec3f {
737
+ let startCompression = 0.76;
738
+ let darkestChannel = min(inputColor.r, min(inputColor.g, inputColor.b));
739
+ let offset = select(
740
+ 0.04,
741
+ darkestChannel - 6.25 * darkestChannel * darkestChannel,
742
+ darkestChannel < 0.08
743
+ );
744
+ var color = inputColor - vec3f(offset);
745
+ let peak = maxComponent(color);
746
+ if (peak < startCompression) {
747
+ return color;
748
+ }
749
+
750
+ let compressionRange = 1.0 - startCompression;
751
+ let compressedPeak = 1.0 - compressionRange * compressionRange /
752
+ (peak + compressionRange - startCompression);
753
+ color *= compressedPeak / max(peak, 0.0001);
754
+ let desaturation = 1.0 - 1.0 / (0.15 * (peak - compressedPeak) + 1.0);
755
+ return mix(color, vec3f(compressedPeak), desaturation);
756
+ }
757
+
758
+ fn applySceneColorManagement(sceneColor: vec3f) -> vec3f {
759
+ #ifdef USE_SCENE_COLOR_MANAGEMENT
760
+ var color = max(sceneColor, vec3f(0.0)) * max(pbrScene.exposure, 0.0);
761
+ if (pbrScene.toneMapMode == 1) {
762
+ color /= vec3f(1.0) + color;
763
+ } else if (pbrScene.toneMapMode == 2) {
764
+ color = toneMapKhronosPBRNeutral(color);
765
+ } else if (pbrScene.toneMapMode == 3) {
766
+ color = clamp(
767
+ (color * (2.51 * color + 0.03)) / (color * (2.43 * color + 0.59) + 0.14),
768
+ vec3f(0.0),
769
+ vec3f(1.0)
770
+ );
771
+ }
772
+ if (pbrScene.outputEncoding == 0) {
773
+ return color;
774
+ }
775
+ return encodeLinearSRGB(color);
776
+ #else
777
+ return pow(max(sceneColor, vec3f(0.0)), vec3f(1.0 / 2.2));
778
+ #endif
779
+ }
780
+
781
+ fn dielectricSchlick(reflectance: f32, cosine: f32) -> f32 {
782
+ return reflectance + (1.0 - reflectance) * pow(clamp(1.0 - cosine, 0.0, 1.0), 5.0);
783
+ }
784
+
785
+ fn evaluateIridescenceSensitivity(opticalPathDifference: f32, phaseShift: vec3f) -> vec3f {
786
+ let phase = 2.0 * M_PI * opticalPathDifference * 1.0e-9;
787
+ let sensitivity = vec3f(5.4856e-13, 4.4201e-13, 5.2481e-13);
788
+ let position = vec3f(1.6810e6, 1.7953e6, 2.2084e6);
789
+ let variance = vec3f(4.3278e9, 9.3046e9, 6.6121e9);
790
+ var xyz = sensitivity * sqrt(2.0 * M_PI * variance) *
791
+ cos(position * phase + phaseShift) * exp(-phase * phase * variance);
792
+ xyz.x += 9.7470e-14 * sqrt(2.0 * M_PI * 4.5282e9) *
793
+ cos(2.2399e6 * phase + phaseShift.x) * exp(-4.5282e9 * phase * phase);
794
+ xyz /= 1.0685e-7;
795
+ return mat3x3f(
796
+ vec3f(3.2404542, -0.9692660, 0.0556434),
797
+ vec3f(-1.5371385, 1.8760108, -0.2040259),
798
+ vec3f(-0.4985314, 0.0415560, 1.0572252)
799
+ ) * xyz;
800
+ }
801
+
802
+ fn getIridescenceTint(
803
+ iridescence: f32,
804
+ thickness: f32,
805
+ NdotV: f32,
806
+ baseReflectance: vec3f
807
+ ) -> vec3f {
808
+ if (iridescence <= 0.0 || thickness <= 0.0) {
809
+ return baseReflectance;
810
+ }
811
+
812
+ let filmIor = max(pbrMaterial.iridescenceIor, 1.0);
813
+ let sineSquared = (1.0 - NdotV * NdotV) / (filmIor * filmIor);
814
+ let cosineSquared = 1.0 - sineSquared;
815
+ if (cosineSquared <= 0.0) {
816
+ return mix(baseReflectance, vec3f(1.0), iridescence);
817
+ }
818
+ let filmCosine = sqrt(cosineSquared);
819
+ let firstInterfaceReflectance = dielectricSchlick(getDielectricF0(filmIor), NdotV);
820
+ let transmittedEnergy = 1.0 - firstInterfaceReflectance;
821
+ let squareRootReflectance = sqrt(clamp(baseReflectance, vec3f(0.0), vec3f(0.9999)));
822
+ let baseIor = (vec3f(1.0) + squareRootReflectance) /
823
+ (vec3f(1.0) - squareRootReflectance);
824
+ var secondInterfaceF0 = (baseIor - vec3f(filmIor)) / (baseIor + vec3f(filmIor));
825
+ secondInterfaceF0 *= secondInterfaceF0;
826
+ let secondInterfaceReflectance = secondInterfaceF0 +
827
+ (vec3f(1.0) - secondInterfaceF0) * pow(1.0 - filmCosine, 5.0);
828
+ let phaseShift = vec3f(M_PI) + select(
829
+ vec3f(0.0),
830
+ vec3f(M_PI),
831
+ baseIor < vec3f(filmIor)
832
+ );
833
+ let opticalPathDifference = 2.0 * filmIor * thickness * filmCosine;
834
+ let combinedReflectance = clamp(
835
+ firstInterfaceReflectance * secondInterfaceReflectance,
836
+ vec3f(0.00001),
837
+ vec3f(0.9999)
838
+ );
839
+ let recurringAmplitude = sqrt(combinedReflectance);
840
+ let interfaceResponse = transmittedEnergy * transmittedEnergy * secondInterfaceReflectance /
841
+ (vec3f(1.0) - combinedReflectance);
842
+ var reflectedSpectrum = vec3f(firstInterfaceReflectance) + interfaceResponse;
843
+ var harmonicAmplitude = interfaceResponse - vec3f(transmittedEnergy);
844
+ for (var harmonic = 1; harmonic <= 2; harmonic++) {
845
+ harmonicAmplitude *= recurringAmplitude;
846
+ reflectedSpectrum += harmonicAmplitude * 2.0 * evaluateIridescenceSensitivity(
847
+ f32(harmonic) * opticalPathDifference,
848
+ f32(harmonic) * phaseShift
849
+ );
850
+ }
851
+ return mix(baseReflectance, clamp(reflectedSpectrum, vec3f(0.0), vec3f(1.0)), iridescence);
852
+ }
853
+
854
+ fn getVolumeAttenuation(thickness: f32) -> vec3f {
855
+ if (thickness <= 0.0) {
856
+ return vec3f(1.0);
857
+ }
858
+
859
+ let attenuationCoefficient =
860
+ -log(max(pbrMaterial.attenuationColor, vec3f(0.0001))) /
861
+ max(pbrMaterial.attenuationDistance, 0.0001);
862
+ return exp(-attenuationCoefficient * thickness);
863
+ }
864
+
865
+ // KHR_materials_volume_scatter is an active draft. This evaluates a local,
866
+ // thickness-aware single-scattering approximation rather than random walk.
867
+ fn getDiffuseTransmissionAttenuation(
868
+ pbrInfo: PBRInfo,
869
+ multiscatterColor: vec3f,
870
+ thickness: f32
871
+ ) -> vec3f {
872
+ let volumeAttenuation = getVolumeAttenuation(thickness);
873
+ let scatteringStrength = maxComponent(multiscatterColor);
874
+ if (thickness <= 0.0 || scatteringStrength <= 0.0001) {
875
+ return volumeAttenuation;
876
+ }
877
+
878
+ let anisotropy = clamp(pbrMaterial.scatterAnisotropy, -0.95, 0.95);
879
+ let scatteringCosine = clamp(dot(-pbrInfo.v, pbrInfo.l), -1.0, 1.0);
880
+ let phaseDenominator = max(
881
+ 1.0 + anisotropy * anisotropy - 2.0 * anisotropy * scatteringCosine,
882
+ 0.0001
883
+ );
884
+ let phaseWeight = clamp(
885
+ (1.0 - anisotropy * anisotropy) / pow(phaseDenominator, 1.5),
886
+ 0.0,
887
+ 4.0
888
+ );
889
+ let scatteringDepth = thickness / max(pbrMaterial.attenuationDistance, 0.0001);
890
+ let scatteringProbability = 1.0 - exp(-scatteringDepth);
891
+ let scatteringColor = clamp(multiscatterColor, vec3f(0.0), vec3f(1.0));
892
+ return mix(
893
+ volumeAttenuation,
894
+ volumeAttenuation * mix(vec3f(1.0), scatteringColor * phaseWeight, scatteringColor),
895
+ scatteringProbability
896
+ );
897
+ }
898
+
899
+ fn calculateDiffuseTransmissionLight(
900
+ pbrInfo: PBRInfo,
901
+ lightColor: vec3f,
902
+ diffuseTransmissionColor: vec3f,
903
+ diffuseTransmission: f32,
904
+ multiscatterColor: vec3f,
905
+ thickness: f32
906
+ ) -> vec3f {
907
+ let oppositeHemisphere = max(dot(-pbrInfo.n, pbrInfo.l), 0.0);
908
+ if (oppositeHemisphere <= 0.0 || diffuseTransmission <= 0.0) {
909
+ return vec3f(0.0);
910
+ }
911
+
912
+ let nonReflectedEnergy = vec3f(1.0) - clamp(pbrInfo.reflectance0, vec3f(0.0), vec3f(1.0));
913
+ let attenuatedColor = getDiffuseTransmissionAttenuation(
914
+ pbrInfo,
915
+ multiscatterColor,
916
+ thickness
917
+ );
918
+ return lightColor * diffuseTransmissionColor * nonReflectedEnergy *
919
+ attenuatedColor * (diffuseTransmission * oppositeHemisphere / M_PI);
920
+ }
921
+
922
+ #ifdef USE_IBL
923
+ fn calculateDiffuseTransmissionIBL(
924
+ pbrInfo: PBRInfo,
925
+ diffuseTransmissionColor: vec3f,
926
+ diffuseTransmission: f32,
927
+ multiscatterColor: vec3f,
928
+ thickness: f32
929
+ ) -> vec3f {
930
+ if (diffuseTransmission <= 0.0) {
931
+ return vec3f(0.0);
932
+ }
933
+
934
+ #ifdef USE_SCENE_ENVIRONMENT
935
+ let rotationSine = sin(pbrScene.environmentRotation);
936
+ let rotationCosine = cos(pbrScene.environmentRotation);
937
+ let environmentRotation = mat2x2f(
938
+ vec2f(rotationCosine, rotationSine),
939
+ vec2f(-rotationSine, rotationCosine)
940
+ );
941
+ let rotatedNormal = environmentRotation * -pbrInfo.n.xz;
942
+ let oppositeNormal = vec3f(rotatedNormal.x, -pbrInfo.n.y, rotatedNormal.y);
943
+ let environmentColor = textureSampleLevel(
944
+ pbr_diffuseEnvSampler,
945
+ pbr_diffuseEnvSamplerSampler,
946
+ oppositeNormal,
947
+ 0.0
948
+ ).rgb * max(pbrScene.environmentIntensity, 0.0);
949
+ #else
950
+ let environmentColor = SRGBtoLINEAR(
951
+ textureSampleLevel(pbr_diffuseEnvSampler, pbr_diffuseEnvSamplerSampler, -pbrInfo.n, 0.0)
952
+ ).rgb;
953
+ #endif
954
+ let nonReflectedEnergy = vec3f(1.0) - clamp(pbrInfo.reflectance0, vec3f(0.0), vec3f(1.0));
955
+ return environmentColor * diffuseTransmissionColor * nonReflectedEnergy *
956
+ getDiffuseTransmissionAttenuation(pbrInfo, multiscatterColor, thickness) *
957
+ diffuseTransmission * pbrMaterial.scaleIBLAmbient.x;
958
+ }
959
+ #endif
960
+
961
+ #ifdef USE_TRANSMISSION_FRAMEBUFFER
962
+ fn sampleTransmittedSceneColor(
963
+ position: vec3f,
964
+ normal: vec3f,
965
+ viewDirection: vec3f,
966
+ thickness: f32,
967
+ perceptualRoughness: f32,
968
+ indexOfRefraction: f32
969
+ ) -> vec3f {
970
+ let refractionDirection = refract(
971
+ -viewDirection,
972
+ normal,
973
+ 1.0 / max(indexOfRefraction, 1.0)
974
+ );
975
+ let refractedPosition = position + refractionDirection * thickness;
976
+ let clipPosition = pbrScene.projectionMatrix *
977
+ pbrScene.viewMatrix * vec4f(refractedPosition, 1.0);
978
+ var textureCoordinate = clipPosition.xy / max(clipPosition.w, 0.0001) * 0.5 + 0.5;
979
+ textureCoordinate.y = 1.0 - textureCoordinate.y;
980
+ textureCoordinate = clamp(textureCoordinate, vec2f(0.001), vec2f(0.999));
981
+
982
+ let blurRadius = perceptualRoughness * perceptualRoughness * 8.0 /
983
+ max(pbrScene.framebufferSize, vec2f(1.0));
984
+ var sceneColor = textureSampleLevel(
985
+ pbr_transmissionFramebufferSampler,
986
+ pbr_transmissionFramebufferSamplerSampler,
987
+ textureCoordinate,
988
+ 0.0
989
+ ).rgb * 0.4;
990
+ sceneColor += textureSampleLevel(
991
+ pbr_transmissionFramebufferSampler,
992
+ pbr_transmissionFramebufferSamplerSampler,
993
+ textureCoordinate + vec2f(blurRadius.x, 0.0),
994
+ 0.0
995
+ ).rgb * 0.15;
996
+ sceneColor += textureSampleLevel(
997
+ pbr_transmissionFramebufferSampler,
998
+ pbr_transmissionFramebufferSamplerSampler,
999
+ textureCoordinate - vec2f(blurRadius.x, 0.0),
1000
+ 0.0
1001
+ ).rgb * 0.15;
1002
+ sceneColor += textureSampleLevel(
1003
+ pbr_transmissionFramebufferSampler,
1004
+ pbr_transmissionFramebufferSamplerSampler,
1005
+ textureCoordinate + vec2f(0.0, blurRadius.y),
1006
+ 0.0
1007
+ ).rgb * 0.15;
1008
+ sceneColor += textureSampleLevel(
1009
+ pbr_transmissionFramebufferSampler,
1010
+ pbr_transmissionFramebufferSamplerSampler,
1011
+ textureCoordinate - vec2f(0.0, blurRadius.y),
1012
+ 0.0
1013
+ ).rgb * 0.15;
1014
+ return max(sceneColor, vec3f(0.0));
1015
+ }
1016
+
1017
+ fn getTransmittedSceneColor(
1018
+ position: vec3f,
1019
+ normal: vec3f,
1020
+ viewDirection: vec3f,
1021
+ thickness: f32,
1022
+ perceptualRoughness: f32
1023
+ ) -> vec3f {
1024
+ if (pbrMaterial.dispersion <= 0.0) {
1025
+ return sampleTransmittedSceneColor(
1026
+ position,
1027
+ normal,
1028
+ viewDirection,
1029
+ thickness,
1030
+ perceptualRoughness,
1031
+ pbrMaterial.ior
1032
+ );
1033
+ }
1034
+
1035
+ let halfSpread = (max(pbrMaterial.ior, 1.0) - 1.0) * 0.025 * pbrMaterial.dispersion;
1036
+ let indicesOfRefraction = max(
1037
+ vec3f(pbrMaterial.ior - halfSpread, pbrMaterial.ior, pbrMaterial.ior + halfSpread),
1038
+ vec3f(1.0)
1039
+ );
1040
+ return vec3f(
1041
+ sampleTransmittedSceneColor(
1042
+ position, normal, viewDirection, thickness, perceptualRoughness, indicesOfRefraction.r
1043
+ ).r,
1044
+ sampleTransmittedSceneColor(
1045
+ position, normal, viewDirection, thickness, perceptualRoughness, indicesOfRefraction.g
1046
+ ).g,
1047
+ sampleTransmittedSceneColor(
1048
+ position, normal, viewDirection, thickness, perceptualRoughness, indicesOfRefraction.b
1049
+ ).b
1050
+ );
1051
+ }
1052
+ #endif
1053
+
1054
+ fn createClearcoatPBRInfo(
1055
+ basePBRInfo: PBRInfo,
1056
+ clearcoatNormal: vec3f,
1057
+ clearcoatRoughness: f32
1058
+ ) -> PBRInfo {
1059
+ let perceptualRoughness = clamp(clearcoatRoughness, c_MinRoughness, 1.0);
1060
+ let alphaRoughness = perceptualRoughness * perceptualRoughness;
1061
+ let NdotV = clamp(abs(dot(clearcoatNormal, basePBRInfo.v)), 0.001, 1.0);
1062
+
1063
+ return PBRInfo(
1064
+ basePBRInfo.NdotL,
1065
+ NdotV,
1066
+ basePBRInfo.NdotH,
1067
+ basePBRInfo.LdotH,
1068
+ basePBRInfo.VdotH,
1069
+ perceptualRoughness,
1070
+ 0.0,
1071
+ vec3f(0.04),
1072
+ vec3f(1.0),
1073
+ alphaRoughness,
1074
+ vec3f(0.0),
1075
+ vec3f(0.04),
1076
+ clearcoatNormal,
1077
+ basePBRInfo.v,
1078
+ basePBRInfo.l,
1079
+ basePBRInfo.h
1080
+ );
1081
+ }
1082
+
1083
+ fn calculateClearcoatContribution(
1084
+ pbrInfo: PBRInfo,
1085
+ lightColor: vec3f,
1086
+ clearcoatNormal: vec3f,
1087
+ clearcoatFactor: f32,
1088
+ clearcoatRoughness: f32
1089
+ ) -> vec3f {
1090
+ if (clearcoatFactor <= 0.0) {
1091
+ return vec3f(0.0);
1092
+ }
1093
+
1094
+ let clearcoatPBRInfo = createClearcoatPBRInfo(pbrInfo, clearcoatNormal, clearcoatRoughness);
1095
+ return calculateFinalColor(clearcoatPBRInfo, lightColor) * clearcoatFactor;
1096
+ }
1097
+
1098
+ #ifdef USE_IBL
1099
+ fn calculateClearcoatIBLContribution(
1100
+ pbrInfo: PBRInfo,
1101
+ clearcoatNormal: vec3f,
1102
+ reflection: vec3f,
1103
+ clearcoatFactor: f32,
1104
+ clearcoatRoughness: f32
1105
+ ) -> vec3f {
1106
+ if (clearcoatFactor <= 0.0) {
1107
+ return vec3f(0.0);
1108
+ }
1109
+
1110
+ let clearcoatPBRInfo = createClearcoatPBRInfo(pbrInfo, clearcoatNormal, clearcoatRoughness);
1111
+ return getIBLContribution(clearcoatPBRInfo, clearcoatNormal, reflection) * clearcoatFactor;
1112
+ }
1113
+ #endif
1114
+
1115
+ fn calculateSheenContribution(
1116
+ pbrInfo: PBRInfo,
1117
+ lightColor: vec3f,
1118
+ sheenColor: vec3f,
1119
+ sheenRoughness: f32
1120
+ ) -> vec3f {
1121
+ if (maxComponent(sheenColor) <= 0.0) {
1122
+ return vec3f(0.0);
1123
+ }
1124
+
1125
+ let alpha = max(sheenRoughness * sheenRoughness, 0.0001);
1126
+ let inverseAlpha = 1.0 / alpha;
1127
+ let sineSquared = max(1.0 - pbrInfo.NdotH * pbrInfo.NdotH, 0.0);
1128
+ let distribution = (2.0 + inverseAlpha) * pow(sineSquared, inverseAlpha * 0.5) /
1129
+ (2.0 * M_PI);
1130
+ let visibility = 1.0 / max(
1131
+ 4.0 * (pbrInfo.NdotL + pbrInfo.NdotV - pbrInfo.NdotL * pbrInfo.NdotV),
1132
+ 0.0001
1133
+ );
1134
+ return pbrInfo.NdotL * lightColor * sheenColor * distribution * visibility *
1135
+ (1.0 - pbrInfo.metalness);
1136
+ }
1137
+
1138
+ fn calculateAnisotropicLightColor(
1139
+ pbrInfo: PBRInfo,
1140
+ lightColor: vec3f,
1141
+ anisotropyTangent: vec3f,
1142
+ anisotropyStrength: f32
1143
+ ) -> vec3f {
1144
+ if (anisotropyStrength <= 0.0) {
1145
+ return calculateFinalColor(pbrInfo, lightColor);
1146
+ }
1147
+
1148
+ let anisotropyBitangent = normalize(cross(pbrInfo.n, anisotropyTangent));
1149
+ let tangentRoughness = mix(
1150
+ pbrInfo.alphaRoughness,
1151
+ 1.0,
1152
+ anisotropyStrength * anisotropyStrength
1153
+ );
1154
+ let bitangentRoughness = clamp(pbrInfo.alphaRoughness, 0.001, 1.0);
1155
+ let roughnessProduct = tangentRoughness * bitangentRoughness;
1156
+ let distributionVector = vec3f(
1157
+ bitangentRoughness * dot(anisotropyTangent, pbrInfo.h),
1158
+ tangentRoughness * dot(anisotropyBitangent, pbrInfo.h),
1159
+ roughnessProduct * pbrInfo.NdotH
1160
+ );
1161
+ let distributionFactor = roughnessProduct /
1162
+ max(dot(distributionVector, distributionVector), 0.000001);
1163
+ let distribution = roughnessProduct * distributionFactor * distributionFactor / M_PI;
1164
+ let viewMask = pbrInfo.NdotL * length(vec3f(
1165
+ tangentRoughness * dot(anisotropyTangent, pbrInfo.v),
1166
+ bitangentRoughness * dot(anisotropyBitangent, pbrInfo.v),
1167
+ pbrInfo.NdotV
1168
+ ));
1169
+ let lightMask = pbrInfo.NdotV * length(vec3f(
1170
+ tangentRoughness * dot(anisotropyTangent, pbrInfo.l),
1171
+ bitangentRoughness * dot(anisotropyBitangent, pbrInfo.l),
1172
+ pbrInfo.NdotL
1173
+ ));
1174
+ let visibility = clamp(0.5 / max(viewMask + lightMask, 0.000001), 0.0, 1.0);
1175
+ let fresnel = specularReflection(pbrInfo);
1176
+ let diffuseContribution = (vec3f(1.0) - fresnel) * diffuse(pbrInfo);
1177
+ return pbrInfo.NdotL * lightColor *
1178
+ (diffuseContribution + fresnel * distribution * visibility);
1179
+ }
1180
+
1181
+ fn getAnisotropicReflection(
1182
+ pbrInfo: PBRInfo,
1183
+ anisotropyTangent: vec3f,
1184
+ anisotropyStrength: f32
1185
+ ) -> vec3f {
1186
+ if (anisotropyStrength <= 0.0) {
1187
+ return -normalize(reflect(pbrInfo.v, pbrInfo.n));
1188
+ }
1189
+ let anisotropyBitangent = normalize(cross(pbrInfo.n, anisotropyTangent));
1190
+ var anisotropicNormal = normalize(cross(anisotropyBitangent, pbrInfo.v));
1191
+ anisotropicNormal = normalize(cross(anisotropicNormal, anisotropyBitangent));
1192
+ let bend = anisotropyStrength * (1.0 - pbrInfo.perceptualRoughness);
1193
+ return -normalize(reflect(pbrInfo.v, normalize(mix(pbrInfo.n, anisotropicNormal, bend))));
1194
+ }
1195
+
1196
+ fn calculateMaterialLightColor(
1197
+ pbrInfo: PBRInfo,
1198
+ lightColor: vec3f,
1199
+ clearcoatNormal: vec3f,
1200
+ clearcoatFactor: f32,
1201
+ clearcoatRoughness: f32,
1202
+ sheenColor: vec3f,
1203
+ sheenRoughness: f32,
1204
+ anisotropyTangent: vec3f,
1205
+ anisotropyStrength: f32
1206
+ ) -> vec3f {
1207
+ var color = calculateAnisotropicLightColor(
1208
+ pbrInfo,
1209
+ lightColor,
1210
+ anisotropyTangent,
1211
+ anisotropyStrength
1212
+ );
1213
+ color += calculateClearcoatContribution(
1214
+ pbrInfo,
1215
+ lightColor,
1216
+ clearcoatNormal,
1217
+ clearcoatFactor,
1218
+ clearcoatRoughness
1219
+ );
1220
+ color += calculateSheenContribution(pbrInfo, lightColor, sheenColor, sheenRoughness);
1221
+ return color;
1222
+ }
1223
+
1224
+ fn PBRInfo_setAmbientLight(pbrInfo: ptr<function, PBRInfo>) {
1225
+ (*pbrInfo).NdotL = 1.0;
1226
+ (*pbrInfo).NdotH = 0.0;
1227
+ (*pbrInfo).LdotH = 0.0;
1228
+ (*pbrInfo).VdotH = 1.0;
1229
+ (*pbrInfo).l = (*pbrInfo).n;
1230
+ (*pbrInfo).h = (*pbrInfo).n;
1231
+ }
1232
+
1233
+ fn PBRInfo_setDirectionalLight(pbrInfo: ptr<function, PBRInfo>, lightDirection: vec3<f32>) {
1234
+ let n = (*pbrInfo).n;
1235
+ let v = (*pbrInfo).v;
1236
+ let l = normalize(lightDirection); // Vector from surface point to light
1237
+ let h = normalize(l + v); // Half vector between both l and v
1238
+
1239
+ (*pbrInfo).NdotL = clamp(dot(n, l), 0.001, 1.0);
1240
+ (*pbrInfo).NdotH = clamp(dot(n, h), 0.0, 1.0);
1241
+ (*pbrInfo).LdotH = clamp(dot(l, h), 0.0, 1.0);
1242
+ (*pbrInfo).VdotH = clamp(dot(v, h), 0.0, 1.0);
1243
+ (*pbrInfo).l = l;
1244
+ (*pbrInfo).h = h;
1245
+ }
1246
+
1247
+ fn PBRInfo_setPointLight(pbrInfo: ptr<function, PBRInfo>, pointLight: PointLight) {
1248
+ let light_direction = normalize(pointLight.position - fragmentInputs.pbr_vPosition);
1249
+ PBRInfo_setDirectionalLight(pbrInfo, light_direction);
1250
+ }
1251
+
1252
+ fn PBRInfo_setSpotLight(pbrInfo: ptr<function, PBRInfo>, spotLight: SpotLight) {
1253
+ let light_direction = normalize(spotLight.position - fragmentInputs.pbr_vPosition);
1254
+ PBRInfo_setDirectionalLight(pbrInfo, light_direction);
1255
+ }
1256
+
1257
+ fn calculateFinalColor(pbrInfo: PBRInfo, lightColor: vec3<f32>) -> vec3<f32> {
1258
+ // Calculate the shading terms for the microfacet specular shading model
1259
+ let F = specularReflection(pbrInfo);
1260
+ let G = geometricOcclusion(pbrInfo);
1261
+ let D = microfacetDistribution(pbrInfo);
1262
+
1263
+ // Calculation of analytical lighting contribution
1264
+ let diffuseContrib = (1.0 - F) * diffuse(pbrInfo);
1265
+ let specContrib = F * G * D / (4.0 * pbrInfo.NdotL * pbrInfo.NdotV);
1266
+ // Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law)
1267
+ return pbrInfo.NdotL * lightColor * (diffuseContrib + specContrib);
1268
+ }
1269
+
1270
+ // Visibility for the first four spotlights; environment and other lights are unaffected.
1271
+ var<private> pbr_ambientVisibility: f32 = 1.0;
1272
+
1273
+ fn pbr_filterColorWithShadows(vertexColor: vec4<f32>, directionalVisibility: f32, pointVisibility: vec4f, spotVisibility: vec4f) -> vec4<f32> {
1274
+ let baseColorUV = getMaterialUV(pbrMaterial.baseColorUVSet, pbrMaterial.baseColorUVTransform);
1275
+ let metallicRoughnessUV = getMaterialUV(
1276
+ pbrMaterial.metallicRoughnessUVSet,
1277
+ pbrMaterial.metallicRoughnessUVTransform
1278
+ );
1279
+ let normalUV = getMaterialUV(pbrMaterial.normalUVSet, pbrMaterial.normalUVTransform);
1280
+ let occlusionUV = getMaterialUV(pbrMaterial.occlusionUVSet, pbrMaterial.occlusionUVTransform);
1281
+ let emissiveUV = getMaterialUV(pbrMaterial.emissiveUVSet, pbrMaterial.emissiveUVTransform);
1282
+ let lightmapUV = getMaterialUV(pbrMaterial.lightmapUVSet, pbrMaterial.lightmapUVTransform);
1283
+ let specularColorUV = getMaterialUV(
1284
+ pbrMaterial.specularColorUVSet,
1285
+ pbrMaterial.specularColorUVTransform
1286
+ );
1287
+ let specularIntensityUV = getMaterialUV(
1288
+ pbrMaterial.specularIntensityUVSet,
1289
+ pbrMaterial.specularIntensityUVTransform
1290
+ );
1291
+ let transmissionUV = getMaterialUV(
1292
+ pbrMaterial.transmissionUVSet,
1293
+ pbrMaterial.transmissionUVTransform
1294
+ );
1295
+ let thicknessUV = getMaterialUV(pbrMaterial.thicknessUVSet, pbrMaterial.thicknessUVTransform);
1296
+ let clearcoatUV = getMaterialUV(pbrMaterial.clearcoatUVSet, pbrMaterial.clearcoatUVTransform);
1297
+ let clearcoatRoughnessUV = getMaterialUV(
1298
+ pbrMaterial.clearcoatRoughnessUVSet,
1299
+ pbrMaterial.clearcoatRoughnessUVTransform
1300
+ );
1301
+ let clearcoatNormalUV = getMaterialUV(
1302
+ pbrMaterial.clearcoatNormalUVSet,
1303
+ pbrMaterial.clearcoatNormalUVTransform
1304
+ );
1305
+ let sheenColorUV = getMaterialUV(
1306
+ pbrMaterial.sheenColorUVSet,
1307
+ pbrMaterial.sheenColorUVTransform
1308
+ );
1309
+ let sheenRoughnessUV = getMaterialUV(
1310
+ pbrMaterial.sheenRoughnessUVSet,
1311
+ pbrMaterial.sheenRoughnessUVTransform
1312
+ );
1313
+ let iridescenceUV = getMaterialUV(
1314
+ pbrMaterial.iridescenceUVSet,
1315
+ pbrMaterial.iridescenceUVTransform
1316
+ );
1317
+ let iridescenceThicknessUV = getMaterialUV(
1318
+ pbrMaterial.iridescenceThicknessUVSet,
1319
+ pbrMaterial.iridescenceThicknessUVTransform
1320
+ );
1321
+ let anisotropyUV = getMaterialUV(
1322
+ pbrMaterial.anisotropyUVSet,
1323
+ pbrMaterial.anisotropyUVTransform
1324
+ );
1325
+ let diffuseTransmissionUV = getMaterialUV(
1326
+ pbrMaterial.diffuseTransmissionUVSet,
1327
+ pbrMaterial.diffuseTransmissionUVTransform
1328
+ );
1329
+ let diffuseTransmissionColorUV = getMaterialUV(
1330
+ pbrMaterial.diffuseTransmissionColorUVSet,
1331
+ pbrMaterial.diffuseTransmissionColorUVTransform
1332
+ );
1333
+ let multiscatterColorUV = getMaterialUV(
1334
+ pbrMaterial.multiscatterColorUVSet,
1335
+ pbrMaterial.multiscatterColorUVTransform
1336
+ );
1337
+
1338
+ // The albedo may be defined from a base texture or a flat color
1339
+ var baseColor: vec4<f32> = pbrMaterial.baseColorFactor * vertexColor;
1340
+ #ifdef HAS_BASECOLORMAP
1341
+ baseColor = SRGBtoLINEAR(
1342
+ textureSample(pbr_baseColorSampler, pbr_baseColorSamplerSampler, baseColorUV)
1343
+ ) * pbrMaterial.baseColorFactor * vertexColor;
1344
+ #endif
1345
+
1346
+ #ifdef ALPHA_CUTOFF
1347
+ if (baseColor.a < pbrMaterial.alphaCutoff) {
1348
+ discard;
1349
+ }
1350
+ #endif
1351
+
1352
+ var color = vec3<f32>(0.0, 0.0, 0.0);
1353
+ var transmission = 0.0;
1354
+
1355
+ var lightmapIrradiance = vec3<f32>(0.0);
1356
+ #ifdef HAS_LIGHTMAP
1357
+ if (pbrMaterial.lightmapMapEnabled != 0u) {
1358
+ lightmapIrradiance = textureSample(pbr_lightmapSampler, pbr_lightmapSamplerSampler, lightmapUV).rgb * pbrMaterial.lightmapIntensity;
1359
+ }
1360
+ #endif
1361
+
1362
+ if (pbrMaterial.unlit != 0u) {
1363
+ color = baseColor.rgb;
1364
+ #ifdef HAS_LIGHTMAP
1365
+ if (pbrMaterial.lightmapMapEnabled != 0u) {
1366
+ color *= lightmapIrradiance / M_PI * pbr_ambientVisibility;
1367
+ #ifdef HAS_OCCLUSIONMAP
1368
+ if (pbrMaterial.occlusionMapEnabled != 0) {
1369
+ let ao = textureSample(pbr_occlusionSampler, pbr_occlusionSamplerSampler, occlusionUV).r;
1370
+ color = mix(color, color * ao, pbrMaterial.occlusionStrength);
1371
+ }
1372
+ #endif
1373
+ }
1374
+ #endif
1375
+ } else {
1376
+ // Metallic and Roughness material properties are packed together
1377
+ // In glTF, these factors can be specified by fixed scalar values
1378
+ // or from a metallic-roughness map
1379
+ var perceptualRoughness = pbrMaterial.metallicRoughnessValues.y;
1380
+ var metallic = pbrMaterial.metallicRoughnessValues.x;
1381
+ #ifdef HAS_METALROUGHNESSMAP
1382
+ // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel.
1383
+ // This layout intentionally reserves the 'r' channel for (optional) occlusion map data
1384
+ let mrSample = textureSample(
1385
+ pbr_metallicRoughnessSampler,
1386
+ pbr_metallicRoughnessSamplerSampler,
1387
+ metallicRoughnessUV
1388
+ );
1389
+ perceptualRoughness = mrSample.g * perceptualRoughness;
1390
+ metallic = mrSample.b * metallic;
1391
+ #endif
1392
+ perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0);
1393
+ metallic = clamp(metallic, 0.0, 1.0);
1394
+ let tbn = getTBN(normalUV);
1395
+ let n = getNormal(tbn, normalUV); // normal at surface point
1396
+ perceptualRoughness = widenSpecularRoughness(perceptualRoughness, n);
1397
+ let v = normalize(pbrProjection.camera - fragmentInputs.pbr_vPosition); // Vector from surface point to camera
1398
+ let NdotV = clamp(abs(dot(n, v)), 0.001, 1.0);
1399
+ var useExtendedPBR = false;
1400
+ #ifdef USE_MATERIAL_EXTENSIONS
1401
+ useExtendedPBR =
1402
+ pbrMaterial.specularColorMapEnabled != 0 ||
1403
+ pbrMaterial.specularIntensityMapEnabled != 0 ||
1404
+ abs(pbrMaterial.specularIntensityFactor - 1.0) > 0.0001 ||
1405
+ maxComponent(abs(pbrMaterial.specularColorFactor - vec3f(1.0))) > 0.0001 ||
1406
+ abs(pbrMaterial.ior - 1.5) > 0.0001 ||
1407
+ pbrMaterial.dispersion > 0.0001 ||
1408
+ pbrMaterial.transmissionMapEnabled != 0 ||
1409
+ pbrMaterial.transmissionFactor > 0.0001 ||
1410
+ pbrMaterial.diffuseTransmissionMapEnabled != 0 ||
1411
+ pbrMaterial.diffuseTransmissionColorMapEnabled != 0 ||
1412
+ pbrMaterial.diffuseTransmissionFactor > 0.0001 ||
1413
+ pbrMaterial.multiscatterColorMapEnabled != 0 ||
1414
+ maxComponent(pbrMaterial.multiscatterColorFactor) > 0.0001 ||
1415
+ pbrMaterial.clearcoatMapEnabled != 0 ||
1416
+ pbrMaterial.clearcoatRoughnessMapEnabled != 0 ||
1417
+ pbrMaterial.clearcoatFactor > 0.0001 ||
1418
+ pbrMaterial.clearcoatRoughnessFactor > 0.0001 ||
1419
+ pbrMaterial.sheenColorMapEnabled != 0 ||
1420
+ pbrMaterial.sheenRoughnessMapEnabled != 0 ||
1421
+ maxComponent(pbrMaterial.sheenColorFactor) > 0.0001 ||
1422
+ pbrMaterial.sheenRoughnessFactor > 0.0001 ||
1423
+ pbrMaterial.iridescenceMapEnabled != 0 ||
1424
+ pbrMaterial.iridescenceFactor > 0.0001 ||
1425
+ abs(pbrMaterial.iridescenceIor - 1.3) > 0.0001 ||
1426
+ abs(pbrMaterial.iridescenceThicknessRange.x - 100.0) > 0.0001 ||
1427
+ abs(pbrMaterial.iridescenceThicknessRange.y - 400.0) > 0.0001 ||
1428
+ pbrMaterial.anisotropyMapEnabled != 0 ||
1429
+ pbrMaterial.anisotropyStrength > 0.0001 ||
1430
+ abs(pbrMaterial.anisotropyRotation) > 0.0001 ||
1431
+ length(pbrMaterial.anisotropyDirection - vec2f(1.0, 0.0)) > 0.0001;
1432
+ #endif
1433
+
1434
+ if (!useExtendedPBR) {
1435
+ let alphaRoughness = perceptualRoughness * perceptualRoughness;
1436
+
1437
+ let f0 = vec3<f32>(0.04);
1438
+ var diffuseColor = baseColor.rgb * (vec3<f32>(1.0) - f0);
1439
+ diffuseColor *= 1.0 - metallic;
1440
+ let specularColor = mix(f0, baseColor.rgb, metallic);
1441
+
1442
+ let reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);
1443
+ let reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0);
1444
+ let specularEnvironmentR0 = specularColor;
1445
+ let specularEnvironmentR90 = vec3<f32>(1.0, 1.0, 1.0) * reflectance90;
1446
+ let reflection = -normalize(reflect(v, n));
1447
+
1448
+ var pbrInfo = PBRInfo(
1449
+ 0.0, // NdotL
1450
+ NdotV,
1451
+ 0.0, // NdotH
1452
+ 0.0, // LdotH
1453
+ 0.0, // VdotH
1454
+ perceptualRoughness,
1455
+ metallic,
1456
+ specularEnvironmentR0,
1457
+ specularEnvironmentR90,
1458
+ alphaRoughness,
1459
+ diffuseColor,
1460
+ specularColor,
1461
+ n,
1462
+ v,
1463
+ n,
1464
+ n
1465
+ );
1466
+
1467
+ #ifdef USE_LIGHTS
1468
+ PBRInfo_setAmbientLight(&pbrInfo);
1469
+ color += calculateFinalColor(pbrInfo, lighting.ambientColor * pbr_ambientVisibility);
1470
+
1471
+ for (var i = 0; i < lighting.directionalLightCount; i++) {
1472
+ if (i < lighting.directionalLightCount) {
1473
+ PBRInfo_setDirectionalLight(&pbrInfo, -lighting_getDirectionalLight(i).direction);
1474
+ color += calculateFinalColor(pbrInfo, lighting_getDirectionalLight(i).color * select(1.0, clamp(directionalVisibility, 0.0, 1.0), i == 0));
1475
+ }
1476
+ }
1477
+
1478
+ for (var i = 0; i < lighting.pointLightCount; i++) {
1479
+ if (i < lighting.pointLightCount) {
1480
+ PBRInfo_setPointLight(&pbrInfo, lighting_getPointLight(i));
1481
+ let attenuation = getPointLightAttenuation(
1482
+ lighting_getPointLight(i),
1483
+ distance(lighting_getPointLight(i).position, fragmentInputs.pbr_vPosition)
1484
+ );
1485
+ color += calculateFinalColor(pbrInfo, lighting_getPointLight(i).color * select(1.0, clamp(pointVisibility[min(i, 3)], 0.0, 1.0), i < 4) / attenuation);
1486
+ }
1487
+ }
1488
+
1489
+ for (var i = 0; i < lighting.spotLightCount; i++) {
1490
+ if (i < lighting.spotLightCount) {
1491
+ PBRInfo_setSpotLight(&pbrInfo, lighting_getSpotLight(i));
1492
+ let attenuation = getSpotLightAttenuation(
1493
+ lighting_getSpotLight(i),
1494
+ fragmentInputs.pbr_vPosition
1495
+ );
1496
+ color += calculateFinalColor(pbrInfo, lighting_getSpotLight(i).color * select(1.0, clamp(spotVisibility[min(i, 3)], 0.0, 1.0), i < 4) / attenuation);
1497
+ }
1498
+ }
1499
+ for (var areaIndex: i32 = 0; areaIndex < areaLighting_getLightCount(); areaIndex++) {
1500
+ #ifdef USE_AREA_LIGHT_LTC
1501
+ color += areaLTC_evaluate(areaIndex, fragmentInputs.pbr_vPosition, pbrInfo.n, pbrInfo.v, pbrInfo.perceptualRoughness, pbrInfo.diffuseColor, pbrInfo.reflectance0, pbrInfo.reflectance90);
1502
+ #else
1503
+ for (var sampleIndex: i32 = 0; sampleIndex < areaLighting.sampleCount; sampleIndex++) {
1504
+ let sampleLight = areaLighting_getSample(areaIndex, sampleIndex, fragmentInputs.pbr_vPosition);
1505
+ if (dot(sampleLight.color, sampleLight.color) > 0.0) {
1506
+ PBRInfo_setPointLight(&pbrInfo, sampleLight);
1507
+ color += calculateFinalColor(pbrInfo, sampleLight.color);
1508
+ }
1509
+ }
1510
+ #endif
1511
+ }
1512
+ #endif
1513
+
1514
+ let indirectBaseColor = color;
1515
+ #ifdef USE_IBL
1516
+ if (pbrMaterial.IBLenabled != 0) {
1517
+ color += getIBLContribution(pbrInfo, n, reflection);
1518
+ }
1519
+ #endif
1520
+
1521
+ // The pinned KHR_lightmap draft explicitly defines c_diff = (1 - metallic) * baseColor.
1522
+ color += baseColor.rgb * (1.0 - metallic) * lightmapIrradiance / M_PI;
1523
+ color = indirectBaseColor + (color - indirectBaseColor) * pbr_ambientVisibility;
1524
+
1525
+ #ifdef HAS_OCCLUSIONMAP
1526
+ if (pbrMaterial.occlusionMapEnabled != 0) {
1527
+ let ao = textureSample(pbr_occlusionSampler, pbr_occlusionSamplerSampler, occlusionUV).r;
1528
+ color = mix(color, color * ao, pbrMaterial.occlusionStrength);
1529
+ }
1530
+ #endif
1531
+
1532
+ var emissive = pbrMaterial.emissiveFactor;
1533
+ #ifdef HAS_EMISSIVEMAP
1534
+ if (pbrMaterial.emissiveMapEnabled != 0u) {
1535
+ emissive *= SRGBtoLINEAR(
1536
+ textureSample(pbr_emissiveSampler, pbr_emissiveSamplerSampler, emissiveUV)
1537
+ ).rgb;
1538
+ }
1539
+ #endif
1540
+ color += emissive * pbrMaterial.emissiveStrength;
1541
+
1542
+ #ifdef PBR_DEBUG
1543
+ color = mix(color, baseColor.rgb, pbrMaterial.scaleDiffBaseMR.y);
1544
+ color = mix(color, vec3<f32>(metallic), pbrMaterial.scaleDiffBaseMR.z);
1545
+ color = mix(color, vec3<f32>(perceptualRoughness), pbrMaterial.scaleDiffBaseMR.w);
1546
+ #endif
1547
+
1548
+ return vec4<f32>(applySceneColorManagement(color), baseColor.a);
1549
+ }
1550
+
1551
+ var specularIntensity = pbrMaterial.specularIntensityFactor;
1552
+ #ifdef HAS_SPECULARINTENSITYMAP
1553
+ if (pbrMaterial.specularIntensityMapEnabled != 0) {
1554
+ specularIntensity *= textureSample(
1555
+ pbr_specularIntensitySampler,
1556
+ pbr_specularIntensitySamplerSampler,
1557
+ specularIntensityUV
1558
+ ).a;
1559
+ }
1560
+ #endif
1561
+
1562
+ var specularFactor = pbrMaterial.specularColorFactor;
1563
+ #ifdef HAS_SPECULARCOLORMAP
1564
+ if (pbrMaterial.specularColorMapEnabled != 0) {
1565
+ specularFactor *= SRGBtoLINEAR(
1566
+ textureSample(
1567
+ pbr_specularColorSampler,
1568
+ pbr_specularColorSamplerSampler,
1569
+ specularColorUV
1570
+ )
1571
+ ).rgb;
1572
+ }
1573
+ #endif
1574
+
1575
+ transmission = pbrMaterial.transmissionFactor;
1576
+ #ifdef HAS_TRANSMISSIONMAP
1577
+ if (pbrMaterial.transmissionMapEnabled != 0) {
1578
+ transmission *= textureSample(
1579
+ pbr_transmissionSampler,
1580
+ pbr_transmissionSamplerSampler,
1581
+ transmissionUV
1582
+ ).r;
1583
+ }
1584
+ #endif
1585
+ transmission = clamp(transmission * (1.0 - metallic), 0.0, 1.0);
1586
+ var thickness = max(pbrMaterial.thicknessFactor, 0.0);
1587
+ #ifdef HAS_THICKNESSMAP
1588
+ thickness *= textureSample(
1589
+ pbr_thicknessSampler,
1590
+ pbr_thicknessSamplerSampler,
1591
+ thicknessUV
1592
+ ).g;
1593
+ #endif
1594
+
1595
+ var diffuseTransmission = clamp(pbrMaterial.diffuseTransmissionFactor, 0.0, 1.0);
1596
+ #ifdef HAS_DIFFUSETRANSMISSIONMAP
1597
+ if (pbrMaterial.diffuseTransmissionMapEnabled != 0) {
1598
+ diffuseTransmission *= textureSample(
1599
+ pbr_diffuseTransmissionSampler,
1600
+ pbr_diffuseTransmissionSamplerSampler,
1601
+ diffuseTransmissionUV
1602
+ ).a;
1603
+ }
1604
+ #endif
1605
+ diffuseTransmission *= (1.0 - metallic) * (1.0 - transmission);
1606
+ var diffuseTransmissionColor = pbrMaterial.diffuseTransmissionColorFactor;
1607
+ #ifdef HAS_DIFFUSETRANSMISSIONCOLORMAP
1608
+ if (pbrMaterial.diffuseTransmissionColorMapEnabled != 0) {
1609
+ diffuseTransmissionColor *= SRGBtoLINEAR(
1610
+ textureSample(
1611
+ pbr_diffuseTransmissionColorSampler,
1612
+ pbr_diffuseTransmissionColorSamplerSampler,
1613
+ diffuseTransmissionColorUV
1614
+ )
1615
+ ).rgb;
1616
+ }
1617
+ #endif
1618
+ var multiscatterColor = pbrMaterial.multiscatterColorFactor;
1619
+ #ifdef HAS_MULTISCATTERCOLORMAP
1620
+ if (pbrMaterial.multiscatterColorMapEnabled != 0) {
1621
+ multiscatterColor *= SRGBtoLINEAR(
1622
+ textureSample(
1623
+ pbr_multiscatterColorSampler,
1624
+ pbr_multiscatterColorSamplerSampler,
1625
+ multiscatterColorUV
1626
+ )
1627
+ ).rgb;
1628
+ }
1629
+ #endif
1630
+
1631
+ let originalTransmission = transmission;
1632
+ var scatterReflection = 0.0;
1633
+ #ifdef HAS_MATERIAL_SCATTER
1634
+ if (thickness <= 0.0) {
1635
+ var strength = clamp(pbrMaterial.scatterStrengthFactor, 0.0, 1.0);
1636
+ #ifdef HAS_DIFFUSETRANSMISSIONMAP
1637
+ if (pbrMaterial.diffuseTransmissionMapEnabled != 0) {
1638
+ strength *= textureSample(
1639
+ pbr_diffuseTransmissionSampler,
1640
+ pbr_diffuseTransmissionSamplerSampler,
1641
+ diffuseTransmissionUV
1642
+ ).a;
1643
+ }
1644
+ #endif
1645
+ let anisotropy = pbrMaterial.scatterAnisotropy;
1646
+ scatterReflection = originalTransmission * strength * (1.0 - anisotropy) * 0.5;
1647
+ diffuseTransmission = originalTransmission * strength * (1.0 + anisotropy) * 0.5;
1648
+ diffuseTransmissionColor = multiscatterColor;
1649
+ transmission *= 1.0 - strength;
1650
+ }
1651
+ #endif
1652
+
1653
+ var clearcoatFactor = pbrMaterial.clearcoatFactor;
1654
+ var clearcoatRoughness = pbrMaterial.clearcoatRoughnessFactor;
1655
+ #ifdef HAS_CLEARCOATMAP
1656
+ if (pbrMaterial.clearcoatMapEnabled != 0) {
1657
+ clearcoatFactor *= textureSample(
1658
+ pbr_clearcoatSampler,
1659
+ pbr_clearcoatSamplerSampler,
1660
+ clearcoatUV
1661
+ ).r;
1662
+ }
1663
+ #endif
1664
+ #ifdef HAS_CLEARCOATROUGHNESSMAP
1665
+ if (pbrMaterial.clearcoatRoughnessMapEnabled != 0) {
1666
+ clearcoatRoughness *= textureSample(
1667
+ pbr_clearcoatRoughnessSampler,
1668
+ pbr_clearcoatRoughnessSamplerSampler,
1669
+ clearcoatRoughnessUV
1670
+ ).g;
1671
+ }
1672
+ #endif
1673
+ clearcoatFactor = clamp(clearcoatFactor, 0.0, 1.0);
1674
+ clearcoatRoughness = clamp(clearcoatRoughness, c_MinRoughness, 1.0);
1675
+ let clearcoatNormal = getClearcoatNormal(getTBN(clearcoatNormalUV), n, clearcoatNormalUV);
1676
+ clearcoatRoughness = widenSpecularRoughness(clearcoatRoughness, clearcoatNormal);
1677
+
1678
+ var sheenColor = pbrMaterial.sheenColorFactor;
1679
+ var sheenRoughness = pbrMaterial.sheenRoughnessFactor;
1680
+ #ifdef HAS_SHEENCOLORMAP
1681
+ if (pbrMaterial.sheenColorMapEnabled != 0) {
1682
+ sheenColor *= SRGBtoLINEAR(
1683
+ textureSample(
1684
+ pbr_sheenColorSampler,
1685
+ pbr_sheenColorSamplerSampler,
1686
+ sheenColorUV
1687
+ )
1688
+ ).rgb;
1689
+ }
1690
+ #endif
1691
+ #ifdef HAS_SHEENROUGHNESSMAP
1692
+ if (pbrMaterial.sheenRoughnessMapEnabled != 0) {
1693
+ sheenRoughness *= textureSample(
1694
+ pbr_sheenRoughnessSampler,
1695
+ pbr_sheenRoughnessSamplerSampler,
1696
+ sheenRoughnessUV
1697
+ ).a;
1698
+ }
1699
+ #endif
1700
+ sheenRoughness = clamp(sheenRoughness, c_MinRoughness, 1.0);
1701
+
1702
+ var iridescence = pbrMaterial.iridescenceFactor;
1703
+ #ifdef HAS_IRIDESCENCEMAP
1704
+ if (pbrMaterial.iridescenceMapEnabled != 0) {
1705
+ iridescence *= textureSample(
1706
+ pbr_iridescenceSampler,
1707
+ pbr_iridescenceSamplerSampler,
1708
+ iridescenceUV
1709
+ ).r;
1710
+ }
1711
+ #endif
1712
+ iridescence = clamp(iridescence, 0.0, 1.0);
1713
+ var iridescenceThickness = mix(
1714
+ pbrMaterial.iridescenceThicknessRange.x,
1715
+ pbrMaterial.iridescenceThicknessRange.y,
1716
+ 0.5
1717
+ );
1718
+ #ifdef HAS_IRIDESCENCETHICKNESSMAP
1719
+ iridescenceThickness = mix(
1720
+ pbrMaterial.iridescenceThicknessRange.x,
1721
+ pbrMaterial.iridescenceThicknessRange.y,
1722
+ textureSample(
1723
+ pbr_iridescenceThicknessSampler,
1724
+ pbr_iridescenceThicknessSamplerSampler,
1725
+ iridescenceThicknessUV
1726
+ ).g
1727
+ );
1728
+ #endif
1729
+
1730
+ var anisotropyStrength = clamp(pbrMaterial.anisotropyStrength, 0.0, 1.0);
1731
+ var anisotropyDirection = normalizeDirection(pbrMaterial.anisotropyDirection);
1732
+ #ifdef HAS_ANISOTROPYMAP
1733
+ if (pbrMaterial.anisotropyMapEnabled != 0) {
1734
+ let anisotropySample = textureSample(
1735
+ pbr_anisotropySampler,
1736
+ pbr_anisotropySamplerSampler,
1737
+ anisotropyUV
1738
+ ).rgb;
1739
+ anisotropyStrength *= anisotropySample.b;
1740
+ let mappedDirection = anisotropySample.rg * 2.0 - 1.0;
1741
+ if (length(mappedDirection) > 0.0001) {
1742
+ anisotropyDirection = normalize(mappedDirection);
1743
+ }
1744
+ }
1745
+ #endif
1746
+ anisotropyDirection = rotateDirection(anisotropyDirection, pbrMaterial.anisotropyRotation);
1747
+ var anisotropyTangent =
1748
+ normalize(tbn[0] * anisotropyDirection.x + tbn[1] * anisotropyDirection.y);
1749
+ if (length(anisotropyTangent) < 0.0001) {
1750
+ anisotropyTangent = normalize(tbn[0]);
1751
+ }
1752
+ // Roughness is authored as perceptual roughness; as is convention,
1753
+ // convert to material roughness by squaring the perceptual roughness [2].
1754
+ let alphaRoughness = perceptualRoughness * perceptualRoughness;
1755
+
1756
+ let dielectricF0 = getDielectricF0(pbrMaterial.ior);
1757
+ var dielectricSpecularF0 = min(
1758
+ vec3f(dielectricF0) * specularFactor * specularIntensity,
1759
+ vec3f(1.0)
1760
+ );
1761
+ dielectricSpecularF0 = getIridescenceTint(
1762
+ iridescence,
1763
+ iridescenceThickness,
1764
+ NdotV,
1765
+ dielectricSpecularF0
1766
+ );
1767
+ var diffuseColor = baseColor.rgb * (vec3f(1.0) - dielectricSpecularF0);
1768
+ diffuseColor *= (1.0 - metallic) * (1.0 - transmission) * (1.0 - diffuseTransmission);
1769
+ #ifdef HAS_MATERIAL_SCATTER
1770
+ diffuseColor = (baseColor.rgb * (1.0 - metallic) * (1.0 - originalTransmission) +
1771
+ multiscatterColor * scatterReflection) * (vec3f(1.0) - dielectricSpecularF0);
1772
+ #endif
1773
+ var specularColor = mix(dielectricSpecularF0, baseColor.rgb, metallic);
1774
+
1775
+ let clearcoatViewFresnel = dielectricSchlick(
1776
+ 0.04,
1777
+ clamp(abs(dot(clearcoatNormal, v)), 0.0, 1.0)
1778
+ );
1779
+ let sheenDirectionalAlbedo = maxComponent(sheenColor) *
1780
+ (0.157 + 0.343 * (1.0 - NdotV)) * (1.0 - sheenRoughness * 0.5);
1781
+ let baseLayerEnergy = (1.0 - clearcoatFactor * clearcoatViewFresnel) *
1782
+ (1.0 - clamp(sheenDirectionalAlbedo, 0.0, 1.0));
1783
+ diffuseColor *= baseLayerEnergy;
1784
+ specularColor *= baseLayerEnergy;
1785
+
1786
+ // Compute reflectance.
1787
+ let reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);
1788
+
1789
+ // For typical incident reflectance range (between 4% to 100%) set the grazing
1790
+ // reflectance to 100% for typical fresnel effect.
1791
+ // For very low reflectance range on highly diffuse objects (below 4%),
1792
+ // incrementally reduce grazing reflectance to 0%.
1793
+ let reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0);
1794
+ let specularEnvironmentR0 = specularColor;
1795
+ let specularEnvironmentR90 = vec3<f32>(1.0, 1.0, 1.0) * reflectance90;
1796
+ let reflection = -normalize(reflect(v, n));
1797
+
1798
+ var pbrInfo = PBRInfo(
1799
+ 0.0, // NdotL
1800
+ NdotV,
1801
+ 0.0, // NdotH
1802
+ 0.0, // LdotH
1803
+ 0.0, // VdotH
1804
+ perceptualRoughness,
1805
+ metallic,
1806
+ specularEnvironmentR0,
1807
+ specularEnvironmentR90,
1808
+ alphaRoughness,
1809
+ diffuseColor,
1810
+ specularColor,
1811
+ n,
1812
+ v,
1813
+ n,
1814
+ n
1815
+ );
1816
+
1817
+ #ifdef USE_LIGHTS
1818
+ // Apply ambient light
1819
+ PBRInfo_setAmbientLight(&pbrInfo);
1820
+ color += calculateMaterialLightColor(
1821
+ pbrInfo,
1822
+ lighting.ambientColor * pbr_ambientVisibility,
1823
+ clearcoatNormal,
1824
+ clearcoatFactor,
1825
+ clearcoatRoughness,
1826
+ sheenColor,
1827
+ sheenRoughness,
1828
+ anisotropyTangent,
1829
+ anisotropyStrength
1830
+ );
1831
+
1832
+ // Apply directional light
1833
+ for (var i = 0; i < lighting.directionalLightCount; i++) {
1834
+ if (i < lighting.directionalLightCount) {
1835
+ PBRInfo_setDirectionalLight(&pbrInfo, -lighting_getDirectionalLight(i).direction);
1836
+ color += calculateMaterialLightColor(
1837
+ pbrInfo,
1838
+ lighting_getDirectionalLight(i).color * select(1.0, clamp(directionalVisibility, 0.0, 1.0), i == 0),
1839
+ clearcoatNormal,
1840
+ clearcoatFactor,
1841
+ clearcoatRoughness,
1842
+ sheenColor,
1843
+ sheenRoughness,
1844
+ anisotropyTangent,
1845
+ anisotropyStrength
1846
+ );
1847
+ color += calculateDiffuseTransmissionLight(
1848
+ pbrInfo,
1849
+ lighting_getDirectionalLight(i).color * select(1.0, clamp(directionalVisibility, 0.0, 1.0), i == 0),
1850
+ diffuseTransmissionColor,
1851
+ diffuseTransmission,
1852
+ multiscatterColor,
1853
+ thickness
1854
+ );
1855
+ }
1856
+ }
1857
+
1858
+ // Apply point light
1859
+ for (var i = 0; i < lighting.pointLightCount; i++) {
1860
+ if (i < lighting.pointLightCount) {
1861
+ PBRInfo_setPointLight(&pbrInfo, lighting_getPointLight(i));
1862
+ let attenuation = getPointLightAttenuation(
1863
+ lighting_getPointLight(i),
1864
+ distance(lighting_getPointLight(i).position, fragmentInputs.pbr_vPosition)
1865
+ );
1866
+ color += calculateMaterialLightColor(
1867
+ pbrInfo,
1868
+ lighting_getPointLight(i).color * select(1.0, clamp(pointVisibility[min(i, 3)], 0.0, 1.0), i < 4) / attenuation,
1869
+ clearcoatNormal,
1870
+ clearcoatFactor,
1871
+ clearcoatRoughness,
1872
+ sheenColor,
1873
+ sheenRoughness,
1874
+ anisotropyTangent,
1875
+ anisotropyStrength
1876
+ );
1877
+ color += calculateDiffuseTransmissionLight(
1878
+ pbrInfo,
1879
+ lighting_getPointLight(i).color * select(1.0, clamp(pointVisibility[min(i, 3)], 0.0, 1.0), i < 4) / attenuation,
1880
+ diffuseTransmissionColor,
1881
+ diffuseTransmission,
1882
+ multiscatterColor,
1883
+ thickness
1884
+ );
1885
+ }
1886
+ }
1887
+
1888
+ for (var i = 0; i < lighting.spotLightCount; i++) {
1889
+ if (i < lighting.spotLightCount) {
1890
+ PBRInfo_setSpotLight(&pbrInfo, lighting_getSpotLight(i));
1891
+ let attenuation = getSpotLightAttenuation(lighting_getSpotLight(i), fragmentInputs.pbr_vPosition);
1892
+ color += calculateMaterialLightColor(
1893
+ pbrInfo,
1894
+ lighting_getSpotLight(i).color * select(1.0, clamp(spotVisibility[min(i, 3)], 0.0, 1.0), i < 4) / attenuation,
1895
+ clearcoatNormal,
1896
+ clearcoatFactor,
1897
+ clearcoatRoughness,
1898
+ sheenColor,
1899
+ sheenRoughness,
1900
+ anisotropyTangent,
1901
+ anisotropyStrength
1902
+ );
1903
+ color += calculateDiffuseTransmissionLight(
1904
+ pbrInfo,
1905
+ lighting_getSpotLight(i).color * select(1.0, clamp(spotVisibility[min(i, 3)], 0.0, 1.0), i < 4) / attenuation,
1906
+ diffuseTransmissionColor,
1907
+ diffuseTransmission,
1908
+ multiscatterColor,
1909
+ thickness
1910
+ );
1911
+ }
1912
+ }
1913
+ for (var areaIndex: i32 = 0; areaIndex < areaLighting_getLightCount(); areaIndex++) {
1914
+ #ifdef USE_AREA_LIGHT_LTC
1915
+ // Unsupported fits retain numerical integration rather than silently dropping material lobes.
1916
+ if (anisotropyStrength <= 0.0001 && dot(sheenColor, sheenColor) <= 0.000001 && diffuseTransmission <= 0.0001) {
1917
+ color += areaLTC_evaluate(areaIndex, fragmentInputs.pbr_vPosition, pbrInfo.n, pbrInfo.v, pbrInfo.perceptualRoughness, pbrInfo.diffuseColor, pbrInfo.reflectance0, pbrInfo.reflectance90);
1918
+ color += clearcoatFactor * areaLTC_specular(areaLighting_getLight(areaIndex), fragmentInputs.pbr_vPosition, clearcoatNormal, pbrInfo.v, clearcoatRoughness, vec3f(0.04), vec3f(1.0));
1919
+ } else {
1920
+ for (var sampleIndex: i32 = 0; sampleIndex < areaLighting.sampleCount; sampleIndex++) {
1921
+ let sampleLight = areaLighting_getSample(areaIndex, sampleIndex, fragmentInputs.pbr_vPosition);
1922
+ if (dot(sampleLight.color, sampleLight.color) > 0.0) {
1923
+ PBRInfo_setPointLight(&pbrInfo, sampleLight);
1924
+ color += calculateMaterialLightColor(pbrInfo, sampleLight.color, clearcoatNormal,
1925
+ clearcoatFactor, clearcoatRoughness, sheenColor, sheenRoughness, anisotropyTangent, anisotropyStrength);
1926
+ color += calculateDiffuseTransmissionLight(pbrInfo, sampleLight.color,
1927
+ diffuseTransmissionColor, diffuseTransmission, multiscatterColor, thickness);
1928
+ }
1929
+ }
1930
+
1931
+ }
1932
+ #else
1933
+ for (var sampleIndex: i32 = 0; sampleIndex < areaLighting.sampleCount; sampleIndex++) {
1934
+ let sampleLight = areaLighting_getSample(areaIndex, sampleIndex, fragmentInputs.pbr_vPosition);
1935
+ if (dot(sampleLight.color, sampleLight.color) > 0.0) {
1936
+ PBRInfo_setPointLight(&pbrInfo, sampleLight);
1937
+ color += calculateMaterialLightColor(pbrInfo, sampleLight.color, clearcoatNormal,
1938
+ clearcoatFactor, clearcoatRoughness, sheenColor, sheenRoughness, anisotropyTangent, anisotropyStrength);
1939
+ color += calculateDiffuseTransmissionLight(pbrInfo, sampleLight.color,
1940
+ diffuseTransmissionColor, diffuseTransmission, multiscatterColor, thickness);
1941
+ }
1942
+ }
1943
+
1944
+ #endif
1945
+ }
1946
+ #endif
1947
+
1948
+ let indirectBaseColor = color;
1949
+ // Calculate lighting contribution from image based lighting source (IBL)
1950
+ #ifdef USE_IBL
1951
+ if (pbrMaterial.IBLenabled != 0) {
1952
+ color += getIBLContribution(
1953
+ pbrInfo,
1954
+ n,
1955
+ getAnisotropicReflection(pbrInfo, anisotropyTangent, anisotropyStrength)
1956
+ );
1957
+ color += calculateClearcoatIBLContribution(
1958
+ pbrInfo,
1959
+ clearcoatNormal,
1960
+ -normalize(reflect(v, clearcoatNormal)),
1961
+ clearcoatFactor,
1962
+ clearcoatRoughness
1963
+ );
1964
+ color += calculateDiffuseTransmissionIBL(
1965
+ pbrInfo,
1966
+ diffuseTransmissionColor,
1967
+ diffuseTransmission,
1968
+ multiscatterColor,
1969
+ thickness
1970
+ );
1971
+ color += sheenColor * pbrMaterial.scaleIBLAmbient.x * (1.0 - sheenRoughness) * 0.25;
1972
+ }
1973
+ #endif
1974
+
1975
+ #ifdef HAS_MATERIAL_SCATTER
1976
+ color += (baseColor.rgb * (1.0 - metallic) * (1.0 - originalTransmission) +
1977
+ multiscatterColor * scatterReflection) * baseLayerEnergy * lightmapIrradiance / M_PI;
1978
+ #else
1979
+ color += baseColor.rgb * (1.0 - metallic) * (1.0 - transmission) *
1980
+ (1.0 - diffuseTransmission) * baseLayerEnergy * lightmapIrradiance / M_PI;
1981
+ #endif
1982
+
1983
+ color = indirectBaseColor + (color - indirectBaseColor) * pbr_ambientVisibility;
1984
+
1985
+ // Apply optional PBR terms for additional (optional) shading
1986
+ #ifdef HAS_OCCLUSIONMAP
1987
+ if (pbrMaterial.occlusionMapEnabled != 0) {
1988
+ let ao = textureSample(pbr_occlusionSampler, pbr_occlusionSamplerSampler, occlusionUV).r;
1989
+ color = mix(color, color * ao, pbrMaterial.occlusionStrength);
1990
+ }
1991
+ #endif
1992
+
1993
+ var emissive = pbrMaterial.emissiveFactor;
1994
+ #ifdef HAS_EMISSIVEMAP
1995
+ if (pbrMaterial.emissiveMapEnabled != 0u) {
1996
+ emissive *= SRGBtoLINEAR(
1997
+ textureSample(pbr_emissiveSampler, pbr_emissiveSamplerSampler, emissiveUV)
1998
+ ).rgb;
1999
+ }
2000
+ #endif
2001
+ color += emissive * pbrMaterial.emissiveStrength;
2002
+
2003
+ if (transmission > 0.0) {
2004
+ #ifdef USE_TRANSMISSION_FRAMEBUFFER
2005
+ let dielectricFresnel = getDielectricF0(pbrMaterial.ior);
2006
+ let transmissionFresnel = dielectricFresnel +
2007
+ (1.0 - dielectricFresnel) * pow(1.0 - NdotV, 5.0);
2008
+ let transmittedColor = getTransmittedSceneColor(
2009
+ fragmentInputs.pbr_vPosition,
2010
+ n,
2011
+ v,
2012
+ thickness,
2013
+ perceptualRoughness
2014
+ );
2015
+ color += transmittedColor * getVolumeAttenuation(thickness) *
2016
+ transmission * (1.0 - transmissionFresnel);
2017
+ #else
2018
+ color = mix(color, color * getVolumeAttenuation(thickness), transmission);
2019
+ #endif
2020
+ }
2021
+
2022
+ // This section uses mix to override final color for reference app visualization
2023
+ // of various parameters in the lighting equation.
2024
+ #ifdef PBR_DEBUG
2025
+ // TODO: Figure out how to debug multiple lights
2026
+
2027
+ // color = mix(color, F, pbr_scaleFGDSpec.x);
2028
+ // color = mix(color, vec3(G), pbr_scaleFGDSpec.y);
2029
+ // color = mix(color, vec3(D), pbr_scaleFGDSpec.z);
2030
+ // color = mix(color, specContrib, pbr_scaleFGDSpec.w);
2031
+
2032
+ // color = mix(color, diffuseContrib, pbr_scaleDiffBaseMR.x);
2033
+ color = mix(color, baseColor.rgb, pbrMaterial.scaleDiffBaseMR.y);
2034
+ color = mix(color, vec3<f32>(metallic), pbrMaterial.scaleDiffBaseMR.z);
2035
+ color = mix(color, vec3<f32>(perceptualRoughness), pbrMaterial.scaleDiffBaseMR.w);
2036
+ #endif
2037
+ }
2038
+
2039
+ #ifdef USE_TRANSMISSION_FRAMEBUFFER
2040
+ let alpha = clamp(baseColor.a, 0.0, 1.0);
2041
+ #else
2042
+ let alpha = clamp(baseColor.a * (1.0 - transmission), 0.0, 1.0);
2043
+ #endif
2044
+ return vec4<f32>(applySceneColorManagement(color), alpha);
2045
+ }
2046
+
2047
+ // Depth-only passes use the same base-color alpha, vertex color and UV transform.
2048
+ fn pbr_discardMaskedFragment(vertexColor: vec4f) {
2049
+ #ifdef ALPHA_CUTOFF
2050
+ var alpha = pbrMaterial.baseColorFactor.a * vertexColor.a;
2051
+ #ifdef HAS_BASECOLORMAP
2052
+ alpha *= textureSample(pbr_baseColorSampler, pbr_baseColorSamplerSampler, getMaterialUV(pbrMaterial.baseColorUVSet, pbrMaterial.baseColorUVTransform)).a;
2053
+ #endif
2054
+ if (alpha < pbrMaterial.alphaCutoff) {discard;}
2055
+ #endif
2056
+ }
2057
+
2058
+ fn pbr_filterColorWithSpotShadows(vertexColor: vec4f, spotVisibility: vec4f) -> vec4f {
2059
+ return pbr_filterColorWithShadows(vertexColor, 1.0, vec4f(1.0), spotVisibility);
2060
+ }
2061
+
2062
+ fn pbr_filterColor(vertexColor: vec4<f32>) -> vec4<f32> {
2063
+ return pbr_filterColorWithSpotShadows(vertexColor, vec4f(1.0));
2064
+ }
2065
+ `;