three-base 2.0.134 → 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 (305) 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 -71
  14. package/FPScontrol.js +1799 -505
  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 -97
  153. package/ThreeBase.js +1202 -613
  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 +101 -26
  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 -11
  256. package/pass/ssao_pass.js +802 -288
  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/shaders.d.ts +0 -5
  305. package/shaders.js +0 -93
@@ -1,46 +1,56 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2026-04-21 00:00:00
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2026-04-21 00:00:00
6
- */
7
- import { DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
8
- import fsQuad from "./fsQuad";
9
- // 深度测试后的毛玻璃遮罩纹理
10
- const maskTextureTarget = new WebGLRenderTarget(512, 512, {
11
- minFilter: LinearFilter,
12
- magFilter: LinearFilter,
13
- format: RGBAFormat,
14
- anisotropy: 16,
15
- });
16
- // 模糊后的纹理
17
- const blurTextureTarget = new WebGLRenderTarget(1024, 1024, {
18
- minFilter: LinearFilter,
19
- magFilter: LinearFilter,
20
- format: RGBAFormat,
21
- anisotropy: 16,
22
- });
23
- // 临时模糊纹理(用于两阶段模糊)
24
- const tempBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
25
- minFilter: LinearFilter,
26
- magFilter: LinearFilter,
27
- format: RGBAFormat,
28
- anisotropy: 16,
29
- });
30
- const size = new Vector2();
31
- // 水平模糊着色器(使用 three.js 风格的高斯模糊)
32
- const horizontalBlurShader = new ShaderMaterial({
33
- uniforms: {
34
- tDiffuse: { value: null },
35
- h: { value: 1.0 / 512.0 },
36
- },
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2026-04-21 00:00:00
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2026-04-21 00:00:00
6
+ */
7
+ import { DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget } from "three";
8
+ import fsQuad from "./fsQuad";
9
+ import { debugDepthState } from "./debugDepthState";
10
+ const maskTextureTarget = new WebGLRenderTarget(1024, 1024, {
11
+ minFilter: LinearFilter,
12
+ magFilter: LinearFilter,
13
+ format: RGBAFormat,
14
+ anisotropy: 16,
15
+ });
16
+ const blurTextureTarget = new WebGLRenderTarget(1024, 1024, {
17
+ minFilter: LinearFilter,
18
+ magFilter: LinearFilter,
19
+ format: RGBAFormat,
20
+ anisotropy: 16,
21
+ });
22
+ const tempBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
23
+ minFilter: LinearFilter,
24
+ magFilter: LinearFilter,
25
+ format: RGBAFormat,
26
+ anisotropy: 16,
27
+ });
28
+ // 选中对象的遮罩渲染目标 + 配套深度纹理 + 临时场景:模块级复用,避免每帧 new/dispose 造成 GC 抖动与
29
+ // GPU 资源反复创建销毁(原先在函数内每帧 new 一个 WebGLRenderTarget + DepthTexture + Scene,开销大且不稳)。
30
+ const selectDepthTexture = new DepthTexture(1024, 1024);
31
+ selectDepthTexture.format = DepthFormat;
32
+ selectDepthTexture.type = UnsignedIntType;
33
+ const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
34
+ minFilter: LinearFilter,
35
+ magFilter: LinearFilter,
36
+ format: RGBAFormat,
37
+ depthTexture: selectDepthTexture,
38
+ });
39
+ // 临时场景:仅用于把「毛玻璃对象」单独渲进 selectTextureTarget 做遮罩,常驻复用(不每帧 new)。
40
+ const tempScene = new Scene();
41
+ const size = new Vector2();
42
+ const horizontalBlurShader = new ShaderMaterial({
43
+ uniforms: {
44
+ tDiffuse: { value: null },
45
+ h: { value: 1.0 / 512.0 },
46
+ },
37
47
  vertexShader: `
38
48
  varying vec2 vUv;
39
49
  void main() {
40
50
  vUv = uv;
41
51
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
42
52
  }
43
- `,
53
+ `,
44
54
  fragmentShader: `
45
55
  uniform sampler2D tDiffuse;
46
56
  uniform float h;
@@ -58,24 +68,23 @@ const horizontalBlurShader = new ShaderMaterial({
58
68
  sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;
59
69
  gl_FragColor = sum;
60
70
  }
61
- `,
62
- depthTest: false,
63
- depthWrite: false,
64
- transparent: true,
65
- });
66
- // 垂直模糊着色器(使用 three.js 风格的高斯模糊)
67
- const verticalBlurShader = new ShaderMaterial({
68
- uniforms: {
69
- tDiffuse: { value: null },
70
- v: { value: 1.0 / 512.0 },
71
- },
71
+ `,
72
+ depthTest: false,
73
+ depthWrite: false,
74
+ transparent: true,
75
+ });
76
+ const verticalBlurShader = new ShaderMaterial({
77
+ uniforms: {
78
+ tDiffuse: { value: null },
79
+ v: { value: 1.0 / 512.0 },
80
+ },
72
81
  vertexShader: `
73
82
  varying vec2 vUv;
74
83
  void main() {
75
84
  vUv = uv;
76
85
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
77
86
  }
78
- `,
87
+ `,
79
88
  fragmentShader: `
80
89
  uniform sampler2D tDiffuse;
81
90
  uniform float v;
@@ -93,17 +102,17 @@ const verticalBlurShader = new ShaderMaterial({
93
102
  sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;
94
103
  gl_FragColor = sum;
95
104
  }
96
- `,
97
- depthTest: false,
98
- depthWrite: false,
99
- transparent: true,
100
- });
101
- // 深度测试着色器(渲染毛玻璃对象,通过深度对比生成遮罩)
102
- const depthTestShader = new ShaderMaterial({
103
- uniforms: {
104
- baseDepth: { value: null }, // 整个场景的深度纹理
105
- selectDepth: { value: null }, // 毛玻璃对象的深度纹理
106
- },
105
+ `,
106
+ depthTest: false,
107
+ depthWrite: false,
108
+ transparent: true,
109
+ });
110
+ const depthTestShader = new ShaderMaterial({
111
+ uniforms: {
112
+ baseDepth: { value: null },
113
+ selectDepth: { value: null },
114
+ cameraFar: { value: 1000.0 },
115
+ },
107
116
  vertexShader: `
108
117
  ${ShaderChunk.common}
109
118
  ${ShaderChunk.logdepthbuf_pars_vertex}
@@ -113,163 +122,135 @@ const depthTestShader = new ShaderMaterial({
113
122
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
114
123
  ${ShaderChunk.logdepthbuf_vertex}
115
124
  }
116
- `,
125
+ `,
117
126
  fragmentShader: `
118
127
  ${ShaderChunk.logdepthbuf_pars_fragment}
119
128
  uniform sampler2D baseDepth;
120
129
  uniform sampler2D selectDepth;
130
+ uniform float cameraFar;
121
131
  varying vec2 vUv;
122
132
  void main() {
123
- // 毛玻璃对象深度
124
133
  float selectDepthValue = texture2D(selectDepth, vUv).r;
125
- // 场景深度
126
134
  float baseDepthValue = texture2D(baseDepth, vUv).r;
127
-
128
- // 背景是空的时候丢弃(没有场景物体可模糊)
129
- if(baseDepthValue >= 1.0){
135
+ // 对数深度反解为线性视图深度。
136
+ float zSel = pow(cameraFar + 1.0, selectDepthValue) - 1.0;
137
+ float zBase = pow(cameraFar + 1.0, baseDepthValue) - 1.0;
138
+ float bias = max(zSel, 1.0) * 0.0015;
139
+ // 该像素没有毛玻璃对象(selectDepth 仍是清屏值 1.0 → zSel == cameraFar)→ 不参与合成。
140
+ // ⚠️ 旧实现让背景像素「直接保留毛玻璃」,导致没有对象的像素同样写白 mask;
141
+ // 而 frostedGlassShader 是全屏 fsQuad,只要 mask.a>=0.01 就输出 blurTexture
142
+ // → 整个场景被糊一层(表现为"开启毛玻璃后全场景变模糊")。
143
+ if (zSel >= cameraFar) {
130
144
  discard;
131
145
  }
132
- // 毛玻璃对象深度远于场景深度时丢弃(被场景物体遮挡的部分不显示)
133
- if(selectDepthValue > baseDepthValue){
146
+ // 毛玻璃为实体:丢弃被更近场景几何遮挡的部分
147
+ if (zSel > zBase + bias) {
134
148
  discard;
135
149
  }
136
- // 输出白色遮罩,alpha=1
137
150
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
138
151
  ${ShaderChunk.logdepthbuf_fragment}
139
152
  }
140
- `,
141
- depthTest: true,
142
- depthWrite: true,
143
- transparent: true,
144
- });
145
- // 毛玻璃合成着色器(用遮罩纹理裁剪模糊区域)
146
- const frostedGlassShader = new ShaderMaterial({
147
- uniforms: {
148
- blurTexture: { value: null }, // 高斯模糊后的全场景纹理
149
- maskTexture: { value: null }, // 深度遮罩纹理
150
- },
153
+ `,
154
+ depthTest: true,
155
+ depthWrite: true,
156
+ transparent: true,
157
+ });
158
+ const frostedGlassShader = new ShaderMaterial({
159
+ uniforms: {
160
+ blurTexture: { value: null },
161
+ maskTexture: { value: null },
162
+ },
151
163
  vertexShader: `
152
164
  varying vec2 vUv;
153
165
  void main() {
154
166
  vUv = uv;
155
167
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
156
168
  }
157
- `,
169
+ `,
158
170
  fragmentShader: `
159
171
  uniform sampler2D blurTexture;
160
172
  uniform sampler2D maskTexture;
161
173
  varying vec2 vUv;
162
174
 
163
175
  void main() {
164
- // 采样遮罩纹理
165
176
  vec4 mask = texture2D(maskTexture, vUv);
166
177
 
167
- // 遮罩区域为空时丢弃(非毛玻璃区域)
168
178
  if(mask.a < 0.01){
169
179
  discard;
170
180
  }
171
181
 
172
- // 在遮罩区域使用模糊后的纹理
173
- gl_FragColor = sRGBTransferOETF(texture2D(blurTexture, vUv));
182
+ // 后处理全程在线性空间处理:blurTexture 来自 baseRenderTarget(线性格式,RawShaderMaterial
183
+ // 采样即为原始线性值,three 不会自动解码/编码),模糊混合后直接输出线性值写入线性目标,
184
+ // 由终处理 baseTextureToRenderShader 统一做唯一的 sRGB 编码。切勿在此手动 sRGBTransferOETF,
185
+ // 否则线性值被编码两次 sRGB,毛玻璃区域整体发白,与 screenCopy 的无损拷贝颜色空间不一致。
186
+ gl_FragColor = texture2D(blurTexture, vUv);
187
+ }
188
+ `,
189
+ depthTest: true,
190
+ depthWrite: true,
191
+ transparent: false,
192
+ });
193
+ export default function frosted_glass_pass(renderer, camera, scene, baseRenderTarget, baseDepthTexture, devicePixelRatio) {
194
+ const enabledObjects = [];
195
+ scene.traverseVisible((obj) => {
196
+ if (obj.userData.frosted_glass_enable && obj.isMesh) {
197
+ enabledObjects.push(obj);
198
+ }
199
+ });
200
+ if (enabledObjects.length === 0) {
201
+ return;
202
+ }
203
+ const originRenderTarget = renderer.getRenderTarget();
204
+ // 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
205
+ // 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
206
+ renderer.getSize(size);
207
+ size.multiplyScalar(devicePixelRatio);
208
+ maskTextureTarget.setSize(size.x, size.y);
209
+ blurTextureTarget.setSize(size.x, size.y);
210
+ tempBlurTextureTarget.setSize(size.x, size.y);
211
+ selectTextureTarget.setSize(size.x, size.y);
212
+ renderer.setRenderTarget(tempBlurTextureTarget);
213
+ renderer.clear();
214
+ horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
215
+ horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
216
+ fsQuad.render(renderer, horizontalBlurShader);
217
+ renderer.setRenderTarget(blurTextureTarget);
218
+ renderer.clear();
219
+ verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
220
+ verticalBlurShader.uniforms.v.value = 2.5 / size.y;
221
+ fsQuad.render(renderer, verticalBlurShader);
222
+ renderer.setRenderTarget(tempBlurTextureTarget);
223
+ renderer.clear();
224
+ horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
225
+ horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
226
+ fsQuad.render(renderer, horizontalBlurShader);
227
+ renderer.setRenderTarget(blurTextureTarget);
228
+ renderer.clear();
229
+ verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
230
+ verticalBlurShader.uniforms.v.value = 2.0 / size.y;
231
+ fsQuad.render(renderer, verticalBlurShader);
232
+ const parents = enabledObjects.map(obj => obj.parent);
233
+ // selectTextureTarget / selectDepthTexture / tempScene 已在模块级复用,仅跟随主画面尺寸 resize,不每帧 new。
234
+ enabledObjects.forEach(obj => tempScene.add(obj));
235
+ renderer.setRenderTarget(selectTextureTarget);
236
+ renderer.clear();
237
+ renderer.render(tempScene, camera);
238
+ // 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 frosted 的遮挡判定
239
+ debugDepthState.lastSelectDepth = selectDepthTexture;
240
+ renderer.setRenderTarget(maskTextureTarget);
241
+ renderer.clear();
242
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
243
+ depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
244
+ depthTestShader.uniforms.cameraFar.value = camera.far;
245
+ fsQuad.render(renderer, depthTestShader);
246
+ enabledObjects.forEach((obj, i) => {
247
+ if (parents[i]) {
248
+ parents[i].add(obj);
174
249
  }
175
- `,
176
- depthTest: true,
177
- depthWrite: true,
178
- transparent: false,
179
- });
180
- // 毛玻璃后处理通道
181
- export default function frosted_glass_pass(renderer, camera, scene, baseRenderTarget, baseDepthTexture, devicePixelRatio) {
182
- // 收集所有启用了毛玻璃特效的 Mesh 对象
183
- const enabledObjects = [];
184
- scene.traverseVisible((obj) => {
185
- if (obj.userData.frosted_glass_enable && obj.isMesh) {
186
- enabledObjects.push(obj);
187
- }
188
- });
189
- if (enabledObjects.length === 0) {
190
- return;
191
- }
192
- // 保存原帧缓冲区
193
- const originRenderTarget = renderer.getRenderTarget();
194
- // 按实际渲染尺寸调整所有 RenderTarget
195
- renderer.getSize(size);
196
- size.multiplyScalar(devicePixelRatio);
197
- maskTextureTarget.setSize(size.x, size.y);
198
- blurTextureTarget.setSize(size.x, size.y);
199
- tempBlurTextureTarget.setSize(size.x, size.y);
200
- // ========== 第一步:对全场景纹理做高斯模糊(两遍,增强模糊效果) ==========
201
- // 1. 第一阶段水平模糊
202
- renderer.setRenderTarget(tempBlurTextureTarget);
203
- renderer.clear();
204
- horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
205
- horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
206
- fsQuad.render(renderer, horizontalBlurShader);
207
- // 2. 第一阶段垂直模糊
208
- renderer.setRenderTarget(blurTextureTarget);
209
- renderer.clear();
210
- verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
211
- verticalBlurShader.uniforms.v.value = 2.5 / size.y;
212
- fsQuad.render(renderer, verticalBlurShader);
213
- // 3. 第二阶段水平模糊
214
- renderer.setRenderTarget(tempBlurTextureTarget);
215
- renderer.clear();
216
- horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
217
- horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
218
- fsQuad.render(renderer, horizontalBlurShader);
219
- // 4. 第二阶段垂直模糊
220
- renderer.setRenderTarget(blurTextureTarget);
221
- renderer.clear();
222
- verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
223
- verticalBlurShader.uniforms.v.value = 2.0 / size.y;
224
- fsQuad.render(renderer, verticalBlurShader);
225
- // ========== 第二步:渲染毛玻璃对象,提取深度遮罩 ==========
226
- // 记录原始 parent,渲染完恢复
227
- const parents = enabledObjects.map(obj => obj.parent);
228
- // 临时 RenderTarget 用于渲染毛玻璃对象(需要深度纹理)
229
- const selectDepthTexture = new DepthTexture(Math.round(size.x), Math.round(size.y));
230
- selectDepthTexture.format = DepthFormat;
231
- selectDepthTexture.type = UnsignedShortType;
232
- const selectTextureTarget = new WebGLRenderTarget(Math.round(size.x), Math.round(size.y), {
233
- minFilter: LinearFilter,
234
- magFilter: LinearFilter,
235
- format: RGBAFormat,
236
- depthTexture: selectDepthTexture,
237
- });
238
- const tempScene = new Scene();
239
- enabledObjects.forEach(obj => tempScene.add(obj));
240
- renderer.setRenderTarget(selectTextureTarget);
241
- renderer.clear();
242
- renderer.render(tempScene, camera);
243
- // 用深度测试 shader 生成遮罩
244
- renderer.setRenderTarget(maskTextureTarget);
245
- renderer.clear();
246
- depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
247
- depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
248
- fsQuad.render(renderer, depthTestShader);
249
- // 恢复所有对象的 parent
250
- enabledObjects.forEach((obj, i) => {
251
- if (parents[i]) {
252
- parents[i].add(obj);
253
- }
254
- });
255
- // 释放临时的 RenderTarget
256
- selectTextureTarget.dispose();
257
- // ========== 第三步:合成毛玻璃效果 ==========
258
- renderer.setRenderTarget(originRenderTarget);
259
- renderer.clearDepth();
260
- frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
261
- frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
262
- fsQuad.render(renderer, frostedGlassShader);
263
- // 调试代码:直接输出模糊纹理
264
- // renderer.setRenderTarget(originRenderTarget);
265
- // renderer.clear();
266
- // baseTextureToRenderShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
267
- // fsQuad.render(renderer, baseTextureToRenderShader);
268
- // return;
269
- // 调试代码:直接输出遮罩纹理
270
- // renderer.setRenderTarget(originRenderTarget);
271
- // renderer.clear();
272
- // baseTextureToRenderShader.uniforms.tDiffuse.value = maskTextureTarget.texture;
273
- // fsQuad.render(renderer, baseTextureToRenderShader);
274
- // return;
275
- }
250
+ });
251
+ renderer.setRenderTarget(originRenderTarget);
252
+ renderer.clearDepth();
253
+ frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
254
+ frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
255
+ fsQuad.render(renderer, frostedGlassShader);
256
+ }