@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +3 -0
  3. package/dist/RenderingEngine.d.ts +296 -0
  4. package/dist/RenderingEngine.d.ts.map +1 -0
  5. package/dist/RenderingEngine.js +1079 -0
  6. package/dist/RenderingEngine.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +47 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/injectors/Tag3dGeometryCreationInjector.d.ts +11 -0
  12. package/dist/injectors/Tag3dGeometryCreationInjector.d.ts.map +1 -0
  13. package/dist/injectors/Tag3dGeometryCreationInjector.js +169 -0
  14. package/dist/injectors/Tag3dGeometryCreationInjector.js.map +1 -0
  15. package/dist/injectors/TextureUnifierInjector.d.ts +14 -0
  16. package/dist/injectors/TextureUnifierInjector.d.ts.map +1 -0
  17. package/dist/injectors/TextureUnifierInjector.js +227 -0
  18. package/dist/injectors/TextureUnifierInjector.js.map +1 -0
  19. package/dist/interfaces/ILoader.d.ts +4 -0
  20. package/dist/interfaces/ILoader.d.ts.map +1 -0
  21. package/dist/interfaces/ILoader.js +3 -0
  22. package/dist/interfaces/ILoader.js.map +1 -0
  23. package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts +307 -0
  24. package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts.map +1 -0
  25. package/dist/interfaces/IPostProcessingEffectDefinitions.js +31 -0
  26. package/dist/interfaces/IPostProcessingEffectDefinitions.js.map +1 -0
  27. package/dist/interfaces/IRenderingEngine.d.ts +43 -0
  28. package/dist/interfaces/IRenderingEngine.d.ts.map +1 -0
  29. package/dist/interfaces/IRenderingEngine.js +3 -0
  30. package/dist/interfaces/IRenderingEngine.js.map +1 -0
  31. package/dist/loaders/EnvironmentMapLoader.d.ts +98 -0
  32. package/dist/loaders/EnvironmentMapLoader.d.ts.map +1 -0
  33. package/dist/loaders/EnvironmentMapLoader.js +348 -0
  34. package/dist/loaders/EnvironmentMapLoader.js.map +1 -0
  35. package/dist/loaders/GeometryLoader.d.ts +38 -0
  36. package/dist/loaders/GeometryLoader.d.ts.map +1 -0
  37. package/dist/loaders/GeometryLoader.js +505 -0
  38. package/dist/loaders/GeometryLoader.js.map +1 -0
  39. package/dist/loaders/HTMLElementAnchorLoader.d.ts +17 -0
  40. package/dist/loaders/HTMLElementAnchorLoader.d.ts.map +1 -0
  41. package/dist/loaders/HTMLElementAnchorLoader.js +84 -0
  42. package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -0
  43. package/dist/loaders/LightLoader.d.ts +19 -0
  44. package/dist/loaders/LightLoader.d.ts.map +1 -0
  45. package/dist/loaders/LightLoader.js +152 -0
  46. package/dist/loaders/LightLoader.js.map +1 -0
  47. package/dist/loaders/MaterialLoader.d.ts +99 -0
  48. package/dist/loaders/MaterialLoader.d.ts.map +1 -0
  49. package/dist/loaders/MaterialLoader.js +1175 -0
  50. package/dist/loaders/MaterialLoader.js.map +1 -0
  51. package/dist/managers/CameraManager.d.ts +20 -0
  52. package/dist/managers/CameraManager.d.ts.map +1 -0
  53. package/dist/managers/CameraManager.js +195 -0
  54. package/dist/managers/CameraManager.js.map +1 -0
  55. package/dist/managers/EnvironmentGeometryManager.d.ts +43 -0
  56. package/dist/managers/EnvironmentGeometryManager.d.ts.map +1 -0
  57. package/dist/managers/EnvironmentGeometryManager.js +210 -0
  58. package/dist/managers/EnvironmentGeometryManager.js.map +1 -0
  59. package/dist/managers/PostProcessingManager.d.ts +1014 -0
  60. package/dist/managers/PostProcessingManager.d.ts.map +1 -0
  61. package/dist/managers/PostProcessingManager.js +1013 -0
  62. package/dist/managers/PostProcessingManager.js.map +1 -0
  63. package/dist/managers/RenderingManager.d.ts +83 -0
  64. package/dist/managers/RenderingManager.d.ts.map +1 -0
  65. package/dist/managers/RenderingManager.js +567 -0
  66. package/dist/managers/RenderingManager.js.map +1 -0
  67. package/dist/managers/SceneTracingManager.d.ts +26 -0
  68. package/dist/managers/SceneTracingManager.d.ts.map +1 -0
  69. package/dist/managers/SceneTracingManager.js +122 -0
  70. package/dist/managers/SceneTracingManager.js.map +1 -0
  71. package/dist/managers/SceneTreeManager.d.ts +55 -0
  72. package/dist/managers/SceneTreeManager.d.ts.map +1 -0
  73. package/dist/managers/SceneTreeManager.js +501 -0
  74. package/dist/managers/SceneTreeManager.js.map +1 -0
  75. package/dist/managers/postprocessing/GodRaysManager.d.ts +13 -0
  76. package/dist/managers/postprocessing/GodRaysManager.d.ts.map +1 -0
  77. package/dist/managers/postprocessing/GodRaysManager.js +64 -0
  78. package/dist/managers/postprocessing/GodRaysManager.js.map +1 -0
  79. package/dist/managers/postprocessing/OutlineManager.d.ts +15 -0
  80. package/dist/managers/postprocessing/OutlineManager.d.ts.map +1 -0
  81. package/dist/managers/postprocessing/OutlineManager.js +67 -0
  82. package/dist/managers/postprocessing/OutlineManager.js.map +1 -0
  83. package/dist/managers/postprocessing/SSAARenderPass.d.ts +54 -0
  84. package/dist/managers/postprocessing/SSAARenderPass.d.ts.map +1 -0
  85. package/dist/managers/postprocessing/SSAARenderPass.js +234 -0
  86. package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -0
  87. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +15 -0
  88. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts.map +1 -0
  89. package/dist/managers/postprocessing/SelectiveBloomManager.js +67 -0
  90. package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -0
  91. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +47 -0
  92. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts.map +1 -0
  93. package/dist/managers/postprocessing/ao/ao/AOEffect.js +134 -0
  94. package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -0
  95. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +13 -0
  96. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts.map +1 -0
  97. package/dist/managers/postprocessing/ao/ao/AOPass.js +78 -0
  98. package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -0
  99. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +2 -0
  100. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts.map +1 -0
  101. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +23 -0
  102. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js.map +1 -0
  103. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +15 -0
  104. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts.map +1 -0
  105. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +25 -0
  106. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js.map +1 -0
  107. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +2 -0
  108. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts.map +1 -0
  109. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +102 -0
  110. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js.map +1 -0
  111. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts +2 -0
  112. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts.map +1 -0
  113. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js +99 -0
  114. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js.map +1 -0
  115. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +37 -0
  116. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts.map +1 -0
  117. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +171 -0
  118. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -0
  119. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +2 -0
  120. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts.map +1 -0
  121. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +131 -0
  122. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js.map +1 -0
  123. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +15 -0
  124. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts.map +1 -0
  125. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +76 -0
  126. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -0
  127. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +2 -0
  128. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts.map +1 -0
  129. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +134 -0
  130. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js.map +1 -0
  131. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +2 -0
  132. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts.map +1 -0
  133. package/dist/managers/postprocessing/ao/utils/shader/basic.js +12 -0
  134. package/dist/managers/postprocessing/ao/utils/shader/basic.js.map +1 -0
  135. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +2 -0
  136. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts.map +1 -0
  137. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +42 -0
  138. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js.map +1 -0
  139. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +38 -0
  140. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts.map +1 -0
  141. package/dist/managers/postprocessing/utils/CopyMaterial.js +106 -0
  142. package/dist/managers/postprocessing/utils/CopyMaterial.js.map +1 -0
  143. package/dist/managers/postprocessing/utils/CopyShader.d.ts +14 -0
  144. package/dist/managers/postprocessing/utils/CopyShader.d.ts.map +1 -0
  145. package/dist/managers/postprocessing/utils/CopyShader.js +36 -0
  146. package/dist/managers/postprocessing/utils/CopyShader.js.map +1 -0
  147. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +10 -0
  148. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts.map +1 -0
  149. package/dist/managers/postprocessing/utils/FullScreenQuad.js +29 -0
  150. package/dist/managers/postprocessing/utils/FullScreenQuad.js.map +1 -0
  151. package/dist/managers/postprocessing/utils/NormalPass.d.ts +88 -0
  152. package/dist/managers/postprocessing/utils/NormalPass.d.ts.map +1 -0
  153. package/dist/managers/postprocessing/utils/NormalPass.js +157 -0
  154. package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -0
  155. package/dist/managers/postprocessing/utils/RenderPass.d.ts +115 -0
  156. package/dist/managers/postprocessing/utils/RenderPass.d.ts.map +1 -0
  157. package/dist/managers/postprocessing/utils/RenderPass.js +251 -0
  158. package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -0
  159. package/dist/materials/GemMaterial.d.ts +38 -0
  160. package/dist/materials/GemMaterial.d.ts.map +1 -0
  161. package/dist/materials/GemMaterial.js +253 -0
  162. package/dist/materials/GemMaterial.js.map +1 -0
  163. package/dist/materials/MeshUnlitMaterialParameters.d.ts +4 -0
  164. package/dist/materials/MeshUnlitMaterialParameters.d.ts.map +1 -0
  165. package/dist/materials/MeshUnlitMaterialParameters.js +3 -0
  166. package/dist/materials/MeshUnlitMaterialParameters.js.map +1 -0
  167. package/dist/materials/MultiPointsMaterial.d.ts +94 -0
  168. package/dist/materials/MultiPointsMaterial.d.ts.map +1 -0
  169. package/dist/materials/MultiPointsMaterial.js +567 -0
  170. package/dist/materials/MultiPointsMaterial.js.map +1 -0
  171. package/dist/materials/SpecularGlossinessMaterial.d.ts +14 -0
  172. package/dist/materials/SpecularGlossinessMaterial.d.ts.map +1 -0
  173. package/dist/materials/SpecularGlossinessMaterial.js +162 -0
  174. package/dist/materials/SpecularGlossinessMaterial.js.map +1 -0
  175. package/dist/objects/SDBone.d.ts +13 -0
  176. package/dist/objects/SDBone.d.ts.map +1 -0
  177. package/dist/objects/SDBone.js +75 -0
  178. package/dist/objects/SDBone.js.map +1 -0
  179. package/dist/objects/SDColor.d.ts +17 -0
  180. package/dist/objects/SDColor.d.ts.map +1 -0
  181. package/dist/objects/SDColor.js +49 -0
  182. package/dist/objects/SDColor.js.map +1 -0
  183. package/dist/objects/SDData.d.ts +19 -0
  184. package/dist/objects/SDData.d.ts.map +1 -0
  185. package/dist/objects/SDData.js +48 -0
  186. package/dist/objects/SDData.js.map +1 -0
  187. package/dist/objects/SDObject.d.ts +14 -0
  188. package/dist/objects/SDObject.d.ts.map +1 -0
  189. package/dist/objects/SDObject.js +81 -0
  190. package/dist/objects/SDObject.js.map +1 -0
  191. package/dist/shaders/PCSS.d.ts +3 -0
  192. package/dist/shaders/PCSS.d.ts.map +1 -0
  193. package/dist/shaders/PCSS.js +127 -0
  194. package/dist/shaders/PCSS.js.map +1 -0
  195. package/dist/shaders/gem.d.ts +3 -0
  196. package/dist/shaders/gem.d.ts.map +1 -0
  197. package/dist/shaders/gem.js +578 -0
  198. package/dist/shaders/gem.js.map +1 -0
  199. package/dist/shaders/multi_points.d.ts +3 -0
  200. package/dist/shaders/multi_points.d.ts.map +1 -0
  201. package/dist/shaders/multi_points.js +294 -0
  202. package/dist/shaders/multi_points.js.map +1 -0
  203. package/dist/styling/viewport-css.d.ts +2 -0
  204. package/dist/styling/viewport-css.d.ts.map +1 -0
  205. package/dist/styling/viewport-css.js +117 -0
  206. package/dist/styling/viewport-css.js.map +1 -0
  207. package/dist/three/font.d.ts +2365 -0
  208. package/dist/three/font.d.ts.map +1 -0
  209. package/dist/three/font.js +6 -0
  210. package/dist/three/font.js.map +1 -0
  211. package/dist/three/geometries/TextGeometry.d.ts +22 -0
  212. package/dist/three/geometries/TextGeometry.d.ts.map +1 -0
  213. package/dist/three/geometries/TextGeometry.js +45 -0
  214. package/dist/three/geometries/TextGeometry.js.map +1 -0
  215. package/dist/three/loaders/FontLoader.d.ts +15 -0
  216. package/dist/three/loaders/FontLoader.d.ts.map +1 -0
  217. package/dist/three/loaders/FontLoader.js +118 -0
  218. package/dist/three/loaders/FontLoader.js.map +1 -0
  219. package/dist/three/loaders/RGBELoader.d.ts +24 -0
  220. package/dist/three/loaders/RGBELoader.d.ts.map +1 -0
  221. package/dist/three/loaders/RGBELoader.js +299 -0
  222. package/dist/three/loaders/RGBELoader.js.map +1 -0
  223. package/dist/types/IThreejsData.d.ts +7 -0
  224. package/dist/types/IThreejsData.d.ts.map +1 -0
  225. package/dist/types/IThreejsData.js +3 -0
  226. package/dist/types/IThreejsData.js.map +1 -0
  227. package/dist/types/ThreejsData.d.ts +11 -0
  228. package/dist/types/ThreejsData.d.ts.map +1 -0
  229. package/dist/types/ThreejsData.js +42 -0
  230. package/dist/types/ThreejsData.js.map +1 -0
  231. package/package.json +65 -0
  232. package/src/RenderingEngine.ts +1342 -0
  233. package/src/index.ts +23 -0
  234. package/src/injectors/Tag3dGeometryCreationInjector.ts +170 -0
  235. package/src/injectors/TextureUnifierInjector.ts +224 -0
  236. package/src/interfaces/ILoader.ts +3 -0
  237. package/src/interfaces/IPostProcessingEffectDefinitions.ts +402 -0
  238. package/src/interfaces/IRenderingEngine.ts +48 -0
  239. package/src/loaders/EnvironmentMapLoader.ts +355 -0
  240. package/src/loaders/GeometryLoader.ts +565 -0
  241. package/src/loaders/HTMLElementAnchorLoader.ts +107 -0
  242. package/src/loaders/LightLoader.ts +171 -0
  243. package/src/loaders/MaterialLoader.ts +1418 -0
  244. package/src/managers/CameraManager.ts +178 -0
  245. package/src/managers/EnvironmentGeometryManager.ts +224 -0
  246. package/src/managers/PostProcessingManager.ts +1169 -0
  247. package/src/managers/RenderingManager.ts +657 -0
  248. package/src/managers/SceneTracingManager.ts +120 -0
  249. package/src/managers/SceneTreeManager.ts +569 -0
  250. package/src/managers/postprocessing/GodRaysManager.ts +52 -0
  251. package/src/managers/postprocessing/OutlineManager.ts +58 -0
  252. package/src/managers/postprocessing/SSAARenderPass.ts +339 -0
  253. package/src/managers/postprocessing/SelectiveBloomManager.ts +58 -0
  254. package/src/managers/postprocessing/ao/ao/AOEffect.ts +180 -0
  255. package/src/managers/postprocessing/ao/ao/AOPass.ts +128 -0
  256. package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +17 -0
  257. package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +19 -0
  258. package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +41 -0
  259. package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +96 -0
  260. package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +98 -0
  261. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +92 -0
  262. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +95 -0
  263. package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +245 -0
  264. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +125 -0
  265. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +127 -0
  266. package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +106 -0
  267. package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +128 -0
  268. package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +130 -0
  269. package/src/managers/postprocessing/ao/utils/shader/basic.glsl +6 -0
  270. package/src/managers/postprocessing/ao/utils/shader/basic.ts +8 -0
  271. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +36 -0
  272. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +38 -0
  273. package/src/managers/postprocessing/utils/CopyMaterial.ts +130 -0
  274. package/src/managers/postprocessing/utils/CopyShader.ts +39 -0
  275. package/src/managers/postprocessing/utils/FullScreenQuad.ts +47 -0
  276. package/src/managers/postprocessing/utils/NormalPass.ts +222 -0
  277. package/src/managers/postprocessing/utils/RenderPass.ts +366 -0
  278. package/src/materials/GemMaterial.ts +268 -0
  279. package/src/materials/MeshUnlitMaterialParameters.ts +4 -0
  280. package/src/materials/MultiPointsMaterial.ts +646 -0
  281. package/src/materials/SpecularGlossinessMaterial.ts +182 -0
  282. package/src/objects/SDBone.ts +51 -0
  283. package/src/objects/SDColor.ts +54 -0
  284. package/src/objects/SDData.ts +44 -0
  285. package/src/objects/SDObject.ts +58 -0
  286. package/src/shaders/PCSS.ts +124 -0
  287. package/src/shaders/gem.ts +575 -0
  288. package/src/shaders/gem_frag.glsl +517 -0
  289. package/src/shaders/gem_vert.glsl +53 -0
  290. package/src/shaders/multi_points.ts +291 -0
  291. package/src/shaders/multi_points_frag.glsl +166 -0
  292. package/src/shaders/multi_points_vert.glsl +120 -0
  293. package/src/styling/viewport-css.ts +113 -0
  294. package/src/styling/viewport.css +111 -0
  295. package/src/three/font.ts +2 -0
  296. package/src/three/geometries/TextGeometry.ts +58 -0
  297. package/src/three/loaders/FontLoader.ts +205 -0
  298. package/src/three/loaders/RGBELoader.ts +496 -0
  299. package/src/types/IThreejsData.ts +16 -0
  300. package/src/types/ThreejsData.ts +43 -0
  301. package/tsconfig.json +20 -0
