three-base 2.0.137 → 2.0.142

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 (307) hide show
  1. package/DirectionalLight.d.ts +6 -6
  2. package/DirectionalLight.js +68 -68
  3. package/DirectionalLight.ts +70 -0
  4. package/EventMap.d.ts +103 -0
  5. package/EventMap.js +17 -0
  6. package/EventMap.ts +139 -0
  7. package/EventMesh.d.ts +18 -18
  8. package/EventMesh.js +59 -59
  9. package/EventMesh.ts +60 -0
  10. package/ExtrudeMesh.d.ts +112 -112
  11. package/ExtrudeMesh.js +342 -366
  12. package/ExtrudeMesh.ts +553 -0
  13. package/FPScontrol.d.ts +511 -78
  14. package/FPScontrol.js +1799 -617
  15. package/FPScontrol.ts +1855 -0
  16. package/Fire/Fire.d.ts +28 -28
  17. package/Fire/Fire.js +80 -79
  18. package/Fire/Fire.ts +89 -0
  19. package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +9 -9
  20. package/Fire/{FireGromtry.js → FireGeometry.js} +40 -40
  21. package/Fire/FireGeometry.ts +40 -0
  22. package/Fire/FireMaterial.d.ts +28 -28
  23. package/Fire/FireMaterial.js +32 -32
  24. package/Fire/FireMaterial.ts +89 -0
  25. package/Fire/index.d.ts +2 -1
  26. package/Fire/index.js +2 -1
  27. package/Fire/index.ts +2 -0
  28. package/GLTFDracoLoader.d.ts +71 -0
  29. package/GLTFDracoLoader.js +266 -0
  30. package/GLTFDracoLoader.ts +430 -0
  31. package/Grass/Grass.d.ts +8 -8
  32. package/Grass/Grass.js +38 -38
  33. package/Grass/Grass.ts +38 -0
  34. package/Grass/index.d.ts +2 -1
  35. package/Grass/index.js +2 -1
  36. package/Grass/index.ts +2 -0
  37. package/Ground1/Ground1.d.ts +10 -11
  38. package/Ground1/Ground1.js +95 -91
  39. package/Ground1/Ground1.ts +114 -0
  40. package/Ground1/index.d.ts +1 -1
  41. package/Ground1/index.js +1 -1
  42. package/Ground1/index.ts +1 -0
  43. package/MeshBase.d.ts +36 -35
  44. package/MeshBase.js +247 -223
  45. package/MeshBase.ts +253 -0
  46. package/Mirror.d.ts +25 -25
  47. package/Mirror.js +143 -139
  48. package/Mirror.ts +203 -0
  49. package/MktMesh/MktMesh.d.ts +291 -0
  50. package/MktMesh/MktMesh.js +1045 -0
  51. package/MktMesh/MktMesh.ts +1075 -0
  52. package/MktMesh/assetUrl.d.ts +35 -0
  53. package/MktMesh/assetUrl.js +69 -0
  54. package/MktMesh/assetUrl.ts +69 -0
  55. package/MktMesh/mktMappingShader.d.ts +12 -0
  56. package/MktMesh/mktMappingShader.js +139 -0
  57. package/MktMesh/mktMappingShader.ts +139 -0
  58. package/MktMesh/mktShader.d.ts +263 -0
  59. package/MktMesh/mktShader.js +1248 -0
  60. package/MktMesh/mktShader.ts +1344 -0
  61. package/MktMesh/panoBitmapTexture.d.ts +25 -0
  62. package/MktMesh/panoBitmapTexture.js +52 -0
  63. package/MktMesh/panoBitmapTexture.ts +54 -0
  64. package/MktMesh/panoSlotBind.d.ts +29 -0
  65. package/MktMesh/panoSlotBind.js +106 -0
  66. package/MktMesh/panoSlotBind.ts +153 -0
  67. package/MktMesh/panoSlotRoster.d.ts +22 -0
  68. package/MktMesh/panoSlotRoster.js +169 -0
  69. package/MktMesh/panoSlotRoster.ts +168 -0
  70. package/MktMesh/panoTileStitcher.d.ts +119 -0
  71. package/MktMesh/panoTileStitcher.js +533 -0
  72. package/MktMesh/panoTileStitcher.ts +616 -0
  73. package/MktMesh/types.d.ts +75 -0
  74. package/MktMesh/types.js +1 -0
  75. package/MktMesh/types.ts +87 -0
  76. package/MktMesh/wallCapTessellate.d.ts +33 -0
  77. package/MktMesh/wallCapTessellate.js +97 -0
  78. package/MktMesh/wallCapTessellate.ts +68 -0
  79. package/PipeMesh/PathGeometry.d.ts +44 -44
  80. package/PipeMesh/PathGeometry.js +307 -300
  81. package/PipeMesh/PathGeometry.ts +343 -0
  82. package/PipeMesh/PathPoint.d.ts +17 -17
  83. package/PipeMesh/PathPoint.js +31 -31
  84. package/PipeMesh/PathPoint.ts +36 -0
  85. package/PipeMesh/PathPointList.d.ts +31 -31
  86. package/PipeMesh/PathPointList.js +209 -208
  87. package/PipeMesh/PathPointList.ts +227 -0
  88. package/PipeMesh/PathTubeGeometry.d.ts +25 -25
  89. package/PipeMesh/PathTubeGeometry.js +130 -130
  90. package/PipeMesh/PathTubeGeometry.ts +146 -0
  91. package/PipeMesh/PipeMesh.d.ts +25 -25
  92. package/PipeMesh/PipeMesh.js +63 -63
  93. package/PipeMesh/PipeMesh.ts +76 -0
  94. package/PipeMesh/index.d.ts +1 -1
  95. package/PipeMesh/index.js +1 -1
  96. package/PipeMesh/index.ts +1 -0
  97. package/PlaneModal1/PlaneModal1.d.ts +34 -31
  98. package/PlaneModal1/PlaneModal1.js +109 -105
  99. package/PlaneModal1/PlaneModal1.ts +138 -0
  100. package/PlaneModal1/index.d.ts +1 -1
  101. package/PlaneModal1/index.js +1 -1
  102. package/PlaneModal1/index.ts +1 -0
  103. package/PlaneText.d.ts +27 -39
  104. package/PlaneText.js +35 -30
  105. package/PlaneText.ts +55 -0
  106. package/PlaneWithHtml.d.ts +13 -11
  107. package/PlaneWithHtml.js +64 -63
  108. package/PlaneWithHtml.ts +70 -0
  109. package/PointLight/PointLight.d.ts +13 -14
  110. package/PointLight/PointLight.js +64 -70
  111. package/PointLight/PointLight.ts +67 -0
  112. package/PointLight/index.d.ts +1 -1
  113. package/PointLight/index.js +1 -1
  114. package/PointLight/index.ts +1 -0
  115. package/README.md +110 -79
  116. package/Sky/Sky.d.ts +9 -9
  117. package/Sky/Sky.js +22 -22
  118. package/Sky/Sky.ts +22 -0
  119. package/Sky/index.d.ts +1 -1
  120. package/Sky/index.js +1 -1
  121. package/Sky/index.ts +1 -0
  122. package/SpotLight.d.ts +6 -6
  123. package/SpotLight.js +72 -72
  124. package/SpotLight.ts +74 -0
  125. package/SpriteModal1/SpriteModal1.d.ts +33 -30
  126. package/SpriteModal1/SpriteModal1.js +116 -110
  127. package/SpriteModal1/SpriteModal1.ts +146 -0
  128. package/SpriteModal1/index.d.ts +1 -1
  129. package/SpriteModal1/index.js +1 -1
  130. package/SpriteModal1/index.ts +1 -0
  131. package/SpriteText.d.ts +46 -45
  132. package/SpriteText.js +176 -163
  133. package/SpriteText.ts +205 -0
  134. package/SpriteText2.d.ts +48 -47
  135. package/SpriteText2.js +223 -198
  136. package/SpriteText2.ts +258 -0
  137. package/SpriteText3.d.ts +86 -0
  138. package/SpriteText3.js +519 -0
  139. package/SpriteText3.ts +599 -0
  140. package/SpriteWithHtml.d.ts +9 -7
  141. package/SpriteWithHtml.js +44 -44
  142. package/SpriteWithHtml.ts +50 -0
  143. package/Text3D/Text3D.d.ts +20 -20
  144. package/Text3D/Text3D.js +58 -62
  145. package/Text3D/Text3D.ts +77 -0
  146. package/Text3D/fontController.d.ts +60 -59
  147. package/Text3D/fontController.js +166 -199
  148. package/Text3D/fontController.ts +209 -0
  149. package/Text3D/index.d.ts +1 -1
  150. package/Text3D/index.js +1 -1
  151. package/Text3D/index.ts +1 -0
  152. package/ThreeBase.d.ts +248 -111
  153. package/ThreeBase.js +1202 -656
  154. package/ThreeBase.ts +1314 -0
  155. package/ThreeMouse.d.ts +54 -40
  156. package/ThreeMouse.js +453 -407
  157. package/ThreeMouse.ts +472 -0
  158. package/Transition.d.ts +45 -40
  159. package/Transition.js +209 -210
  160. package/Transition.ts +242 -0
  161. package/Water/Water.d.ts +5 -5
  162. package/Water/Water.js +44 -26
  163. package/Water/Water.ts +45 -0
  164. package/Water/index.d.ts +2 -0
  165. package/Water/index.js +2 -0
  166. package/Water/index.ts +2 -0
  167. package/WaterFlow/FloatingDuck.d.ts +88 -0
  168. package/WaterFlow/FloatingDuck.js +307 -0
  169. package/WaterFlow/FloatingDuck.ts +445 -0
  170. package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
  171. package/WaterFlow/GPUFluidSimulation.js +785 -0
  172. package/WaterFlow/GPUFluidSimulation.ts +827 -0
  173. package/WaterFlow/ReservoirSystem.d.ts +106 -0
  174. package/WaterFlow/ReservoirSystem.js +621 -0
  175. package/WaterFlow/ReservoirSystem.ts +754 -0
  176. package/WaterFlow/SPHField.d.ts +35 -0
  177. package/WaterFlow/SPHField.js +204 -0
  178. package/WaterFlow/SPHField.ts +228 -0
  179. package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
  180. package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
  181. package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
  182. package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
  183. package/WaterFlow/ShallowWaterSurface.js +441 -0
  184. package/WaterFlow/ShallowWaterSurface.ts +510 -0
  185. package/WaterFlow/WaterFlow.d.ts +87 -0
  186. package/WaterFlow/WaterFlow.js +171 -0
  187. package/WaterFlow/WaterFlow.ts +219 -0
  188. package/WaterFlow/types.d.ts +161 -0
  189. package/WaterFlow/types.js +1 -0
  190. package/WaterFlow/types.ts +189 -0
  191. package/WaterFlow/waterFlowPass.d.ts +3 -0
  192. package/WaterFlow/waterFlowPass.js +20 -0
  193. package/WaterFlow/waterFlowPass.ts +40 -0
  194. package/collisionOBB.d.ts +42 -0
  195. package/collisionOBB.js +112 -0
  196. package/collisionOBB.ts +108 -0
  197. package/declare.d.ts +23 -165
  198. package/index.d.ts +1 -1
  199. package/index.js +1 -2
  200. package/index.ts +1 -0
  201. package/instanced/InstancedBatch.d.ts +57 -0
  202. package/instanced/InstancedBatch.js +348 -0
  203. package/instanced/InstancedBatch.ts +406 -0
  204. package/instanced/InstancedChild.d.ts +174 -0
  205. package/instanced/InstancedChild.js +264 -0
  206. package/instanced/InstancedChild.ts +327 -0
  207. package/instanced/InstancedGroup.d.ts +43 -0
  208. package/instanced/InstancedGroup.js +126 -0
  209. package/instanced/InstancedGroup.ts +137 -0
  210. package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +38 -39
  211. package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +282 -293
  212. package/instanced/InstancedMeshBase.ts +292 -0
  213. package/instanced/InstancedTemplate.d.ts +46 -0
  214. package/instanced/InstancedTemplate.js +125 -0
  215. package/instanced/InstancedTemplate.ts +188 -0
  216. package/keyControls.d.ts +30 -0
  217. package/{keyContorls.js → keyControls.js} +101 -98
  218. package/keyControls.ts +107 -0
  219. package/lensflare/LensFlare.d.ts +39 -0
  220. package/lensflare/LensFlare.js +373 -0
  221. package/lensflare/LensFlare.ts +448 -0
  222. package/lensflare/lensflare0.png +0 -0
  223. package/lensflare/lensflare3.png +0 -0
  224. package/lensflare/lensflare_custom.png +0 -0
  225. package/lensflare/lensflare_hex_ghost.png +0 -0
  226. package/lensflare/lensflare_hex_main.png +0 -0
  227. package/package.json +99 -25
  228. package/pass/bloom_pass.d.ts +2 -2
  229. package/pass/bloom_pass.js +188 -101
  230. package/pass/bloom_pass.ts +243 -0
  231. package/pass/cover_pass.d.ts +2 -2
  232. package/pass/cover_pass.js +122 -99
  233. package/pass/cover_pass.ts +182 -0
  234. package/pass/debugDepthState.d.ts +20 -0
  235. package/pass/debugDepthState.js +9 -0
  236. package/pass/debugDepthState.ts +22 -0
  237. package/pass/depthTestBias.d.ts +12 -0
  238. package/pass/depthTestBias.js +12 -0
  239. package/pass/depthTestBias.ts +12 -0
  240. package/pass/effectUserData.d.ts +27 -0
  241. package/pass/effectUserData.js +1 -0
  242. package/pass/effectUserData.ts +46 -0
  243. package/pass/frosted_glass_pass.d.ts +2 -2
  244. package/pass/frosted_glass_pass.js +167 -186
  245. package/pass/frosted_glass_pass.ts +288 -0
  246. package/pass/fsQuad.d.ts +9 -9
  247. package/pass/fsQuad.js +28 -28
  248. package/pass/fsQuad.ts +34 -0
  249. package/pass/glow_pass.d.ts +2 -2
  250. package/pass/glow_pass.js +449 -233
  251. package/pass/glow_pass.ts +654 -0
  252. package/pass/screen_bloom_pass.d.ts +11 -0
  253. package/pass/screen_bloom_pass.js +235 -0
  254. package/pass/screen_bloom_pass.ts +263 -0
  255. package/pass/ssao_pass.d.ts +88 -13
  256. package/pass/ssao_pass.js +802 -366
  257. package/pass/ssao_pass.ts +918 -0
  258. package/pass/stroke_pass.d.ts +2 -2
  259. package/pass/stroke_pass.js +329 -258
  260. package/pass/stroke_pass.ts +638 -0
  261. package/shaders/FXAAShaderMaterial.d.ts +3 -3
  262. package/shaders/FXAAShaderMaterial.js +23 -66
  263. package/shaders/FXAAShaderMaterial.ts +201 -0
  264. package/shaders/baseDepthVisShader.d.ts +11 -0
  265. package/shaders/baseDepthVisShader.js +36 -0
  266. package/shaders/baseDepthVisShader.ts +36 -0
  267. package/shaders/baseTextureToRenderShader.d.ts +2 -2
  268. package/shaders/baseTextureToRenderShader.js +55 -60
  269. package/shaders/baseTextureToRenderShader.ts +232 -0
  270. package/shaders/copyShader.d.ts +3 -3
  271. package/shaders/copyShader.js +13 -14
  272. package/shaders/copyShader.ts +32 -0
  273. package/shaders/debugDepthCompareShader.d.ts +14 -0
  274. package/shaders/debugDepthCompareShader.js +49 -0
  275. package/shaders/debugDepthCompareShader.ts +50 -0
  276. package/shaders/debugDepthJudgeShader.d.ts +18 -0
  277. package/shaders/debugDepthJudgeShader.js +52 -0
  278. package/shaders/debugDepthJudgeShader.ts +54 -0
  279. package/shaders/debugExcludedShader.d.ts +13 -0
  280. package/shaders/debugExcludedShader.js +46 -0
  281. package/shaders/debugExcludedShader.ts +48 -0
  282. package/spriteTextBg.d.ts +1 -0
  283. package/spriteTextBg.js +20 -0
  284. package/spriteTextBg.ts +20 -0
  285. package/threeLoader.d.ts +35 -34
  286. package/threeLoader.js +518 -527
  287. package/threeLoader.ts +525 -0
  288. package/threeUtils.d.ts +53 -52
  289. package/threeUtils.js +329 -330
  290. package/threeUtils.ts +373 -0
  291. package/types.d.ts +2 -0
  292. package/types.js +6 -0
  293. package/types.ts +8 -0
  294. package/ApngTexture.d.ts +0 -13
  295. package/ApngTexture.js +0 -61
  296. package/ApngTextureManage.d.ts +0 -18
  297. package/ApngTextureManage.js +0 -87
  298. package/KeyFrameAnimation.d.ts +0 -25
  299. package/KeyFrameAnimation.js +0 -78
  300. package/keyContorls.d.ts +0 -25
  301. package/lib/draco/draco_decoder.js +0 -34
  302. package/lib/draco/draco_decoder.wasm +0 -0
  303. package/lib/draco/draco_wasm_wrapper.js +0 -117
  304. package/pass/emissive_ao_pass.d.ts +0 -13
  305. package/pass/emissive_ao_pass.js +0 -370
  306. package/shaders.d.ts +0 -5
  307. package/shaders.js +0 -93
