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

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