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