@@ -0,0 +1,128 @@
1
+ import { Pass } from 'postprocessing';
2
+ import {
3
+ Camera,
4
+ HalfFloatType,
5
+ Matrix4,
6
+ NearestFilter,
7
+ NoBlending,
8
+ NoColorSpace,
9
+ PerspectiveCamera,
10
+ RepeatWrapping,
11
+ Scene,
12
+ ShaderMaterial,
13
+ TextureLoader,
14
+ Vector2,
15
+ WebGLRenderTarget,
16
+ WebGLRenderer
17
+ } from 'three';
18
+ import { basic as vertexShader } from '../utils/shader/basic';
19
+ import { sampleBlueNoise } from '../utils/shader/sampleBlueNoise';
20
+ import { PoissionDenoisePass } from '../poissionDenoise/PoissionDenoisePass';
21
+
22
+ // a general AO pass that can be used for any AO algorithm
23
+ class AOPass extends Pass {
24
+ // #region Properties (3)
25
+
26
+ private _camera: PerspectiveCamera;
27
+ private _scene: Scene;
28
+
29
+ public renderTarget: WebGLRenderTarget;
30
+
31
+ // #endregion Properties (3)
32
+
33
+ // #region Constructors (1)
34
+
35
+ constructor(camera: Camera, scene: Scene, fragmentShader: string) {
36
+ super();
37
+ this._camera = camera as PerspectiveCamera;
38
+ this._scene = scene;
39
+
40
+ this.renderTarget = new WebGLRenderTarget(1, 1, {
41
+ type: HalfFloatType,
42
+ depthBuffer: false
43
+ });
44
+
45
+ const finalFragmentShader = fragmentShader.replace('#include <sampleBlueNoise>', sampleBlueNoise);
46
+
47
+ this.fullscreenMaterial = new ShaderMaterial({
48
+ fragmentShader: finalFragmentShader,
49
+ vertexShader,
50
+
51
+ uniforms: {
52
+ depthTexture: { value: null },
53
+ normalTexture: { value: null },
54
+ cameraNear: { value: 0 },
55
+ cameraFar: { value: 0 },
56
+ viewMatrix: { value: this._camera.matrixWorldInverse },
57
+ projectionViewMatrix: { value: new Matrix4() },
58
+ projectionMatrixInverse: { value: this._camera.projectionMatrixInverse },
59
+ cameraMatrixWorld: { value: this._camera.matrixWorld },
60
+ texSize: { value: new Vector2() },
61
+ blueNoiseTexture: { value: null },
62
+ blueNoiseRepeat: { value: new Vector2() },
63
+ aoDistance: { value: 0 },
64
+ distancePower: { value: 0 },
65
+ bias: { value: 0 },
66
+ thickness: { value: 0 },
67
+ power: { value: 0 },
68
+ frame: { value: 0 }
69
+ },
70
+
71
+ blending: NoBlending,
72
+ depthWrite: false,
73
+ depthTest: false,
74
+ toneMapped: false
75
+ });
76
+
77
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value = PoissionDenoisePass.blueNoiseTexture;
78
+ }
79
+
80
+ // #endregion Constructors (1)
81
+
82
+ // #region Public Accessors (1)
83
+
84
+ public get texture() {
85
+ return this.renderTarget.texture;
86
+ }
87
+
88
+ // #endregion Public Accessors (1)
89
+
90
+ // #region Public Methods (2)
91
+
92
+ public render(renderer: WebGLRenderer) {
93
+ const spp = +(this.fullscreenMaterial as ShaderMaterial).defines.spp;
94
+
95
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.frame.value = ((this.fullscreenMaterial as ShaderMaterial).uniforms.frame.value + spp) % 65536;
96
+
97
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.cameraNear.value = this._camera.near;
98
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.cameraFar.value = this._camera.far;
99
+
100
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.projectionViewMatrix.value.multiplyMatrices(
101
+ this._camera.projectionMatrix,
102
+ this._camera.matrixWorldInverse
103
+ );
104
+
105
+ const noiseTexture = (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value;
106
+ if (noiseTexture) {
107
+ const { width, height } = noiseTexture.source.data;
108
+
109
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseRepeat.value.set(
110
+ this.renderTarget.width / width,
111
+ this.renderTarget.height / height
112
+ );
113
+ }
114
+
115
+ renderer.setRenderTarget(this.renderTarget);
116
+ renderer.render(this.scene, this.camera);
117
+ }
118
+
119
+ public setSize(width: number, height: number) {
120
+ this.renderTarget.setSize(width, height);
121
+
122
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.texSize.value.set(this.renderTarget.width, this.renderTarget.height);
123
+ }
124
+
125
+ // #endregion Public Methods (2)
126
+ }
127
+
128
+ export { AOPass };
@@ -0,0 +1,17 @@
1
+ uniform sampler2D inputTexture;
2
+ uniform sampler2D depthTexture;
3
+ uniform float power;
4
+ uniform vec3 color;
5
+
6
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
7
+ float unpackedDepth = textureLod(depthTexture, uv, 0.).r;
8
+
9
+ float ao = unpackedDepth > 0.9999 ? 1.0 : textureLod(inputTexture, uv, 0.0).a;
10
+ ao = pow(ao, power);
11
+
12
+ vec3 aoColor = mix(color, vec3(1.), ao);
13
+
14
+ aoColor *= inputColor.rgb;
15
+
16
+ outputColor = vec4(aoColor, inputColor.a);
17
+ }
@@ -0,0 +1,19 @@
1
+ export const ao_compose = `
2
+ uniform sampler2D inputTexture;
3
+ uniform highp sampler2D depthTexture;
4
+ uniform float power;
5
+ uniform vec3 color;
6
+
7
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
8
+ float unpackedDepth = textureLod(depthTexture, uv, 0.).r;
9
+
10
+ float ao = unpackedDepth > 0.9999 ? 1.0 : textureLod(inputTexture, uv, 0.0).a;
11
+ ao = pow(ao, power);
12
+
13
+ vec3 aoColor = mix(color, vec3(1.), ao);
14
+
15
+ aoColor *= inputColor.rgb;
16
+
17
+ outputColor = vec4(aoColor, inputColor.a);
18
+ }
19
+ `
@@ -0,0 +1,41 @@
1
+ import { EffectComposer } from 'postprocessing';
2
+ import { Camera, Scene } from 'three';
3
+ import { AOEffect } from '../ao/AOEffect';
4
+
5
+ import { AOPass } from '../ao/AOPass';
6
+ import { hbao as fragmentShader } from './shader/hbao';
7
+ import { hbao_utils } from './shader/hbao_utils';
8
+
9
+ const finalFragmentShader = fragmentShader.replace('#include <hbao_utils>', hbao_utils);
10
+
11
+ class HBAOPass extends AOPass {
12
+ // #region Constructors (1)
13
+
14
+ constructor(camera: Camera, scene: Scene) {
15
+ super(camera, scene, finalFragmentShader);
16
+ }
17
+
18
+ // #endregion Constructors (1)
19
+ }
20
+
21
+ class HBAOEffect extends AOEffect {
22
+ // #region Properties (1)
23
+
24
+ public lastSize = { width: 0, height: 0, resolutionScale: 0 };
25
+
26
+ // #endregion Properties (1)
27
+
28
+ // #region Constructors (1)
29
+
30
+ constructor(composer: EffectComposer, camera: Camera, scene: Scene, options: { [key: string]: unknown } = AOEffect.DefaultOptions) {
31
+ super(composer, camera, scene, new HBAOPass(camera, scene), {
32
+ ...AOEffect.DefaultOptions,
33
+ ...HBAOEffect.DefaultOptions,
34
+ ...options
35
+ });
36
+ }
37
+
38
+ // #endregion Constructors (1)
39
+ }
40
+
41
+ export { HBAOEffect };
@@ -0,0 +1,96 @@
1
+ varying vec2 vUv;
2
+
3
+ uniform sampler2D depthTexture;
4
+
5
+ uniform mat4 projectionViewMatrix;
6
+ uniform int frame;
7
+
8
+ uniform sampler2D blueNoiseTexture;
9
+ uniform vec2 blueNoiseRepeat;
10
+ uniform vec2 texSize;
11
+
12
+ uniform float aoDistance;
13
+ uniform float distancePower;
14
+ uniform float bias;
15
+ uniform float thickness;
16
+
17
+ #include <packing>
18
+ // HBAO Utils
19
+ #include <hbao_utils>
20
+
21
+ float getOcclusion(const vec3 cameraPosition, const vec3 worldPos, const vec3 worldNormal, const float depth, const int seed, inout float totalWeight) {
22
+ vec4 blueNoise = sampleBlueNoise(blueNoiseTexture, seed, blueNoiseRepeat, texSize);
23
+
24
+ vec3 sampleWorldDir = cosineSampleHemisphere(worldNormal, blueNoise.rg);
25
+
26
+ vec3 sampleWorldPos = worldPos + aoDistance * pow(blueNoise.b, distancePower + 1.0) * sampleWorldDir;
27
+
28
+ // Project the sample position to screen space
29
+ vec4 sampleUv = projectionViewMatrix * vec4(sampleWorldPos, 1.);
30
+ sampleUv.xy /= sampleUv.w;
31
+ sampleUv.xy = sampleUv.xy * 0.5 + 0.5;
32
+
33
+ // Get the depth of the sample position
34
+ float sampleDepth = textureLod(depthTexture, sampleUv.xy, 0.0).r;
35
+
36
+ // Compute the horizon line
37
+ float deltaDepth = depth - sampleDepth;
38
+
39
+ // distance based bias
40
+ float d = distance(sampleWorldPos, cameraPosition) / aoDistance;
41
+ deltaDepth *= 0.001 * d * d;
42
+
43
+ float th = thickness * 0.01;
44
+
45
+ float theta = dot(worldNormal, sampleWorldDir);
46
+ totalWeight += theta;
47
+
48
+ if (deltaDepth < th) {
49
+ float horizon = sampleDepth + deltaDepth * bias * 1000.;
50
+
51
+ float occlusion = max(0.0, horizon - depth) * theta;
52
+
53
+ float m = max(0., 1. - deltaDepth / th);
54
+ occlusion = 10. * occlusion * m / d;
55
+
56
+ occlusion = max(0.0, occlusion);
57
+ occlusion = sqrt(occlusion);
58
+ return occlusion;
59
+ }
60
+
61
+ return 0.;
62
+ }
63
+
64
+ void main() {
65
+ float depth = textureLod(depthTexture, vUv, 0.0).r;
66
+
67
+ // filter out background
68
+ if (depth == 1.0) {
69
+ discard;
70
+ return;
71
+ }
72
+
73
+ vec4 cameraPosition = cameraMatrixWorld * vec4(0.0, 0.0, 0.0, 1.0);
74
+
75
+ vec3 worldPos = getWorldPos(depth, vUv);
76
+ vec3 worldNormal = getWorldNormal(vUv);
77
+
78
+ float ao = 0.0, totalWeight = 0.0;
79
+
80
+ for (int i = 0; i < spp; i++) {
81
+ int seed = i;
82
+ #ifdef animatedNoise
83
+ seed += frame;
84
+ #endif
85
+
86
+ float occlusion = getOcclusion(cameraPosition.xyz, worldPos, worldNormal, depth, seed, totalWeight);
87
+ ao += occlusion;
88
+ }
89
+
90
+ if (totalWeight > 0.) ao /= totalWeight;
91
+
92
+ // clamp ao to [0, 1]
93
+ ao = clamp(1. - ao, 0., 1.);
94
+
95
+ gl_FragColor = vec4(worldNormal, ao);
96
+ }
@@ -0,0 +1,98 @@
1
+ export const hbao = `
2
+ varying vec2 vUv;
3
+
4
+ uniform highp sampler2D depthTexture;
5
+
6
+ uniform mat4 projectionViewMatrix;
7
+ uniform int frame;
8
+
9
+ uniform sampler2D blueNoiseTexture;
10
+ uniform vec2 blueNoiseRepeat;
11
+ uniform vec2 texSize;
12
+
13
+ uniform float aoDistance;
14
+ uniform float distancePower;
15
+ uniform float bias;
16
+ uniform float thickness;
17
+
18
+ #include <packing>
19
+ // HBAO Utils
20
+ #include <hbao_utils>
21
+
22
+ float getOcclusion(const vec3 cameraPosition, const vec3 worldPos, const vec3 worldNormal, const float depth, const int seed, inout float totalWeight) {
23
+ vec4 blueNoise = sampleBlueNoise(blueNoiseTexture, seed, blueNoiseRepeat, texSize);
24
+
25
+ vec3 sampleWorldDir = cosineSampleHemisphere(worldNormal, blueNoise.rg);
26
+
27
+ vec3 sampleWorldPos = worldPos + aoDistance * pow(blueNoise.b, distancePower + 1.0) * sampleWorldDir;
28
+
29
+ // Project the sample position to screen space
30
+ vec4 sampleUv = projectionViewMatrix * vec4(sampleWorldPos, 1.);
31
+ sampleUv.xy /= sampleUv.w;
32
+ sampleUv.xy = sampleUv.xy * 0.5 + 0.5;
33
+
34
+ // Get the depth of the sample position
35
+ float sampleDepth = textureLod(depthTexture, sampleUv.xy, 0.0).r;
36
+
37
+ // Compute the horizon line
38
+ float deltaDepth = depth - sampleDepth;
39
+
40
+ // distance based bias
41
+ float d = distance(sampleWorldPos, cameraPosition) / aoDistance;
42
+ deltaDepth *= 0.001 * d * d;
43
+
44
+ float th = thickness * 0.01;
45
+
46
+ float theta = dot(worldNormal, sampleWorldDir);
47
+ totalWeight += theta;
48
+
49
+ if (deltaDepth < th) {
50
+ float horizon = sampleDepth + deltaDepth * bias * 1000.;
51
+
52
+ float occlusion = max(0.0, horizon - depth) * theta;
53
+
54
+ float m = max(0., 1. - deltaDepth / th);
55
+ occlusion = 10. * occlusion * m / d;
56
+
57
+ occlusion = max(0.0, occlusion);
58
+ occlusion = sqrt(occlusion);
59
+ return occlusion;
60
+ }
61
+
62
+ return 0.;
63
+ }
64
+
65
+ void main() {
66
+ float depth = textureLod(depthTexture, vUv, 0.0).r;
67
+
68
+ // filter out background
69
+ if (depth == 1.0) {
70
+ discard;
71
+ return;
72
+ }
73
+
74
+ vec4 cameraPosition = cameraMatrixWorld * vec4(0.0, 0.0, 0.0, 1.0);
75
+
76
+ vec3 worldPos = getWorldPos(depth, vUv);
77
+ vec3 worldNormal = getWorldNormal(vUv);
78
+
79
+ float ao = 0.0, totalWeight = 0.0;
80
+
81
+ for (int i = 0; i < spp; i++) {
82
+ int seed = i;
83
+ #ifdef animatedNoise
84
+ seed += frame;
85
+ #endif
86
+
87
+ float occlusion = getOcclusion(cameraPosition.xyz, worldPos, worldNormal, depth, seed, totalWeight);
88
+ ao += occlusion;
89
+ }
90
+
91
+ if (totalWeight > 0.) ao /= totalWeight;
92
+
93
+ // clamp ao to [0, 1]
94
+ ao = clamp(1. - ao, 0., 1.);
95
+
96
+ gl_FragColor = vec4(worldNormal, ao);
97
+ }
98
+ `
@@ -0,0 +1,92 @@
1
+ #include <sampleBlueNoise>
2
+
3
+ uniform sampler2D normalTexture;
4
+ uniform float cameraNear;
5
+ uniform float cameraFar;
6
+ uniform mat4 projectionMatrixInverse;
7
+ uniform mat4 cameraMatrixWorld;
8
+
9
+ // source: https://github.com/mrdoob/three.js/blob/342946c8392639028da439b6dc0597e58209c696/examples/js/shaders/SAOShader.js#L123
10
+ float getViewZ(const float depth) {
11
+ #ifdef PERSPECTIVE_CAMERA
12
+ return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);
13
+ #else
14
+ return orthographicDepthToViewZ(depth, cameraNear, cameraFar);
15
+ #endif
16
+ }
17
+
18
+ // source: https://github.com/N8python/ssao/blob/master/EffectShader.js#L52
19
+ vec3 getWorldPos(const float depth, const vec2 coord) {
20
+ float z = depth * 2.0 - 1.0;
21
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
22
+ vec4 viewSpacePosition = projectionMatrixInverse * clipSpacePosition;
23
+
24
+ // Perspective division
25
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
26
+ worldSpacePosition.xyz /= worldSpacePosition.w;
27
+
28
+ return worldSpacePosition.xyz;
29
+ }
30
+
31
+ vec3 slerp(const vec3 a, const vec3 b, const float t) {
32
+ float cosAngle = dot(a, b);
33
+ float angle = acos(cosAngle);
34
+
35
+ if (abs(angle) < 0.001) {
36
+ return mix(a, b, t);
37
+ }
38
+
39
+ float sinAngle = sin(angle);
40
+ float t1 = sin((1.0 - t) * angle) / sinAngle;
41
+ float t2 = sin(t * angle) / sinAngle;
42
+
43
+ return (a * t1) + (b * t2);
44
+ }
45
+
46
+ vec3 computeWorldNormal() {
47
+ vec2 size = vec2(textureSize(depthTexture, 0));
48
+ ivec2 p = ivec2(vUv * size);
49
+ float c0 = texelFetch(depthTexture, p, 0).x;
50
+ float l2 = texelFetch(depthTexture, p - ivec2(2, 0), 0).x;
51
+ float l1 = texelFetch(depthTexture, p - ivec2(1, 0), 0).x;
52
+ float r1 = texelFetch(depthTexture, p + ivec2(1, 0), 0).x;
53
+ float r2 = texelFetch(depthTexture, p + ivec2(2, 0), 0).x;
54
+ float b2 = texelFetch(depthTexture, p - ivec2(0, 2), 0).x;
55
+ float b1 = texelFetch(depthTexture, p - ivec2(0, 1), 0).x;
56
+ float t1 = texelFetch(depthTexture, p + ivec2(0, 1), 0).x;
57
+ float t2 = texelFetch(depthTexture, p + ivec2(0, 2), 0).x;
58
+ float dl = abs((2.0 * l1 - l2) - c0);
59
+ float dr = abs((2.0 * r1 - r2) - c0);
60
+ float db = abs((2.0 * b1 - b2) - c0);
61
+ float dt = abs((2.0 * t1 - t2) - c0);
62
+ vec3 ce = getWorldPos(c0, vUv).xyz;
63
+ vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / size.x, 0.0))).xyz
64
+ : -ce + getWorldPos(r1, (vUv + vec2(1.0 / size.x, 0.0))).xyz;
65
+ vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / size.y))).xyz
66
+ : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / size.y))).xyz;
67
+ return normalize(cross(dpdx, dpdy));
68
+ }
69
+
70
+ vec3 getWorldNormal(const vec2 uv) {
71
+ #ifdef useNormalTexture
72
+ vec3 worldNormal = unpackRGBToNormal(textureLod(normalTexture, uv, 0.).rgb);
73
+
74
+ worldNormal = (vec4(worldNormal, 1.) * viewMatrix).xyz; // view-space to world-space
75
+ return normalize(worldNormal);
76
+ #else
77
+ return computeWorldNormal(); // compute world normal from depth
78
+ #endif
79
+ }
80
+
81
+ #define PI 3.14159265358979323846264338327950288
82
+
83
+ // source: https://www.shadertoy.com/view/cll3R4
84
+ vec3 cosineSampleHemisphere(const vec3 n, const vec2 u) {
85
+ float r = sqrt(u.x);
86
+ float theta = 2.0 * PI * u.y;
87
+
88
+ vec3 b = normalize(cross(n, vec3(0.0, 1.0, 1.0)));
89
+ vec3 t = cross(b, n);
90
+
91
+ return normalize(r * sin(theta) * b + sqrt(1.0 - u.x) * n + r * cos(theta) * t);
92
+ }
@@ -0,0 +1,95 @@
1
+ export const hbao_utils = `
2
+ #include <sampleBlueNoise>
3
+
4
+ uniform sampler2D normalTexture;
5
+ uniform float cameraNear;
6
+ uniform float cameraFar;
7
+ uniform mat4 projectionMatrixInverse;
8
+ uniform mat4 cameraMatrixWorld;
9
+
10
+ // source: https://github.com/mrdoob/three.js/blob/342946c8392639028da439b6dc0597e58209c696/examples/js/shaders/SAOShader.js#L123
11
+ float getViewZ(const float depth) {
12
+ #ifdef PERSPECTIVE_CAMERA
13
+ return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);
14
+ #else
15
+ return orthographicDepthToViewZ(depth, cameraNear, cameraFar);
16
+ #endif
17
+ }
18
+
19
+ // source: https://github.com/N8python/ssao/blob/master/EffectShader.js#L52
20
+ vec3 getWorldPos(const float depth, const vec2 coord) {
21
+ float z = depth * 2.0 - 1.0;
22
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
23
+ vec4 viewSpacePosition = projectionMatrixInverse * clipSpacePosition;
24
+
25
+ // Perspective division
26
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
27
+ worldSpacePosition.xyz /= worldSpacePosition.w;
28
+
29
+ return worldSpacePosition.xyz;
30
+ }
31
+
32
+ vec3 slerp(const vec3 a, const vec3 b, const float t) {
33
+ float cosAngle = dot(a, b);
34
+ float angle = acos(cosAngle);
35
+
36
+ if (abs(angle) < 0.001) {
37
+ return mix(a, b, t);
38
+ }
39
+
40
+ float sinAngle = sin(angle);
41
+ float t1 = sin((1.0 - t) * angle) / sinAngle;
42
+ float t2 = sin(t * angle) / sinAngle;
43
+
44
+ return (a * t1) + (b * t2);
45
+ }
46
+
47
+ vec3 computeWorldNormal() {
48
+ vec2 size = vec2(textureSize(depthTexture, 0));
49
+ ivec2 p = ivec2(vUv * size);
50
+ float c0 = texelFetch(depthTexture, p, 0).x;
51
+ float l2 = texelFetch(depthTexture, p - ivec2(2, 0), 0).x;
52
+ float l1 = texelFetch(depthTexture, p - ivec2(1, 0), 0).x;
53
+ float r1 = texelFetch(depthTexture, p + ivec2(1, 0), 0).x;
54
+ float r2 = texelFetch(depthTexture, p + ivec2(2, 0), 0).x;
55
+ float b2 = texelFetch(depthTexture, p - ivec2(0, 2), 0).x;
56
+ float b1 = texelFetch(depthTexture, p - ivec2(0, 1), 0).x;
57
+ float t1 = texelFetch(depthTexture, p + ivec2(0, 1), 0).x;
58
+ float t2 = texelFetch(depthTexture, p + ivec2(0, 2), 0).x;
59
+ float dl = abs((2.0 * l1 - l2) - c0);
60
+ float dr = abs((2.0 * r1 - r2) - c0);
61
+ float db = abs((2.0 * b1 - b2) - c0);
62
+ float dt = abs((2.0 * t1 - t2) - c0);
63
+ vec3 ce = getWorldPos(c0, vUv).xyz;
64
+ vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / size.x, 0.0))).xyz
65
+ : -ce + getWorldPos(r1, (vUv + vec2(1.0 / size.x, 0.0))).xyz;
66
+ vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / size.y))).xyz
67
+ : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / size.y))).xyz;
68
+ return normalize(cross(dpdx, dpdy));
69
+ }
70
+
71
+ vec3 getWorldNormal(const vec2 uv) {
72
+ #ifdef useNormalTexture
73
+ vec3 worldNormal = unpackRGBToNormal(textureLod(normalTexture, uv, 0.).rgb);
74
+
75
+ worldNormal = (vec4(worldNormal, 1.) * viewMatrix).xyz; // view-space to world-space
76
+ return normalize(worldNormal);
77
+ #else
78
+ return computeWorldNormal(); // compute world normal from depth
79
+ #endif
80
+ }
81
+
82
+ #define PI 3.14159265358979323846264338327950288
83
+
84
+ // source: https://www.shadertoy.com/view/cll3R4
85
+ vec3 cosineSampleHemisphere(const vec3 n, const vec2 u) {
86
+ float r = sqrt(u.x);
87
+ float theta = 2.0 * PI * u.y;
88
+
89
+ vec3 b = normalize(cross(n, vec3(0.0, 1.0, 1.0)));
90
+ vec3 t = cross(b, n);
91
+
92
+ return normalize(r * sin(theta) * b + sqrt(1.0 - u.x) * n + r * cos(theta) * t);
93
+ }
94
+
95
+ `