@@ -0,0 +1,235 @@
1
+ /*
2
+ * @Author: xiaosihan / WorkBuddy
3
+ * @Description: 屏幕空间辉光(经典 gaussian bloom)。
4
+ * 替代 three 自带的 UnrealBloomPass——后者用 5 级离散 mip(1/2…1/32)各自模糊后直接相加,
5
+ * 级与级覆盖范围跳跃,strength 偏高时暴露成同心亮环("一层一层")。
6
+ * 本实现改用「亮部提取(soft-knee 防硬边) → 半分辨率多次可分离高斯模糊迭代(单分辨率连续扩散) → 加性叠加」,
7
+ * 模糊是连续平滑的,与 glow_pass / bloom_pass 的发光风格一致,边缘柔和、无分层。
8
+ * 依赖 renderer.autoClear=false(ThreeBase 第 236 行),故 composite 在 screenRenderTarget 上做加性叠加不会清空原图。
9
+ */
10
+ import { AdditiveBlending, LinearFilter, NoBlending, RawShaderMaterial, RGBAFormat, Vector2, WebGLRenderTarget } from "three";
11
+ import fsQuad from "./fsQuad";
12
+ const halfSize = new Vector2(1, 1);
13
+ const highPassTarget = new WebGLRenderTarget(1, 1, {
14
+ minFilter: LinearFilter,
15
+ magFilter: LinearFilter,
16
+ format: RGBAFormat,
17
+ });
18
+ const blurTargetA = new WebGLRenderTarget(1, 1, {
19
+ minFilter: LinearFilter,
20
+ magFilter: LinearFilter,
21
+ format: RGBAFormat,
22
+ });
23
+ const blurTargetB = new WebGLRenderTarget(1, 1, {
24
+ minFilter: LinearFilter,
25
+ magFilter: LinearFilter,
26
+ format: RGBAFormat,
27
+ });
28
+ // 亮部提取:带 soft-knee 软过渡,避免阈值硬截断产生硬边(硬边会被后续模糊放大成可见光环)
29
+ const highPassShader = new RawShaderMaterial({
30
+ uniforms: {
31
+ tDiffuse: { value: null },
32
+ threshold: { value: 0.85 },
33
+ knee: { value: 0.1 },
34
+ },
35
+ vertexShader: `
36
+ attribute vec3 position;
37
+ attribute vec2 uv;
38
+ varying vec2 vUv;
39
+ void main() {
40
+ vUv = uv;
41
+ gl_Position = vec4(position, 1.0);
42
+ }`,
43
+ fragmentShader: `
44
+ #ifdef GL_ES
45
+ precision highp float;
46
+ #endif
47
+ uniform sampler2D tDiffuse;
48
+ uniform float threshold;
49
+ uniform float knee;
50
+ varying vec2 vUv;
51
+ void main() {
52
+ vec4 texel = texture2D(tDiffuse, vUv);
53
+ float lum = dot(texel.rgb, vec3(0.2126, 0.7152, 0.0722));
54
+ // soft knee:在 threshold 附近平滑过渡,而非阶跃
55
+ float soft = clamp((lum - threshold + knee) / (2.0 * knee), 0.0, 1.0);
56
+ float contrib = max(soft * soft, lum - threshold) / max(lum, 1e-4);
57
+ gl_FragColor = vec4(texel.rgb * contrib, 1.0);
58
+ }`,
59
+ blending: NoBlending,
60
+ depthTest: false,
61
+ depthWrite: false,
62
+ transparent: true,
63
+ });
64
+ // 可分离高斯模糊(H / V),与 glow_pass 同结构:21-tap 固定,radius 控制偏移步长,sigma 控制权重形状。
65
+ // 多迭代后在单分辨率上等价一个大半径高斯,过渡完全连续 —— 这是均匀、无分层的根本。
66
+ const gaussianBlurHShader = new RawShaderMaterial({
67
+ uniforms: {
68
+ tDiffuse: { value: null },
69
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
70
+ radius: { value: 1.0 },
71
+ sigma: { value: 1.0 },
72
+ },
73
+ vertexShader: `
74
+ attribute vec3 position;
75
+ attribute vec2 uv;
76
+ varying vec2 vUv;
77
+ void main() {
78
+ vUv = uv;
79
+ gl_Position = vec4(position, 1.0);
80
+ }`,
81
+ fragmentShader: `
82
+ #ifdef GL_ES
83
+ precision highp float;
84
+ #endif
85
+ uniform sampler2D tDiffuse;
86
+ uniform vec2 resolution;
87
+ uniform float radius;
88
+ uniform float sigma;
89
+ varying vec2 vUv;
90
+ float gaussian(float x, float sigma) {
91
+ return exp(-(x * x) / (2.0 * sigma * sigma));
92
+ }
93
+ void main() {
94
+ vec4 color = vec4(0.0);
95
+ float totalWeight = 0.0;
96
+ for (int i = -10; i <= 10; i++) {
97
+ float x = float(i);
98
+ float weight = gaussian(x, sigma);
99
+ vec2 offset = vec2(x * radius * resolution.x, 0.0);
100
+ color += texture2D(tDiffuse, vUv + offset) * weight;
101
+ totalWeight += weight;
102
+ }
103
+ gl_FragColor = color / totalWeight;
104
+ }`,
105
+ blending: NoBlending,
106
+ depthTest: false,
107
+ depthWrite: false,
108
+ transparent: true,
109
+ });
110
+ const gaussianBlurVShader = new RawShaderMaterial({
111
+ uniforms: {
112
+ tDiffuse: { value: null },
113
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
114
+ radius: { value: 1.0 },
115
+ sigma: { value: 1.0 },
116
+ },
117
+ vertexShader: `
118
+ attribute vec3 position;
119
+ attribute vec2 uv;
120
+ varying vec2 vUv;
121
+ void main() {
122
+ vUv = uv;
123
+ gl_Position = vec4(position, 1.0);
124
+ }`,
125
+ fragmentShader: `
126
+ #ifdef GL_ES
127
+ precision highp float;
128
+ #endif
129
+ uniform sampler2D tDiffuse;
130
+ uniform vec2 resolution;
131
+ uniform float radius;
132
+ uniform float sigma;
133
+ varying vec2 vUv;
134
+ float gaussian(float x, float sigma) {
135
+ return exp(-(x * x) / (2.0 * sigma * sigma));
136
+ }
137
+ void main() {
138
+ vec4 color = vec4(0.0);
139
+ float totalWeight = 0.0;
140
+ for (int i = -10; i <= 10; i++) {
141
+ float y = float(i);
142
+ float weight = gaussian(y, sigma);
143
+ vec2 offset = vec2(0.0, y * radius * resolution.y);
144
+ color += texture2D(tDiffuse, vUv + offset) * weight;
145
+ totalWeight += weight;
146
+ }
147
+ gl_FragColor = color / totalWeight;
148
+ }`,
149
+ blending: NoBlending,
150
+ depthTest: false,
151
+ depthWrite: false,
152
+ transparent: true,
153
+ });
154
+ // 加性合成:把模糊后的泛光按强度叠加回屏幕合成目标(autoClear=false,不清空原图)
155
+ const compositeShader = new RawShaderMaterial({
156
+ uniforms: {
157
+ tDiffuse: { value: null },
158
+ strength: { value: 1.0 },
159
+ },
160
+ vertexShader: `
161
+ attribute vec3 position;
162
+ attribute vec2 uv;
163
+ varying vec2 vUv;
164
+ void main() {
165
+ vUv = uv;
166
+ gl_Position = vec4(position, 1.0);
167
+ }`,
168
+ fragmentShader: `
169
+ #ifdef GL_ES
170
+ precision highp float;
171
+ #endif
172
+ uniform sampler2D tDiffuse;
173
+ uniform float strength;
174
+ varying vec2 vUv;
175
+ void main() {
176
+ vec4 texel = texture2D(tDiffuse, vUv);
177
+ gl_FragColor = vec4(texel.rgb * strength, 1.0);
178
+ }`,
179
+ blending: AdditiveBlending,
180
+ depthTest: false,
181
+ depthWrite: false,
182
+ transparent: true,
183
+ });
184
+ export default function screenBloomPass(renderer, sourceRenderTarget, config) {
185
+ const { strength, radius, threshold } = config;
186
+ if (strength <= 0) {
187
+ return;
188
+ }
189
+ // 半分辨率:降采样既提速,又让扩散更平滑自然(避免全分辨率下模糊核偏硬)
190
+ const w = Math.max(1, sourceRenderTarget.width >> 1);
191
+ const h = Math.max(1, sourceRenderTarget.height >> 1);
192
+ halfSize.set(w, h);
193
+ highPassTarget.setSize(w, h);
194
+ blurTargetA.setSize(w, h);
195
+ blurTargetB.setSize(w, h);
196
+ // 1) 亮部提取
197
+ renderer.setRenderTarget(highPassTarget);
198
+ renderer.clear();
199
+ highPassShader.uniforms.tDiffuse.value = sourceRenderTarget.texture;
200
+ highPassShader.uniforms.threshold.value = threshold;
201
+ fsQuad.render(renderer, highPassShader);
202
+ // 2) 多次可分离高斯模糊迭代:单分辨率连续扩散,无 mip 分层
203
+ const blurRadius = 1.0 + radius * 8.0; // radius 0~1 → 偏移 1~9 像素(half 分辨率下已足够大)
204
+ gaussianBlurHShader.uniforms.resolution.value.set(1 / w, 1 / h);
205
+ gaussianBlurVShader.uniforms.resolution.value.set(1 / w, 1 / h);
206
+ gaussianBlurHShader.uniforms.radius.value = blurRadius;
207
+ gaussianBlurVShader.uniforms.radius.value = blurRadius;
208
+ gaussianBlurHShader.uniforms.sigma.value = 1.0;
209
+ gaussianBlurVShader.uniforms.sigma.value = 1.0;
210
+ renderer.setRenderTarget(blurTargetA);
211
+ renderer.clear();
212
+ gaussianBlurHShader.uniforms.tDiffuse.value = highPassTarget.texture;
213
+ fsQuad.render(renderer, gaussianBlurHShader);
214
+ renderer.setRenderTarget(blurTargetB);
215
+ renderer.clear();
216
+ gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
217
+ fsQuad.render(renderer, gaussianBlurVShader);
218
+ // 反复 H/V 迭代,扩散越大、越均匀。共 6 趟(H+V 各 6 次)已非常平滑。
219
+ const passes = 6;
220
+ for (let i = 1; i < passes; i++) {
221
+ renderer.setRenderTarget(blurTargetA);
222
+ renderer.clear();
223
+ gaussianBlurHShader.uniforms.tDiffuse.value = blurTargetB.texture;
224
+ fsQuad.render(renderer, gaussianBlurHShader);
225
+ renderer.setRenderTarget(blurTargetB);
226
+ renderer.clear();
227
+ gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
228
+ fsQuad.render(renderer, gaussianBlurVShader);
229
+ }
230
+ // 3) 加性合成回屏幕合成目标(不 clear,叠加在已有合成图上)
231
+ renderer.setRenderTarget(sourceRenderTarget);
232
+ compositeShader.uniforms.tDiffuse.value = blurTargetB.texture;
233
+ compositeShader.uniforms.strength.value = strength;
234
+ fsQuad.render(renderer, compositeShader);
235
+ }
@@ -0,0 +1,263 @@
1
+ /*
2
+ * @Author: xiaosihan / WorkBuddy
3
+ * @Description: 屏幕空间辉光(经典 gaussian bloom)。
4
+ * 替代 three 自带的 UnrealBloomPass——后者用 5 级离散 mip(1/2…1/32)各自模糊后直接相加,
5
+ * 级与级覆盖范围跳跃,strength 偏高时暴露成同心亮环("一层一层")。
6
+ * 本实现改用「亮部提取(soft-knee 防硬边) → 半分辨率多次可分离高斯模糊迭代(单分辨率连续扩散) → 加性叠加」,
7
+ * 模糊是连续平滑的,与 glow_pass / bloom_pass 的发光风格一致,边缘柔和、无分层。
8
+ * 依赖 renderer.autoClear=false(ThreeBase 第 236 行),故 composite 在 screenRenderTarget 上做加性叠加不会清空原图。
9
+ */
10
+ import { AdditiveBlending, LinearFilter, NoBlending, RawShaderMaterial, RGBAFormat, Vector2, WebGLRenderTarget, WebGLRenderer } from "three";
11
+ import fsQuad from "./fsQuad";
12
+
13
+ const halfSize: Vector2 = new Vector2(1, 1);
14
+
15
+ const highPassTarget: WebGLRenderTarget = new WebGLRenderTarget(1, 1, {
16
+ minFilter: LinearFilter,
17
+ magFilter: LinearFilter,
18
+ format: RGBAFormat,
19
+ });
20
+ const blurTargetA: WebGLRenderTarget = new WebGLRenderTarget(1, 1, {
21
+ minFilter: LinearFilter,
22
+ magFilter: LinearFilter,
23
+ format: RGBAFormat,
24
+ });
25
+ const blurTargetB: WebGLRenderTarget = new WebGLRenderTarget(1, 1, {
26
+ minFilter: LinearFilter,
27
+ magFilter: LinearFilter,
28
+ format: RGBAFormat,
29
+ });
30
+
31
+ // 亮部提取:带 soft-knee 软过渡,避免阈值硬截断产生硬边(硬边会被后续模糊放大成可见光环)
32
+ const highPassShader: RawShaderMaterial = new RawShaderMaterial({
33
+ uniforms: {
34
+ tDiffuse: { value: null },
35
+ threshold: { value: 0.85 },
36
+ knee: { value: 0.1 },
37
+ },
38
+ vertexShader: `
39
+ attribute vec3 position;
40
+ attribute vec2 uv;
41
+ varying vec2 vUv;
42
+ void main() {
43
+ vUv = uv;
44
+ gl_Position = vec4(position, 1.0);
45
+ }`,
46
+ fragmentShader: `
47
+ #ifdef GL_ES
48
+ precision highp float;
49
+ #endif
50
+ uniform sampler2D tDiffuse;
51
+ uniform float threshold;
52
+ uniform float knee;
53
+ varying vec2 vUv;
54
+ void main() {
55
+ vec4 texel = texture2D(tDiffuse, vUv);
56
+ float lum = dot(texel.rgb, vec3(0.2126, 0.7152, 0.0722));
57
+ // soft knee:在 threshold 附近平滑过渡,而非阶跃
58
+ float soft = clamp((lum - threshold + knee) / (2.0 * knee), 0.0, 1.0);
59
+ float contrib = max(soft * soft, lum - threshold) / max(lum, 1e-4);
60
+ gl_FragColor = vec4(texel.rgb * contrib, 1.0);
61
+ }`,
62
+ blending: NoBlending,
63
+ depthTest: false,
64
+ depthWrite: false,
65
+ transparent: true,
66
+ });
67
+
68
+ // 可分离高斯模糊(H / V),与 glow_pass 同结构:21-tap 固定,radius 控制偏移步长,sigma 控制权重形状。
69
+ // 多迭代后在单分辨率上等价一个大半径高斯,过渡完全连续 —— 这是均匀、无分层的根本。
70
+ const gaussianBlurHShader: RawShaderMaterial = new RawShaderMaterial({
71
+ uniforms: {
72
+ tDiffuse: { value: null },
73
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
74
+ radius: { value: 1.0 },
75
+ sigma: { value: 1.0 },
76
+ },
77
+ vertexShader: `
78
+ attribute vec3 position;
79
+ attribute vec2 uv;
80
+ varying vec2 vUv;
81
+ void main() {
82
+ vUv = uv;
83
+ gl_Position = vec4(position, 1.0);
84
+ }`,
85
+ fragmentShader: `
86
+ #ifdef GL_ES
87
+ precision highp float;
88
+ #endif
89
+ uniform sampler2D tDiffuse;
90
+ uniform vec2 resolution;
91
+ uniform float radius;
92
+ uniform float sigma;
93
+ varying vec2 vUv;
94
+ float gaussian(float x, float sigma) {
95
+ return exp(-(x * x) / (2.0 * sigma * sigma));
96
+ }
97
+ void main() {
98
+ vec4 color = vec4(0.0);
99
+ float totalWeight = 0.0;
100
+ for (int i = -10; i <= 10; i++) {
101
+ float x = float(i);
102
+ float weight = gaussian(x, sigma);
103
+ vec2 offset = vec2(x * radius * resolution.x, 0.0);
104
+ color += texture2D(tDiffuse, vUv + offset) * weight;
105
+ totalWeight += weight;
106
+ }
107
+ gl_FragColor = color / totalWeight;
108
+ }`,
109
+ blending: NoBlending,
110
+ depthTest: false,
111
+ depthWrite: false,
112
+ transparent: true,
113
+ });
114
+
115
+ const gaussianBlurVShader: RawShaderMaterial = new RawShaderMaterial({
116
+ uniforms: {
117
+ tDiffuse: { value: null },
118
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
119
+ radius: { value: 1.0 },
120
+ sigma: { value: 1.0 },
121
+ },
122
+ vertexShader: `
123
+ attribute vec3 position;
124
+ attribute vec2 uv;
125
+ varying vec2 vUv;
126
+ void main() {
127
+ vUv = uv;
128
+ gl_Position = vec4(position, 1.0);
129
+ }`,
130
+ fragmentShader: `
131
+ #ifdef GL_ES
132
+ precision highp float;
133
+ #endif
134
+ uniform sampler2D tDiffuse;
135
+ uniform vec2 resolution;
136
+ uniform float radius;
137
+ uniform float sigma;
138
+ varying vec2 vUv;
139
+ float gaussian(float x, float sigma) {
140
+ return exp(-(x * x) / (2.0 * sigma * sigma));
141
+ }
142
+ void main() {
143
+ vec4 color = vec4(0.0);
144
+ float totalWeight = 0.0;
145
+ for (int i = -10; i <= 10; i++) {
146
+ float y = float(i);
147
+ float weight = gaussian(y, sigma);
148
+ vec2 offset = vec2(0.0, y * radius * resolution.y);
149
+ color += texture2D(tDiffuse, vUv + offset) * weight;
150
+ totalWeight += weight;
151
+ }
152
+ gl_FragColor = color / totalWeight;
153
+ }`,
154
+ blending: NoBlending,
155
+ depthTest: false,
156
+ depthWrite: false,
157
+ transparent: true,
158
+ });
159
+
160
+ // 加性合成:把模糊后的泛光按强度叠加回屏幕合成目标(autoClear=false,不清空原图)
161
+ const compositeShader: RawShaderMaterial = new RawShaderMaterial({
162
+ uniforms: {
163
+ tDiffuse: { value: null },
164
+ strength: { value: 1.0 },
165
+ },
166
+ vertexShader: `
167
+ attribute vec3 position;
168
+ attribute vec2 uv;
169
+ varying vec2 vUv;
170
+ void main() {
171
+ vUv = uv;
172
+ gl_Position = vec4(position, 1.0);
173
+ }`,
174
+ fragmentShader: `
175
+ #ifdef GL_ES
176
+ precision highp float;
177
+ #endif
178
+ uniform sampler2D tDiffuse;
179
+ uniform float strength;
180
+ varying vec2 vUv;
181
+ void main() {
182
+ vec4 texel = texture2D(tDiffuse, vUv);
183
+ gl_FragColor = vec4(texel.rgb * strength, 1.0);
184
+ }`,
185
+ blending: AdditiveBlending,
186
+ depthTest: false,
187
+ depthWrite: false,
188
+ transparent: true,
189
+ });
190
+
191
+ interface ScreenBloomConfig {
192
+ /** 叠加强度 */
193
+ strength: number;
194
+ /** 模糊扩散(0~1):映射高斯偏移步长,越大越柔 */
195
+ radius: number;
196
+ /** 亮部软阈值(0~1):仅亮度高于此值的像素参与辉光 */
197
+ threshold: number;
198
+ }
199
+
200
+ export default function screenBloomPass(
201
+ renderer: WebGLRenderer,
202
+ sourceRenderTarget: WebGLRenderTarget,
203
+ config: ScreenBloomConfig
204
+ ): void {
205
+ const { strength, radius, threshold } = config;
206
+ if (strength <= 0) {
207
+ return;
208
+ }
209
+
210
+ // 半分辨率:降采样既提速,又让扩散更平滑自然(避免全分辨率下模糊核偏硬)
211
+ const w = Math.max(1, sourceRenderTarget.width >> 1);
212
+ const h = Math.max(1, sourceRenderTarget.height >> 1);
213
+ halfSize.set(w, h);
214
+ highPassTarget.setSize(w, h);
215
+ blurTargetA.setSize(w, h);
216
+ blurTargetB.setSize(w, h);
217
+
218
+ // 1) 亮部提取
219
+ renderer.setRenderTarget(highPassTarget);
220
+ renderer.clear();
221
+ highPassShader.uniforms.tDiffuse.value = sourceRenderTarget.texture;
222
+ highPassShader.uniforms.threshold.value = threshold;
223
+ fsQuad.render(renderer, highPassShader);
224
+
225
+ // 2) 多次可分离高斯模糊迭代:单分辨率连续扩散,无 mip 分层
226
+ const blurRadius = 1.0 + radius * 8.0; // radius 0~1 → 偏移 1~9 像素(half 分辨率下已足够大)
227
+ gaussianBlurHShader.uniforms.resolution.value.set(1 / w, 1 / h);
228
+ gaussianBlurVShader.uniforms.resolution.value.set(1 / w, 1 / h);
229
+ gaussianBlurHShader.uniforms.radius.value = blurRadius;
230
+ gaussianBlurVShader.uniforms.radius.value = blurRadius;
231
+ gaussianBlurHShader.uniforms.sigma.value = 1.0;
232
+ gaussianBlurVShader.uniforms.sigma.value = 1.0;
233
+
234
+ renderer.setRenderTarget(blurTargetA);
235
+ renderer.clear();
236
+ gaussianBlurHShader.uniforms.tDiffuse.value = highPassTarget.texture;
237
+ fsQuad.render(renderer, gaussianBlurHShader);
238
+
239
+ renderer.setRenderTarget(blurTargetB);
240
+ renderer.clear();
241
+ gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
242
+ fsQuad.render(renderer, gaussianBlurVShader);
243
+
244
+ // 反复 H/V 迭代,扩散越大、越均匀。共 6 趟(H+V 各 6 次)已非常平滑。
245
+ const passes = 6;
246
+ for (let i = 1; i < passes; i++) {
247
+ renderer.setRenderTarget(blurTargetA);
248
+ renderer.clear();
249
+ gaussianBlurHShader.uniforms.tDiffuse.value = blurTargetB.texture;
250
+ fsQuad.render(renderer, gaussianBlurHShader);
251
+
252
+ renderer.setRenderTarget(blurTargetB);
253
+ renderer.clear();
254
+ gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
255
+ fsQuad.render(renderer, gaussianBlurVShader);
256
+ }
257
+
258
+ // 3) 加性合成回屏幕合成目标(不 clear,叠加在已有合成图上)
259
+ renderer.setRenderTarget(sourceRenderTarget);
260
+ compositeShader.uniforms.tDiffuse.value = blurTargetB.texture;
261
+ compositeShader.uniforms.strength.value = strength;
262
+ fsQuad.render(renderer, compositeShader);
263
+ }
@@ -1,13 +1,88 @@
1
- import { Camera, DepthTexture, WebGLRenderer } from "three";
2
- export default function ssao_pass(renderer: WebGLRenderer, camera: Camera, depthTexture: DepthTexture, devicePixelRatio: number, options: {
3
- enable: boolean;
4
- debug?: boolean;
5
- radius?: number;
6
- falloff?: number;
7
- bias?: number;
8
- intensity?: number;
9
- sampleCount?: number;
10
- blurRadius?: number;
11
- strength?: number;
12
- cameraFar?: number;
13
- }): void;
1
+ import { MeshNormalMaterial, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
2
+ /**
3
+ * 判断是否为「可透视的半透明表面」——这类物体不该在世界空间 AO 里充当实体。
4
+ * 让它进入深度/法线图,被它遮挡的区域会发黑,成因分两种:
5
+ * a) transparent:true + opacity<1(毛玻璃、透明装饰):深度图与法线图都落在半透明表面上,
6
+ * GTAO 在其表面算自遮蔽(褶皱、紧贴其它几何的窄缝)→ 这份 AO 被乘到「透过它看到的
7
+ * 实体」上 → 该区域发黑。
8
+ * b) transparent:true + depthWrite:false(霓虹灯管、光晕、叠加面):深度图保留身后几何(远),
9
+ * 但法线 pass 用 overrideMaterial(MeshNormalMaterial 默认 depthWrite:true)会强行把它的
10
+ * 法线写进去(近)→ 深度与法线指的不是同一个点 → GTAO 几乎必然算错发黑。
11
+ * 故深度 pass 与法线 pass 统一隐藏:该像素的深度/法线即身后不透明几何,AO 由真实可见几何
12
+ * 决定;身后是背景时深度为 1.0,shader 守卫直接判「无遮蔽」(=1),不会发黑。
13
+ *
14
+ * 判据只看 material.transparent 本身,不再依赖 opacity / depthWrite(2026-08-30 修正):
15
+ * 大量半透明是自定义 ShaderMaterial,alpha 由 shader 算出来,而材质的 opacity 仍是默认 1、
16
+ * depthWrite 仍是 true —— 典型如 Ground1 地板(mapColor.a 径向渐变)、聚光灯光斑、
17
+ * effectMaterial1,靠材质属性完全读不出来,会被漏判并继续污染 AO。
18
+ * 代价:Mirror 这类「标了 transparent 但 shader 实际输出 alpha=1.0」的实心反射面会被误排除,
19
+ * 故 Mirror 在构造函数里显式标记 userData.aoOpaque = true 保留(见各 Mirror 实现)。
20
+ * 其余特例同样可用 userData.aoTransparent=true 强制排除 / userData.aoOpaque=true 强制保留。
21
+ *
22
+ * @param includeFloor 是否为「含地板」的 AO 数据准备(GTAO 深度/法线)。
23
+ * - false(默认,可见深度 / 描边/辉光/毛玻璃遮挡判定):地板按普通半透明排除。
24
+ * - true(AO 深度):标了 userData.aoFloor 的地板保留为实体,参与接触 AO 计算。
25
+ */
26
+ /**
27
+ * 可见深度图的运行时开关:**标了 `userData.aoFloor` 的地板是否参与遮挡判定**。
28
+ *
29
+ * 默认 false = 保持原设计(可透视地板:透过地板看到的物体照常显示,不被地板挡住)。
30
+ * 置 true 后,地板会写进 baseDepthTexture,于是**被地板挡住的描边/辉光/毛玻璃/覆盖色会被正确遮挡**。
31
+ * 面板「深度调试 → 地板参与遮挡」可一键切换,用于排查"挡不住"是不是地板(如 Ground1)造成的。
32
+ *
33
+ * 只影响 aoFloor 地板这一类;transparent 面的处理不受影响(见 isSeeThroughSurface)。
34
+ */
35
+ export declare const visibleDepthOptions: {
36
+ includeFloor: boolean;
37
+ };
38
+ /**
39
+ * 深度 pass:固定排除非实体表面后,将场景深度渲染到 depthRenderTarget。
40
+ * depthRenderTarget.depthTexture 即 baseDepthTexture,供 SSAO / 描边 / 发光等后续 pass 复用。
41
+ * 排除的非实体对象(sprite/线条/点)在深度图保留 clear 深度(1.0=远),与背景一致;排除的
42
+ * 半透明对象则保留其身后不透明几何的深度(身后无几何时同样为 1.0)。均不影响颜色通道渲染。
43
+ */
44
+ export declare function renderAoDepthPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, includeFloor?: boolean): void;
45
+ /**
46
+ * 调试用:把「被排除出可见深度图」的表面单独渲成红色 mask。
47
+ *
48
+ * 这些面在 renderAoDepthPass 里被 hideNonSurface 隐藏,因此**不会写进 baseDepthTexture**,
49
+ * 也就永远挡不住描边/辉光/毛玻璃/覆盖色 —— 这正是"深度测试看起来失效"最常见的成因
50
+ * (用户以为是 bug,其实是该面被设计成可透视:sprite/线条/点、userData.aoTransparent、
51
+ * 以及标了 userData.aoFloor 的地板 Ground1)。
52
+ * 面板「深度调试 → 排除面标记」叠加显示:灰=能挡住的真实遮挡面,红=被排除、挡不住任何东西。
53
+ *
54
+ * 只渲染 Mesh:sprite / Line2 / Points 在 MeshBasicMaterial override 下渲染异常(见文件头注释),
55
+ * 且它们数量少、用户关心的遮挡体基本都是 Mesh,故跳过。
56
+ */
57
+ export declare function renderExcludedMaskPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, maskRenderTarget: WebGLRenderTarget, includeFloor?: boolean): void;
58
+ /**
59
+ * 法线 pass(仅 SSAO 开启时需要):固定排除非实体表面后,以中性灰清屏 + normalMaterial
60
+ * override 将视图空间法线渲染到 normalRenderTarget,供 GTAO 风格 SSAO 使用。
61
+ * 排除对象在法线图保留中性灰清屏色 → unpackRGBToNormal(0.5,0.5,0.5)=(0,0,0) →
62
+ * SSAO 退化法线守卫判"无遮蔽"(=1),避免精灵弹窗被 AO 乘黑。清屏色用后即还原。
63
+ */
64
+ export declare function renderAoNormalPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, includeFloor?: boolean): void;
65
+ export interface SsaoOptions {
66
+ enable: boolean;
67
+ debug?: boolean;
68
+ radius?: number;
69
+ falloff?: number;
70
+ /** 旧版螺旋采样用到的切面距离阈值,GTAO 算法不再使用,保留字段仅作兼容 */
71
+ bias?: number;
72
+ /** 映射为 GTAO 的 scale(AO 次幂 / gamma 校正),控制 AO 对比强度,默认 1.0 */
73
+ intensity?: number;
74
+ /** 采样总数(编译期常量,改变会触发 shader 重新编译),默认 16 */
75
+ sampleCount?: number;
76
+ blurRadius?: number;
77
+ strength?: number;
78
+ cameraFar?: number;
79
+ /** SSAO 计算分辨率缩放比例,默认 0.5(半分辨率计算,性能更好) */
80
+ resolutionScale?: number;
81
+ /** GTAO 地平线积分:采样点沿半径分布的幂次,默认 1.0 */
82
+ distanceExponent?: number;
83
+ /** GTAO 地平线积分:距离衰减混合系数,默认 1.0 */
84
+ distanceFallOff?: number;
85
+ /** AO 次幂(gamma 校正),默认 1.0(与 intensity 共享语义时可只调其一) */
86
+ scale?: number;
87
+ }
88
+ export default function ssao_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, devicePixelRatio: number, options: SsaoOptions): void;