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
package/pass/glow_pass.js CHANGED
@@ -1,54 +1,79 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2023-05-09 00:35:17
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2025-01-28 04:13:16
6
- */
7
- import { Color, DepthFormat, DepthTexture, LinearFilter, NoBlending, NormalBlending, RGBAFormat, RawShaderMaterial, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget, } from "three";
8
- import fsQuad from "./fsQuad";
9
- // 选中对象的深度纹理
10
- const selectDepthTexture = (() => {
11
- const baseDepthTexture = new DepthTexture(4096, 4096);
12
- baseDepthTexture.format = DepthFormat;
13
- baseDepthTexture.type = UnsignedShortType;
14
- baseDepthTexture.anisotropy = 16;
15
- return baseDepthTexture;
16
- })();
17
- // 选中对象的纹理
18
- const selectTextureTarget = new WebGLRenderTarget(512, 512, {
19
- minFilter: LinearFilter,
20
- magFilter: LinearFilter,
21
- format: RGBAFormat,
22
- depthTexture: selectDepthTexture,
23
- anisotropy: 16,
24
- });
25
- // 深度测试后的选中纹理
26
- const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
27
- minFilter: LinearFilter,
28
- magFilter: LinearFilter,
29
- format: RGBAFormat,
30
- anisotropy: 16,
31
- });
32
- // 由于不能同时读写自己的纹理
33
- const blur1TextureTarget = new WebGLRenderTarget(512, 512, {
34
- minFilter: LinearFilter,
35
- magFilter: LinearFilter,
36
- format: RGBAFormat,
37
- });
38
- // 所以需要用2个模糊纹理相互读写
39
- const blur2TextureTarget = new WebGLRenderTarget(512, 512, {
40
- minFilter: LinearFilter,
41
- magFilter: LinearFilter,
42
- format: RGBAFormat,
43
- });
44
- const size = new Vector2();
45
- //深度比对纹理
46
- const depthTestShader = new ShaderMaterial({
47
- uniforms: {
48
- map: { value: null }, // 贴图纹理
49
- baseDepth: { value: null }, // 整个场景的深度纹理
50
- selectDepth: { value: null }, // 选中的对象深度纹理
51
- },
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2023-05-09 00:35:17
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2025-01-28 04:13:16
6
+ */
7
+ import { Color, DepthFormat, DepthTexture, LinearFilter, NoBlending, NormalBlending, AdditiveBlending, RGBAFormat, RawShaderMaterial, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget } from "three";
8
+ import fsQuad from "./fsQuad";
9
+ import { debugDepthState } from "./debugDepthState";
10
+ const selectDepthTexture = (() => {
11
+ const baseDepthTexture = new DepthTexture(1024, 1024);
12
+ baseDepthTexture.format = DepthFormat;
13
+ baseDepthTexture.type = UnsignedIntType;
14
+ baseDepthTexture.anisotropy = 16;
15
+ return baseDepthTexture;
16
+ })();
17
+ const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
18
+ minFilter: LinearFilter,
19
+ magFilter: LinearFilter,
20
+ format: RGBAFormat,
21
+ anisotropy: 16,
22
+ // 无 MSAA:mask 颜色与下方 selectDepthTextureTarget(深度)必须同为硬边缘,
23
+ // 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,辉光边缘锯齿。
24
+ // 边缘抗锯齿统一由 mask 内部 FXAA + 终处理 FXAA 兜底。
25
+ });
26
+ // 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
27
+ const selectDepthTextureTarget = new WebGLRenderTarget(1024, 1024, {
28
+ minFilter: LinearFilter,
29
+ magFilter: LinearFilter,
30
+ format: RGBAFormat,
31
+ depthTexture: selectDepthTexture,
32
+ anisotropy: 16,
33
+ });
34
+ const selectDepthTestTextureTarget = new WebGLRenderTarget(1024, 1024, {
35
+ minFilter: LinearFilter,
36
+ magFilter: LinearFilter,
37
+ format: RGBAFormat,
38
+ anisotropy: 16,
39
+ // 无 MSAA:深度测试 mask 无需抗锯齿,去掉以提速
40
+ });
41
+ const blur1TextureTarget = new WebGLRenderTarget(1024, 1024, {
42
+ minFilter: LinearFilter,
43
+ magFilter: LinearFilter,
44
+ format: RGBAFormat,
45
+ });
46
+ const blur2TextureTarget = new WebGLRenderTarget(1024, 1024, {
47
+ minFilter: LinearFilter,
48
+ magFilter: LinearFilter,
49
+ format: RGBAFormat,
50
+ });
51
+ // 外扩深度临时/结果目标:depthMinBlurShader 把本体深度图随 mask 一起外扩,
52
+ // 外扩区取邻域最近深度(忽略背景 1.0),使外扩区 selD<1.0,depthTest 才能正确判遮挡(不漏光)。
53
+ const selectDepthBlurTmpTextureTarget = new WebGLRenderTarget(1024, 1024, {
54
+ minFilter: LinearFilter,
55
+ magFilter: LinearFilter,
56
+ format: RGBAFormat,
57
+ });
58
+ const selectDepthBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
59
+ minFilter: LinearFilter,
60
+ magFilter: LinearFilter,
61
+ format: RGBAFormat,
62
+ });
63
+ // 外扩辉光经深度测试后的结果(步骤 5.6):独立 target,避免回写 blur1 触发历史回归 bug
64
+ const blurDepthTestTextureTarget = new WebGLRenderTarget(1024, 1024, {
65
+ minFilter: LinearFilter,
66
+ magFilter: LinearFilter,
67
+ format: RGBAFormat,
68
+ });
69
+ const size = new Vector2();
70
+ const depthTestShader = new ShaderMaterial({
71
+ uniforms: {
72
+ map: { value: null },
73
+ baseDepth: { value: null },
74
+ selectDepth: { value: null },
75
+ cameraFar: { value: 1000.0 },
76
+ },
52
77
  vertexShader: `
53
78
  ${ShaderChunk.common}
54
79
  ${ShaderChunk.logdepthbuf_pars_vertex}
@@ -58,37 +83,43 @@ const depthTestShader = new ShaderMaterial({
58
83
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
59
84
  ${ShaderChunk.logdepthbuf_vertex}
60
85
  }
61
- `,
86
+ `,
62
87
  fragmentShader: `
63
88
  ${ShaderChunk.logdepthbuf_pars_fragment}
64
89
  uniform sampler2D map;
65
90
  uniform sampler2D baseDepth;
66
91
  uniform sampler2D selectDepth;
92
+ uniform float cameraFar;
67
93
  varying vec2 vUv;
68
94
  void main() {
69
- if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
70
- discard;
71
- }
72
- if(texture2D(baseDepth, vUv).r == 1.0){
95
+ float baseD = texture2D(baseDepth, vUv).r;
96
+ float selD = texture2D(selectDepth, vUv).r;
97
+ // 参考手写版 a27bdea 的朴素对数深度比对:DepthTexture 存对数深度,「更小=更近」,
98
+ // base 比 select 更近即被真实场景遮挡 → discard。背景像素 base≈1.0 不小于物体 selD(<1.0)
99
+ // → 不丢弃,浮空物体辉光正常显示(不整片吃掉)。加极小对数容差 bias(≈0.0006) 防
100
+ // 自身像素浮点 z-fit 锯齿;真实更近物体深度差远大于此,不受影响。用二值 discard 而非
101
+ // 软遮挡:相交场景 base 深度在地板/物体间亚像素抖,软遮挡半透明渐隐边缘一抖就明显闪,
102
+ // 二值硬边界经后续 blur + FXAA 柔化更干净。
103
+ const float bias = 0.0006;
104
+ if (baseD < selD - bias) {
73
105
  discard;
74
106
  }
75
107
  gl_FragColor = texture2D(map, vUv);
76
108
  ${ShaderChunk.logdepthbuf_fragment}
77
109
  }
78
- `,
79
- blending: NoBlending, // 渲染时不与背景融合计算 直接替换
80
- depthTest: true,
81
- depthWrite: true,
82
- transparent: true,
83
- });
84
- // 高斯模糊着色器 - 水平方向
85
- const gaussianBlurHShader = new RawShaderMaterial({
86
- uniforms: {
87
- tDiffuse: { value: null },
88
- resolution: { value: new Vector2(1 / 512, 1 / 512) },
89
- radius: { value: 1.0 },
90
- sigma: { value: 1.0 },
91
- },
110
+ `,
111
+ blending: NoBlending,
112
+ depthTest: true,
113
+ depthWrite: true,
114
+ transparent: true,
115
+ });
116
+ const gaussianBlurHShader = new RawShaderMaterial({
117
+ uniforms: {
118
+ tDiffuse: { value: null },
119
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
120
+ radius: { value: 1.0 },
121
+ sigma: { value: 1.0 },
122
+ },
92
123
  vertexShader: `
93
124
  attribute vec3 position;
94
125
  attribute vec2 uv;
@@ -96,7 +127,7 @@ const gaussianBlurHShader = new RawShaderMaterial({
96
127
  void main() {
97
128
  vUv = uv;
98
129
  gl_Position = vec4(position, 1.0);
99
- }`,
130
+ }`,
100
131
  fragmentShader: `
101
132
  #ifdef GL_ES
102
133
  precision highp float;
@@ -107,7 +138,6 @@ const gaussianBlurHShader = new RawShaderMaterial({
107
138
  uniform float sigma;
108
139
  varying vec2 vUv;
109
140
 
110
- // 高斯函数
111
141
  float gaussian(float x, float sigma) {
112
142
  return exp(-(x * x) / (2.0 * sigma * sigma));
113
143
  }
@@ -116,7 +146,6 @@ const gaussianBlurHShader = new RawShaderMaterial({
116
146
  vec4 color = vec4(0.0);
117
147
  float totalWeight = 0.0;
118
148
 
119
- // 计算高斯权重
120
149
  for (int i = -10; i <= 10; i++) {
121
150
  float x = float(i);
122
151
  float weight = gaussian(x, sigma);
@@ -126,20 +155,19 @@ const gaussianBlurHShader = new RawShaderMaterial({
126
155
  }
127
156
 
128
157
  gl_FragColor = color / totalWeight;
129
- }`,
130
- blending: NoBlending,
131
- depthTest: false,
132
- depthWrite: false,
133
- transparent: true,
134
- });
135
- // 高斯模糊着色器 - 垂直方向
136
- const gaussianBlurVShader = new RawShaderMaterial({
137
- uniforms: {
138
- tDiffuse: { value: null },
139
- resolution: { value: new Vector2(1 / 512, 1 / 512) },
140
- radius: { value: 1.0 },
141
- sigma: { value: 1.0 },
142
- },
158
+ }`,
159
+ blending: NoBlending,
160
+ depthTest: false,
161
+ depthWrite: false,
162
+ transparent: true,
163
+ });
164
+ const gaussianBlurVShader = new RawShaderMaterial({
165
+ uniforms: {
166
+ tDiffuse: { value: null },
167
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
168
+ radius: { value: 1.0 },
169
+ sigma: { value: 1.0 },
170
+ },
143
171
  vertexShader: `
144
172
  attribute vec3 position;
145
173
  attribute vec2 uv;
@@ -147,7 +175,7 @@ const gaussianBlurVShader = new RawShaderMaterial({
147
175
  void main() {
148
176
  vUv = uv;
149
177
  gl_Position = vec4(position, 1.0);
150
- }`,
178
+ }`,
151
179
  fragmentShader: `
152
180
  #ifdef GL_ES
153
181
  precision highp float;
@@ -158,7 +186,6 @@ const gaussianBlurVShader = new RawShaderMaterial({
158
186
  uniform float sigma;
159
187
  varying vec2 vUv;
160
188
 
161
- // 高斯函数
162
189
  float gaussian(float x, float sigma) {
163
190
  return exp(-(x * x) / (2.0 * sigma * sigma));
164
191
  }
@@ -167,7 +194,6 @@ const gaussianBlurVShader = new RawShaderMaterial({
167
194
  vec4 color = vec4(0.0);
168
195
  float totalWeight = 0.0;
169
196
 
170
- // 计算高斯权重
171
197
  for (int i = -10; i <= 10; i++) {
172
198
  float y = float(i);
173
199
  float weight = gaussian(y, sigma);
@@ -177,20 +203,66 @@ const gaussianBlurVShader = new RawShaderMaterial({
177
203
  }
178
204
 
179
205
  gl_FragColor = color / totalWeight;
180
- }`,
181
- blending: NoBlending,
182
- depthTest: false,
183
- depthWrite: false,
184
- transparent: true,
185
- });
186
- // 发光合成着色器
187
- const glowCompositeShader = new RawShaderMaterial({
188
- uniforms: {
189
- tDiffuse: { value: null },
190
- color: { value: new Color("#0f0") },
191
- opacity: { value: 1.0 },
192
- threshold: { value: 0.0 },
193
- },
206
+ }`,
207
+ blending: NoBlending,
208
+ depthTest: false,
209
+ depthWrite: false,
210
+ transparent: true,
211
+ });
212
+ // 深度 min-blur(最近深度,忽略背景 1.0):随 mask 一起把深度图向外扩,
213
+ // 外扩区 selD = 物体最近深度(<1.0) 而非清屏 1.0,depthTest 在外扩区才能正确判遮挡(不漏光),
214
+ // 同时本体区仍靠 depthTestShader 的 EPSILON 容差防自遮挡闪烁(无缝)。separable(direction 控制 H/V)。
215
+ const depthMinBlurShader = new ShaderMaterial({
216
+ uniforms: {
217
+ tDepth: { value: null },
218
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
219
+ radius: { value: 1.0 },
220
+ direction: { value: new Vector2(1, 0) },
221
+ },
222
+ vertexShader: `
223
+ ${ShaderChunk.common}
224
+ ${ShaderChunk.logdepthbuf_pars_vertex}
225
+ varying vec2 vUv;
226
+ void main() {
227
+ vUv = uv;
228
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
229
+ ${ShaderChunk.logdepthbuf_vertex}
230
+ }
231
+ `,
232
+ fragmentShader: `
233
+ ${ShaderChunk.logdepthbuf_pars_fragment}
234
+ uniform sampler2D tDepth;
235
+ uniform vec2 resolution;
236
+ uniform float radius;
237
+ uniform vec2 direction;
238
+ varying vec2 vUv;
239
+ void main() {
240
+ float minD = 1.0;
241
+ for (int i = -10; i <= 10; i++) {
242
+ float x = float(i);
243
+ vec2 off = direction * (x * radius * resolution);
244
+ float d = texture2D(tDepth, vUv + off).r;
245
+ if (d < 0.9999) {
246
+ minD = min(minD, d);
247
+ }
248
+ }
249
+ gl_FragColor = vec4(minD, 0.0, 0.0, 1.0);
250
+ ${ShaderChunk.logdepthbuf_fragment}
251
+ }
252
+ `,
253
+ blending: NoBlending,
254
+ depthTest: false,
255
+ depthWrite: false,
256
+ transparent: true,
257
+ });
258
+ const glowCompositeShader = new RawShaderMaterial({
259
+ uniforms: {
260
+ tDiffuse: { value: null },
261
+ color: { value: new Color("#0f0") },
262
+ opacity: { value: 1.0 },
263
+ threshold: { value: 0.0 },
264
+ intensity: { value: 1.0 },
265
+ },
194
266
  vertexShader: `
195
267
  attribute vec3 position;
196
268
  attribute vec2 uv;
@@ -198,7 +270,7 @@ const glowCompositeShader = new RawShaderMaterial({
198
270
  void main() {
199
271
  vUv = uv;
200
272
  gl_Position = vec4(position, 1.0);
201
- }`,
273
+ }`,
202
274
  fragmentShader: `
203
275
  #ifdef GL_ES
204
276
  precision highp float;
@@ -207,35 +279,135 @@ const glowCompositeShader = new RawShaderMaterial({
207
279
  uniform vec3 color;
208
280
  uniform float opacity;
209
281
  uniform float threshold;
282
+ uniform float intensity;
210
283
  varying vec2 vUv;
211
-
284
+
212
285
  void main() {
213
286
  vec4 texColor = texture2D(tDiffuse, vUv);
214
287
  float alpha = texColor.a;
215
-
216
- // 应用阈值
288
+
217
289
  if (alpha < threshold) {
218
290
  gl_FragColor = vec4(0.0);
219
291
  return;
220
292
  }
221
-
222
- // 增强alpha值,确保发光效果明显
293
+
223
294
  alpha = min(1.0, alpha * 2.0);
224
-
225
- gl_FragColor = vec4(color, alpha * opacity);
226
- }`,
227
- blending: NoBlending,
228
- depthTest: false,
229
- depthWrite: false,
230
- transparent: true,
231
- });
232
- // 过滤着色器 - 修复alpha计算逻辑
233
- const filterSelectShader = new RawShaderMaterial({
234
- uniforms: {
235
- selectTexture: { value: null },
236
- blurTexture: { value: null },
237
- opacity: { value: 1 },
238
- },
295
+
296
+ // intensity 让颜色亮度可超 1(配合 glow_additive 加性混合呈发光感,很亮那种)
297
+ gl_FragColor = vec4(color * intensity, alpha * opacity);
298
+ }`,
299
+ blending: NoBlending,
300
+ depthTest: false,
301
+ depthWrite: false,
302
+ transparent: true,
303
+ });
304
+ // 薄高亮层合成:对本体 mask 做 1 次像素扩张(24 方向偏移 width 像素采样),
305
+ // 扩张区 − 本体 = 贴着物体边缘的一圈薄亮环(rim)。上 glow 颜色,跟随 glow_additive 叠加,
306
+ // 与外圈柔光晕(filterSelect 结果)并存 → 选中态边缘有「实亮轮廓 + 外柔光」。
307
+ // ⚠️ 默认关闭(glow_highlight=false),只有对象显式开启才会执行,避免干扰既有发光合成。
308
+ const thinHighlightShader = new RawShaderMaterial({
309
+ uniforms: {
310
+ tMask: { value: null },
311
+ color: { value: new Color("#0f0") },
312
+ uWidth: { value: 1.0 },
313
+ opacity: { value: 1.0 },
314
+ intensity: { value: 1.0 },
315
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
316
+ uDebugVis: { value: 0.0 },
317
+ offset: {
318
+ value: [
319
+ new Vector2(0.000, 1.000),
320
+ new Vector2(0.259, 0.966),
321
+ new Vector2(0.500, 0.866),
322
+ new Vector2(0.707, 0.707),
323
+ new Vector2(0.866, 0.500),
324
+ new Vector2(0.966, 0.259),
325
+ new Vector2(1.000, 0.000),
326
+ new Vector2(0.966, -0.259),
327
+ new Vector2(0.866, -0.500),
328
+ new Vector2(0.707, -0.707),
329
+ new Vector2(0.500, -0.866),
330
+ new Vector2(0.259, -0.966),
331
+ new Vector2(0.000, -1.000),
332
+ new Vector2(-0.259, -0.966),
333
+ new Vector2(-0.500, -0.866),
334
+ new Vector2(-0.707, -0.707),
335
+ new Vector2(-0.866, -0.500),
336
+ new Vector2(-0.966, -0.259),
337
+ new Vector2(-1.000, -0.000),
338
+ new Vector2(-0.966, 0.259),
339
+ new Vector2(-0.866, 0.500),
340
+ new Vector2(-0.707, 0.707),
341
+ new Vector2(-0.500, 0.866),
342
+ new Vector2(-0.259, 0.966)
343
+ ]
344
+ }
345
+ },
346
+ vertexShader: `
347
+ attribute vec3 position;
348
+ attribute vec2 uv;
349
+ varying vec2 vUv;
350
+ void main() {
351
+ vUv = uv;
352
+ gl_Position = vec4(position, 1.0);
353
+ }`,
354
+ fragmentShader: `
355
+ #ifdef GL_ES
356
+ precision highp float;
357
+ #endif
358
+ uniform sampler2D tMask;
359
+ uniform vec3 color;
360
+ uniform float uWidth;
361
+ uniform float opacity;
362
+ uniform float intensity;
363
+ uniform vec2 resolution;
364
+ uniform float uDebugVis;
365
+ uniform vec2 offset[24];
366
+ varying vec2 vUv;
367
+
368
+ void main() {
369
+ // ⚠️ piexl 必须 main 内局部初始化(不能在全局用 uniform 初始化,某些 driver 会静默置 0)。
370
+ vec2 piexl = resolution * uWidth;
371
+ vec4 self = texture2D(tMask, vUv);
372
+ float hit = 0.0;
373
+ for (int i = 0; i < 24; i++) {
374
+ vec4 c = texture2D(tMask, vUv + offset[i] * piexl);
375
+ if (c.a > 0.0) {
376
+ hit = 1.0;
377
+ }
378
+ }
379
+ // 扩张区 − 本体 = 物体外一圈薄亮环(贴边轮廓)
380
+ float rim = clamp(hit - self.a, 0.0, 1.0);
381
+
382
+ // 调试可视化(window.__GLOW_HIGHLIGHT_VIS=true 开启):
383
+ // R=扩张命中区(hit) G=本体(self.a) B=最终 rim(薄亮环)
384
+ // 正常应看到:物体内部 G=1(绿),物体外紧贴一圈 B=1(蓝细环),其余全黑。
385
+ // 若整片有颜色 → mask/扩张参数异常。
386
+ if (uDebugVis > 0.5) {
387
+ gl_FragColor = vec4(hit, self.a, rim, 1.0);
388
+ return;
389
+ }
390
+
391
+ if (rim < 0.001) {
392
+ gl_FragColor = vec4(0.0);
393
+ return;
394
+ }
395
+ // 薄高亮层:只需比外圈辉光"稍亮"即可凸显,过曝会偏白、丢掉辉光本色。
396
+ // 向白色混合 0.3(保留 7 成辉光本色)+ 亮度乘 1.2:轮廓清晰可辨,又不抢辉光的色。
397
+ vec3 hl = mix(color, vec3(1.0), 0.3) * 1.2;
398
+ gl_FragColor = vec4(hl, rim * opacity);
399
+ }`,
400
+ blending: NoBlending,
401
+ depthTest: false,
402
+ depthWrite: false,
403
+ transparent: true
404
+ });
405
+ const filterSelectShader = new RawShaderMaterial({
406
+ uniforms: {
407
+ selectTexture: { value: null },
408
+ blurTexture: { value: null },
409
+ opacity: { value: 1 },
410
+ },
239
411
  vertexShader: `
240
412
  attribute vec3 position;
241
413
  attribute vec2 uv;
@@ -244,7 +416,7 @@ const filterSelectShader = new RawShaderMaterial({
244
416
  vUv = uv;
245
417
  gl_Position = vec4(position, 1.0);
246
418
  }
247
- `,
419
+ `,
248
420
  fragmentShader: `
249
421
  #ifdef GL_ES
250
422
  precision highp float;
@@ -255,42 +427,36 @@ const filterSelectShader = new RawShaderMaterial({
255
427
  varying vec2 vUv;
256
428
 
257
429
  void main() {
258
- // 获取模糊后的纹理和原始纹理
259
430
  vec4 blurColor = texture2D(blurTexture, vUv);
260
431
  vec4 selectColor = texture2D(selectTexture, vUv);
261
432
 
262
- // 计算辉光部分:模糊纹理 - 原始纹理,确保alpha非负
263
433
  vec4 glowColor = blurColor - selectColor;
264
434
  glowColor.a = max(0.0, glowColor.a);
265
435
 
266
- // 应用透明度
267
436
  glowColor.a *= opacity;
268
437
 
269
- // 设置最终颜色
270
438
  gl_FragColor = glowColor;
271
439
  }
272
- `,
273
- blending: NormalBlending, // 与现有纹理融合
274
- depthTest: false,
275
- depthWrite: false,
276
- transparent: true,
277
- });
278
- const copyShader = new ShaderMaterial({
279
- uniforms: {
280
- map: { value: null }, // 贴图纹理
281
- },
440
+ `,
441
+ blending: NormalBlending,
442
+ depthTest: false,
443
+ depthWrite: false,
444
+ transparent: true,
445
+ });
446
+ const copyShader = new ShaderMaterial({
447
+ uniforms: {
448
+ map: { value: null },
449
+ },
282
450
  vertexShader: `
283
451
  ${ShaderChunk.common}
284
452
  ${ShaderChunk.logdepthbuf_pars_vertex}
285
453
  varying vec2 vUv;
286
454
  void main() {
287
455
  vUv = uv;
288
- // gl_Position = vec4(position, 1.0);
289
- // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
290
456
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
291
457
  ${ShaderChunk.logdepthbuf_vertex}
292
458
  }
293
- `,
459
+ `,
294
460
  fragmentShader: `
295
461
  ${ShaderChunk.logdepthbuf_pars_fragment}
296
462
  uniform sampler2D map;
@@ -299,93 +465,143 @@ const copyShader = new ShaderMaterial({
299
465
  gl_FragColor = texture2D(map, vUv);
300
466
  ${ShaderChunk.logdepthbuf_fragment}
301
467
  }
302
- `,
303
- depthTest: true,
304
- depthWrite: true,
305
- transparent: true,
306
- });
307
- // 场景对象
308
- const scene = new Scene();
309
- // 对象发光
310
- export default function glow_pass(renderer, camera, object3d, baseDepthTexture, devicePixelRatio) {
311
- const { glow_enable = false, glow_color = "#04fa12", glow_width = 1, glow_opacity = 1, glow_sigma = 2.0, // 高斯模糊的标准差
312
- glow_threshold = 0.0, // 发光阈值,默认0确保辉光显示
313
- glow_iterations = 10, // 模糊迭代次数
314
- } = object3d.userData;
315
- if (!glow_enable || glow_width === 0) {
316
- return;
317
- }
318
- // 保存原帧缓冲区
319
- const originRenderTarget = renderer.getRenderTarget();
320
- // 设置选中目标的帧缓冲区
321
- renderer.getSize(size);
322
- size.multiplyScalar(devicePixelRatio);
323
- selectTextureTarget.setSize(size.x, size.y);
324
- selectDethpTestTextureTarget.setSize(size.x, size.y);
325
- blur1TextureTarget.setSize(size.x, size.y);
326
- blur2TextureTarget.setSize(size.x, size.y);
327
- // 1. 将对象渲染到临时纹理
328
- renderer.setRenderTarget(selectTextureTarget);
329
- scene.children = [object3d];
330
- renderer.clear();
331
- renderer.render(scene, camera);
332
- // 2. 使用深度纹理提取选中的对象未被遮挡的像素点
333
- renderer.setRenderTarget(selectDethpTestTextureTarget);
334
- renderer.clear();
335
- depthTestShader.uniforms.map.value = selectTextureTarget.texture;
336
- depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
337
- depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
338
- fsQuad.render(renderer, depthTestShader);
339
- // 3. 设置高斯模糊参数
340
- const blurRadius = glow_width * 2.0; // 增加模糊半径,使辉光更明显
341
- gaussianBlurHShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
342
- gaussianBlurVShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
343
- gaussianBlurHShader.uniforms.radius.value = blurRadius;
344
- gaussianBlurVShader.uniforms.radius.value = blurRadius;
345
- gaussianBlurHShader.uniforms.sigma.value = glow_sigma;
346
- gaussianBlurVShader.uniforms.sigma.value = glow_sigma;
347
- // 4. 执行高斯模糊 - 简化逻辑,确保可靠性
348
- // 第一次模糊
349
- renderer.setRenderTarget(blur1TextureTarget);
350
- renderer.clear();
351
- gaussianBlurHShader.uniforms.tDiffuse.value = selectDethpTestTextureTarget.texture;
352
- fsQuad.render(renderer, gaussianBlurHShader);
353
- renderer.setRenderTarget(blur2TextureTarget);
354
- renderer.clear();
355
- gaussianBlurVShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
356
- fsQuad.render(renderer, gaussianBlurVShader);
357
- // 如果需要多次迭代,继续模糊
358
- if (glow_iterations > 1) {
359
- for (let i = 1; i < glow_iterations; i++) {
360
- renderer.setRenderTarget(blur1TextureTarget);
361
- renderer.clear();
362
- gaussianBlurHShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
363
- fsQuad.render(renderer, gaussianBlurHShader);
364
- renderer.setRenderTarget(blur2TextureTarget);
365
- renderer.clear();
366
- gaussianBlurVShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
367
- fsQuad.render(renderer, gaussianBlurVShader);
368
- }
369
- }
370
- // 5. 发光合成 - 使用最终的模糊结果
371
- renderer.setRenderTarget(blur1TextureTarget);
372
- renderer.clear();
373
- glowCompositeShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
374
- glowCompositeShader.uniforms.color.value.set(glow_color);
375
- glowCompositeShader.uniforms.opacity.value = 1.0;
376
- glowCompositeShader.uniforms.threshold.value = glow_threshold;
377
- fsQuad.render(renderer, glowCompositeShader);
378
- // 6. 还原帧缓冲区 减去原始纹理保留发光部分
379
- renderer.setRenderTarget(originRenderTarget);
380
- filterSelectShader.uniforms.selectTexture.value = selectDethpTestTextureTarget.texture;
381
- filterSelectShader.uniforms.blurTexture.value = blur1TextureTarget.texture;
382
- filterSelectShader.uniforms.opacity.value = glow_opacity;
383
- filterSelectShader.blending = NormalBlending; // 与有的纹理融合计算 保留前面通道传递下来的纹理
384
- fsQuad.render(renderer, filterSelectShader);
385
- // 调试代码
386
- // renderer.setRenderTarget(null);
387
- // renderer.clearDepth();
388
- // copyShader.uniforms.map.value = blur1TextureTarget.texture;
389
- // fsQuad.render(renderer, copyShader);
390
- // return;
391
- }
468
+ `,
469
+ depthTest: true,
470
+ depthWrite: true,
471
+ transparent: true,
472
+ });
473
+ const scene = new Scene();
474
+ export default function glow_pass(renderer, camera, object3d, baseDepthTexture, devicePixelRatio) {
475
+ const { glow_enable = false, glow_color = "#04fa12", glow_width = 1, glow_opacity = 1, glow_sigma = 2.0, glow_threshold = 0.0, glow_iterations = 10, glow_intensity = 1.0, glow_additive = false, glow_highlight_width = 2, // 薄高亮层粗细(像素,默认 2);设为 0 则不画薄高亮层
476
+ } = object3d.userData;
477
+ if (!glow_enable || glow_width === 0) {
478
+ return;
479
+ }
480
+ const originRenderTarget = renderer.getRenderTarget();
481
+ // 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
482
+ // 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
483
+ renderer.getSize(size);
484
+ size.multiplyScalar(devicePixelRatio);
485
+ selectTextureTarget.setSize(size.x, size.y);
486
+ selectDepthTextureTarget.setSize(size.x, size.y);
487
+ // 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
488
+ // 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致辉光被错误 discard
489
+ selectDepthTexture.image.width = size.x;
490
+ selectDepthTexture.image.height = size.y;
491
+ selectDepthTexture.needsUpdate = true;
492
+ selectDepthTestTextureTarget.setSize(size.x, size.y);
493
+ blur1TextureTarget.setSize(size.x, size.y);
494
+ blur2TextureTarget.setSize(size.x, size.y);
495
+ selectDepthBlurTmpTextureTarget.setSize(size.x, size.y);
496
+ selectDepthBlurTextureTarget.setSize(size.x, size.y);
497
+ blurDepthTestTextureTarget.setSize(size.x, size.y);
498
+ // 1. 渲染物体本体 mask(灰度)
499
+ renderer.setRenderTarget(selectTextureTarget);
500
+ scene.children = [object3d];
501
+ renderer.clear();
502
+ renderer.render(scene, camera);
503
+ // 2. 渲染物体本体深度(无 MSAA,供 min-blur 外扩用)
504
+ renderer.setRenderTarget(selectDepthTextureTarget);
505
+ scene.children = [object3d];
506
+ renderer.clear();
507
+ renderer.render(scene, camera);
508
+ // 调试:把本次渲染的选区深度记到全局调试状态,供面板「辉光深度比对」读取
509
+ debugDepthState.lastSelectDepth = selectDepthTexture;
510
+ // 3. 深度测试(用本体 mask):被真实更近物体挡住的「本体辉光」部分 discard。
511
+ // 背景像素 baseDepth≈1.0(最远)永远不小于物体深度 → 不丢弃,浮空物体辉光正常显示。
512
+ renderer.setRenderTarget(selectDepthTestTextureTarget);
513
+ renderer.clear();
514
+ depthTestShader.uniforms.map.value = selectTextureTarget.texture;
515
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
516
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
517
+ depthTestShader.uniforms.cameraFar.value = camera.far;
518
+ fsQuad.render(renderer, depthTestShader);
519
+ // 4. 从「深度测试后的本体辉光」开始高斯模糊外扩(外扩环自动继承本体遮挡判定 → 不漏光)
520
+ const blurRadius = glow_width * 2.0;
521
+ gaussianBlurHShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
522
+ gaussianBlurVShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
523
+ gaussianBlurHShader.uniforms.radius.value = blurRadius;
524
+ gaussianBlurVShader.uniforms.radius.value = blurRadius;
525
+ gaussianBlurHShader.uniforms.sigma.value = glow_sigma;
526
+ gaussianBlurVShader.uniforms.sigma.value = glow_sigma;
527
+ renderer.setRenderTarget(blur1TextureTarget);
528
+ renderer.clear();
529
+ gaussianBlurHShader.uniforms.tDiffuse.value = selectDepthTestTextureTarget.texture;
530
+ fsQuad.render(renderer, gaussianBlurHShader);
531
+ renderer.setRenderTarget(blur2TextureTarget);
532
+ renderer.clear();
533
+ gaussianBlurVShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
534
+ fsQuad.render(renderer, gaussianBlurVShader);
535
+ if (glow_iterations > 1) {
536
+ for (let i = 1; i < glow_iterations; i++) {
537
+ renderer.setRenderTarget(blur1TextureTarget);
538
+ renderer.clear();
539
+ gaussianBlurHShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
540
+ fsQuad.render(renderer, gaussianBlurHShader);
541
+ renderer.setRenderTarget(blur2TextureTarget);
542
+ renderer.clear();
543
+ gaussianBlurVShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
544
+ fsQuad.render(renderer, gaussianBlurVShader);
545
+ }
546
+ }
547
+ // 5. 辉光合成(上色「最终外扩辉光」blur2 → blur1)
548
+ renderer.setRenderTarget(blur1TextureTarget);
549
+ renderer.clear();
550
+ glowCompositeShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
551
+ glowCompositeShader.uniforms.color.value.set(glow_color);
552
+ glowCompositeShader.uniforms.opacity.value = 1.0;
553
+ glowCompositeShader.uniforms.threshold.value = glow_threshold;
554
+ glowCompositeShader.uniforms.intensity.value = glow_intensity;
555
+ fsQuad.render(renderer, glowCompositeShader);
556
+ // 5.5 ⭐ 外扩环深度测试(补齐此前只定义未调用的死代码,与 stroke_pass 同一修复):
557
+ // 本体深度随辉光一起外扩(separable H/V,外扩区取邻域最近深度),
558
+ // 再用它对外扩后的辉光做一次 depthTest —— 否则外扩环永远不参与遮挡判定,
559
+ // 物体被挡住时辉光依旧从遮挡物前方漏出来。
560
+ depthMinBlurShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
561
+ depthMinBlurShader.uniforms.radius.value = Math.max(1, blurRadius);
562
+ depthMinBlurShader.uniforms.direction.value.set(1, 0);
563
+ depthMinBlurShader.uniforms.tDepth.value = selectDepthTexture;
564
+ renderer.setRenderTarget(selectDepthBlurTmpTextureTarget);
565
+ renderer.clear();
566
+ fsQuad.render(renderer, depthMinBlurShader);
567
+ depthMinBlurShader.uniforms.direction.value.set(0, 1);
568
+ depthMinBlurShader.uniforms.tDepth.value = selectDepthBlurTmpTextureTarget.texture;
569
+ renderer.setRenderTarget(selectDepthBlurTextureTarget);
570
+ renderer.clear();
571
+ fsQuad.render(renderer, depthMinBlurShader);
572
+ // 5.6 对外扩后的辉光判遮挡(输出到独立 target,绝不回写 blur1,避免步骤 6 相减归零)
573
+ renderer.setRenderTarget(blurDepthTestTextureTarget);
574
+ renderer.clear();
575
+ depthTestShader.uniforms.map.value = blur1TextureTarget.texture;
576
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
577
+ depthTestShader.uniforms.selectDepth.value = selectDepthBlurTextureTarget.texture;
578
+ depthTestShader.uniforms.cameraFar.value = camera.far;
579
+ fsQuad.render(renderer, depthTestShader);
580
+ // 6. 合成到屏幕:filterSelect(blur=上色后且已判遮挡的最终外扩辉光, select=深度测试后本体辉光)
581
+ // = 仅保留辉光外扩环;本体被减掉。⚠️ blur 必须是最终外扩辉光,绝不能被 depthTest 结果覆盖
582
+ // (早期回归:误把 depthTest 结果上色进 blur1 → filterSelect 相减归零 → 辉光全不显示)。
583
+ renderer.setRenderTarget(originRenderTarget);
584
+ filterSelectShader.uniforms.selectTexture.value = selectDepthTestTextureTarget.texture;
585
+ filterSelectShader.uniforms.blurTexture.value = blurDepthTestTextureTarget.texture;
586
+ filterSelectShader.uniforms.opacity.value = glow_opacity;
587
+ // glow_additive=true 时用加性混合,光晕叠加到画面呈发光感(很亮那种);否则普通半透明覆盖(默认)
588
+ filterSelectShader.blending = glow_additive ? AdditiveBlending : NormalBlending;
589
+ fsQuad.render(renderer, filterSelectShader);
590
+ // 7. 薄高亮层:贴物体边缘的细亮环(rim),与外圈柔光晕并存 —— glow 的**默认行为,始终绘制、无开关参数**。
591
+ // 用本体 mask(selectDepthTestTextureTarget,深度测试后)做 1 次像素扩张 → 扩张区减本体 = 贴边薄环。
592
+ // 唯一可调项 glow_highlight_width(默认 2px):控制薄环粗细;=0 时扩张像素为 0,自然无可见环。
593
+ {
594
+ thinHighlightShader.uniforms.tMask.value = selectDepthTestTextureTarget.texture;
595
+ thinHighlightShader.uniforms.color.value.set(glow_color);
596
+ thinHighlightShader.uniforms.uWidth.value = glow_highlight_width;
597
+ thinHighlightShader.uniforms.opacity.value = glow_opacity;
598
+ thinHighlightShader.uniforms.intensity.value = glow_intensity;
599
+ thinHighlightShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
600
+ // 调试:window.__GLOW_HIGHLIGHT_VIS = true 时输出 rim 可视化(R=扩张区 G=本体 B=薄亮环)
601
+ thinHighlightShader.uniforms.uDebugVis.value = (window.__GLOW_HIGHLIGHT_VIS) ? 1.0 : 0.0;
602
+ // 跟随 glow_additive:加性时薄亮环也发光叠加,否则半透明覆盖
603
+ thinHighlightShader.blending = glow_additive ? AdditiveBlending : NormalBlending;
604
+ renderer.setRenderTarget(originRenderTarget);
605
+ fsQuad.render(renderer, thinHighlightShader);
606
+ }
607
+ }