three-base 2.0.142 → 2.0.166

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 (231) hide show
  1. package/DirectionalLight.d.ts +6 -6
  2. package/DirectionalLight.js +68 -68
  3. package/EventMap.d.ts +103 -103
  4. package/EventMap.js +17 -17
  5. package/EventMesh.d.ts +18 -18
  6. package/EventMesh.js +59 -59
  7. package/ExtrudeMesh.d.ts +112 -112
  8. package/ExtrudeMesh.js +342 -342
  9. package/FPScontrol.d.ts +531 -511
  10. package/FPScontrol.js +1866 -1799
  11. package/FPScontrol.ts +1922 -1855
  12. package/Fire/Fire.d.ts +28 -28
  13. package/Fire/Fire.js +80 -80
  14. package/Fire/FireGeometry.d.ts +9 -9
  15. package/Fire/FireGeometry.js +40 -40
  16. package/Fire/FireMaterial.d.ts +28 -28
  17. package/Fire/FireMaterial.js +32 -32
  18. package/Fire/index.d.ts +2 -2
  19. package/Fire/index.js +2 -2
  20. package/GLTFDracoLoader.d.ts +71 -71
  21. package/GLTFDracoLoader.js +266 -266
  22. package/GLTFDracoLoader.ts +1 -1
  23. package/Grass/Grass.d.ts +8 -8
  24. package/Grass/Grass.js +38 -38
  25. package/Grass/index.d.ts +2 -2
  26. package/Grass/index.js +2 -2
  27. package/Ground1/Ground1.d.ts +10 -10
  28. package/Ground1/Ground1.js +71 -71
  29. package/Ground1/index.d.ts +1 -1
  30. package/Ground1/index.js +1 -1
  31. package/MeshBase.d.ts +36 -36
  32. package/MeshBase.js +251 -247
  33. package/MeshBase.ts +6 -2
  34. package/Mirror.d.ts +25 -25
  35. package/Mirror.js +143 -143
  36. package/MktMesh/MktMesh.d.ts +301 -291
  37. package/MktMesh/MktMesh.js +1064 -1045
  38. package/MktMesh/MktMesh.ts +32 -11
  39. package/MktMesh/assetUrl.d.ts +59 -35
  40. package/MktMesh/assetUrl.js +165 -69
  41. package/MktMesh/assetUrl.ts +164 -69
  42. package/MktMesh/mktMappingShader.d.ts +12 -12
  43. package/MktMesh/mktMappingShader.js +138 -138
  44. package/MktMesh/mktMappingShader.ts +139 -139
  45. package/MktMesh/mktShader.d.ts +263 -263
  46. package/MktMesh/mktShader.js +1236 -1236
  47. package/MktMesh/mktShader.ts +1344 -1344
  48. package/MktMesh/panoBitmapTexture.d.ts +25 -25
  49. package/MktMesh/panoBitmapTexture.js +52 -52
  50. package/MktMesh/panoBitmapTexture.ts +54 -54
  51. package/MktMesh/panoSlotBind.d.ts +29 -29
  52. package/MktMesh/panoSlotBind.js +106 -106
  53. package/MktMesh/panoSlotBind.ts +153 -153
  54. package/MktMesh/panoSlotRoster.d.ts +22 -22
  55. package/MktMesh/panoSlotRoster.js +169 -169
  56. package/MktMesh/panoSlotRoster.ts +168 -168
  57. package/MktMesh/panoTileStitcher.d.ts +119 -119
  58. package/MktMesh/panoTileStitcher.js +529 -529
  59. package/MktMesh/panoTileStitcher.ts +616 -616
  60. package/MktMesh/types.d.ts +75 -75
  61. package/MktMesh/types.js +1 -1
  62. package/MktMesh/wallCapTessellate.d.ts +33 -33
  63. package/MktMesh/wallCapTessellate.js +97 -97
  64. package/MktMesh/wallCapTessellate.ts +68 -68
  65. package/PipeMesh/PathGeometry.d.ts +44 -44
  66. package/PipeMesh/PathGeometry.js +307 -307
  67. package/PipeMesh/PathPoint.d.ts +17 -17
  68. package/PipeMesh/PathPoint.js +31 -31
  69. package/PipeMesh/PathPointList.d.ts +31 -31
  70. package/PipeMesh/PathPointList.js +209 -209
  71. package/PipeMesh/PathTubeGeometry.d.ts +25 -25
  72. package/PipeMesh/PathTubeGeometry.js +130 -130
  73. package/PipeMesh/PipeMesh.d.ts +25 -25
  74. package/PipeMesh/PipeMesh.js +63 -63
  75. package/PipeMesh/index.d.ts +1 -1
  76. package/PipeMesh/index.js +1 -1
  77. package/PlaneModal1/PlaneModal1.d.ts +34 -34
  78. package/PlaneModal1/PlaneModal1.js +109 -109
  79. package/PlaneModal1/index.d.ts +1 -1
  80. package/PlaneModal1/index.js +1 -1
  81. package/PlaneText.d.ts +27 -27
  82. package/PlaneText.js +35 -35
  83. package/PlaneWithHtml.d.ts +13 -13
  84. package/PlaneWithHtml.js +66 -64
  85. package/PlaneWithHtml.ts +3 -1
  86. package/PointLight/PointLight.d.ts +13 -13
  87. package/PointLight/PointLight.js +64 -64
  88. package/PointLight/index.d.ts +1 -1
  89. package/PointLight/index.js +1 -1
  90. package/Sky/Sky.d.ts +9 -9
  91. package/Sky/Sky.js +22 -22
  92. package/Sky/index.d.ts +1 -1
  93. package/Sky/index.js +1 -1
  94. package/SpotLight.d.ts +6 -6
  95. package/SpotLight.js +72 -72
  96. package/SpriteModal1/SpriteModal1.d.ts +33 -33
  97. package/SpriteModal1/SpriteModal1.js +116 -116
  98. package/SpriteModal1/index.d.ts +1 -1
  99. package/SpriteModal1/index.js +1 -1
  100. package/SpriteText.d.ts +46 -46
  101. package/SpriteText.js +176 -176
  102. package/SpriteText2.d.ts +48 -48
  103. package/SpriteText2.js +223 -223
  104. package/SpriteText3.d.ts +86 -86
  105. package/SpriteText3.js +517 -517
  106. package/SpriteText3.ts +599 -599
  107. package/SpriteWithHtml.d.ts +9 -9
  108. package/SpriteWithHtml.js +46 -44
  109. package/SpriteWithHtml.ts +3 -1
  110. package/Text3D/Text3D.d.ts +20 -20
  111. package/Text3D/Text3D.js +58 -58
  112. package/Text3D/fontController.d.ts +60 -60
  113. package/Text3D/fontController.js +166 -166
  114. package/Text3D/index.d.ts +1 -1
  115. package/Text3D/index.js +1 -1
  116. package/ThreeBase.d.ts +248 -248
  117. package/ThreeBase.js +1202 -1202
  118. package/ThreeBase.ts +1314 -1314
  119. package/ThreeMouse.d.ts +53 -54
  120. package/ThreeMouse.js +453 -453
  121. package/Transition.d.ts +45 -45
  122. package/Transition.js +209 -209
  123. package/Water/Water.d.ts +5 -5
  124. package/Water/Water.js +44 -44
  125. package/Water/index.d.ts +2 -2
  126. package/Water/index.js +2 -2
  127. package/WaterFlow/FloatingDuck.d.ts +88 -88
  128. package/WaterFlow/FloatingDuck.js +307 -307
  129. package/WaterFlow/FloatingDuck.ts +445 -445
  130. package/WaterFlow/GPUFluidSimulation.d.ts +56 -56
  131. package/WaterFlow/GPUFluidSimulation.js +781 -781
  132. package/WaterFlow/GPUFluidSimulation.ts +827 -827
  133. package/WaterFlow/ReservoirSystem.d.ts +106 -106
  134. package/WaterFlow/ReservoirSystem.js +611 -611
  135. package/WaterFlow/ReservoirSystem.ts +754 -754
  136. package/WaterFlow/SPHField.d.ts +35 -35
  137. package/WaterFlow/SPHField.js +203 -203
  138. package/WaterFlow/SPHField.ts +228 -228
  139. package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -69
  140. package/WaterFlow/ScreenSpaceFluidPass.js +728 -728
  141. package/WaterFlow/ScreenSpaceFluidPass.ts +789 -789
  142. package/WaterFlow/ShallowWaterSurface.d.ts +45 -45
  143. package/WaterFlow/ShallowWaterSurface.js +438 -438
  144. package/WaterFlow/ShallowWaterSurface.ts +510 -510
  145. package/WaterFlow/WaterFlow.d.ts +87 -87
  146. package/WaterFlow/WaterFlow.js +171 -171
  147. package/WaterFlow/WaterFlow.ts +219 -219
  148. package/WaterFlow/types.d.ts +161 -161
  149. package/WaterFlow/types.js +1 -1
  150. package/WaterFlow/types.ts +189 -189
  151. package/WaterFlow/waterFlowPass.d.ts +3 -3
  152. package/WaterFlow/waterFlowPass.js +20 -20
  153. package/WaterFlow/waterFlowPass.ts +40 -40
  154. package/collisionOBB.d.ts +42 -42
  155. package/collisionOBB.js +112 -112
  156. package/collisionOBB.ts +108 -108
  157. package/declare.d.ts +25 -25
  158. package/index.d.ts +1 -1
  159. package/index.js +1 -1
  160. package/instanced/InstancedBatch.d.ts +57 -57
  161. package/instanced/InstancedBatch.js +348 -348
  162. package/instanced/InstancedBatch.ts +406 -406
  163. package/instanced/InstancedChild.d.ts +174 -174
  164. package/instanced/InstancedChild.js +264 -264
  165. package/instanced/InstancedChild.ts +327 -327
  166. package/instanced/InstancedGroup.d.ts +43 -43
  167. package/instanced/InstancedGroup.js +126 -126
  168. package/instanced/InstancedGroup.ts +137 -137
  169. package/instanced/InstancedMeshBase.d.ts +38 -38
  170. package/instanced/InstancedMeshBase.js +282 -282
  171. package/instanced/InstancedTemplate.d.ts +46 -46
  172. package/instanced/InstancedTemplate.js +125 -125
  173. package/keyControls.d.ts +29 -30
  174. package/keyControls.js +101 -101
  175. package/lensflare/LensFlare.d.ts +39 -39
  176. package/lensflare/LensFlare.js +284 -284
  177. package/package.json +6 -1
  178. package/pass/bloom_pass.d.ts +2 -2
  179. package/pass/bloom_pass.js +174 -174
  180. package/pass/cover_pass.d.ts +2 -2
  181. package/pass/cover_pass.js +108 -108
  182. package/pass/debugDepthState.d.ts +20 -20
  183. package/pass/debugDepthState.js +9 -9
  184. package/pass/debugDepthState.ts +22 -22
  185. package/pass/depthTestBias.d.ts +12 -12
  186. package/pass/depthTestBias.js +12 -12
  187. package/pass/depthTestBias.ts +12 -12
  188. package/pass/effectUserData.d.ts +27 -27
  189. package/pass/effectUserData.js +1 -1
  190. package/pass/effectUserData.ts +46 -46
  191. package/pass/frosted_glass_pass.d.ts +2 -2
  192. package/pass/frosted_glass_pass.js +150 -150
  193. package/pass/fsQuad.d.ts +9 -9
  194. package/pass/fsQuad.js +28 -28
  195. package/pass/glow_pass.d.ts +2 -2
  196. package/pass/glow_pass.js +350 -350
  197. package/pass/screen_bloom_pass.d.ts +11 -11
  198. package/pass/screen_bloom_pass.js +136 -136
  199. package/pass/ssao_pass.d.ts +88 -88
  200. package/pass/ssao_pass.js +799 -799
  201. package/pass/ssao_pass.ts +918 -918
  202. package/pass/stroke_pass.d.ts +2 -2
  203. package/pass/stroke_pass.js +267 -267
  204. package/shaders/FXAAShaderMaterial.d.ts +3 -3
  205. package/shaders/FXAAShaderMaterial.js +20 -20
  206. package/shaders/baseDepthVisShader.d.ts +11 -11
  207. package/shaders/baseDepthVisShader.js +36 -36
  208. package/shaders/baseDepthVisShader.ts +36 -36
  209. package/shaders/baseTextureToRenderShader.d.ts +2 -2
  210. package/shaders/baseTextureToRenderShader.js +19 -19
  211. package/shaders/copyShader.d.ts +3 -3
  212. package/shaders/copyShader.js +13 -13
  213. package/shaders/debugDepthCompareShader.d.ts +14 -14
  214. package/shaders/debugDepthCompareShader.js +49 -49
  215. package/shaders/debugDepthCompareShader.ts +50 -50
  216. package/shaders/debugDepthJudgeShader.d.ts +18 -18
  217. package/shaders/debugDepthJudgeShader.js +52 -52
  218. package/shaders/debugDepthJudgeShader.ts +54 -54
  219. package/shaders/debugExcludedShader.d.ts +13 -13
  220. package/shaders/debugExcludedShader.js +46 -46
  221. package/shaders/debugExcludedShader.ts +48 -48
  222. package/spriteTextBg.d.ts +1 -1
  223. package/spriteTextBg.js +20 -20
  224. package/spriteTextBg.ts +20 -20
  225. package/threeLoader.d.ts +35 -35
  226. package/threeLoader.js +518 -518
  227. package/threeUtils.d.ts +71 -53
  228. package/threeUtils.js +363 -329
  229. package/threeUtils.ts +35 -0
  230. package/types.d.ts +2 -2
  231. package/types.js +6 -6
package/pass/glow_pass.js CHANGED
@@ -1,79 +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, 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
- },
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
+ },
77
77
  vertexShader: `
78
78
  ${ShaderChunk.common}
79
79
  ${ShaderChunk.logdepthbuf_pars_vertex}
@@ -83,7 +83,7 @@ const depthTestShader = new ShaderMaterial({
83
83
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
84
84
  ${ShaderChunk.logdepthbuf_vertex}
85
85
  }
86
- `,
86
+ `,
87
87
  fragmentShader: `
88
88
  ${ShaderChunk.logdepthbuf_pars_fragment}
89
89
  uniform sampler2D map;
@@ -107,19 +107,19 @@ const depthTestShader = new ShaderMaterial({
107
107
  gl_FragColor = texture2D(map, vUv);
108
108
  ${ShaderChunk.logdepthbuf_fragment}
109
109
  }
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
- },
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
+ },
123
123
  vertexShader: `
124
124
  attribute vec3 position;
125
125
  attribute vec2 uv;
@@ -127,7 +127,7 @@ const gaussianBlurHShader = new RawShaderMaterial({
127
127
  void main() {
128
128
  vUv = uv;
129
129
  gl_Position = vec4(position, 1.0);
130
- }`,
130
+ }`,
131
131
  fragmentShader: `
132
132
  #ifdef GL_ES
133
133
  precision highp float;
@@ -155,19 +155,19 @@ const gaussianBlurHShader = new RawShaderMaterial({
155
155
  }
156
156
 
157
157
  gl_FragColor = color / totalWeight;
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
- },
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
+ },
171
171
  vertexShader: `
172
172
  attribute vec3 position;
173
173
  attribute vec2 uv;
@@ -175,7 +175,7 @@ const gaussianBlurVShader = new RawShaderMaterial({
175
175
  void main() {
176
176
  vUv = uv;
177
177
  gl_Position = vec4(position, 1.0);
178
- }`,
178
+ }`,
179
179
  fragmentShader: `
180
180
  #ifdef GL_ES
181
181
  precision highp float;
@@ -203,22 +203,22 @@ const gaussianBlurVShader = new RawShaderMaterial({
203
203
  }
204
204
 
205
205
  gl_FragColor = color / totalWeight;
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
- },
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
222
  vertexShader: `
223
223
  ${ShaderChunk.common}
224
224
  ${ShaderChunk.logdepthbuf_pars_vertex}
@@ -228,7 +228,7 @@ const depthMinBlurShader = new ShaderMaterial({
228
228
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
229
229
  ${ShaderChunk.logdepthbuf_vertex}
230
230
  }
231
- `,
231
+ `,
232
232
  fragmentShader: `
233
233
  ${ShaderChunk.logdepthbuf_pars_fragment}
234
234
  uniform sampler2D tDepth;
@@ -249,20 +249,20 @@ const depthMinBlurShader = new ShaderMaterial({
249
249
  gl_FragColor = vec4(minD, 0.0, 0.0, 1.0);
250
250
  ${ShaderChunk.logdepthbuf_fragment}
251
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
- },
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
+ },
266
266
  vertexShader: `
267
267
  attribute vec3 position;
268
268
  attribute vec2 uv;
@@ -270,7 +270,7 @@ const glowCompositeShader = new RawShaderMaterial({
270
270
  void main() {
271
271
  vUv = uv;
272
272
  gl_Position = vec4(position, 1.0);
273
- }`,
273
+ }`,
274
274
  fragmentShader: `
275
275
  #ifdef GL_ES
276
276
  precision highp float;
@@ -295,54 +295,54 @@ const glowCompositeShader = new RawShaderMaterial({
295
295
 
296
296
  // intensity 让颜色亮度可超 1(配合 glow_additive 加性混合呈发光感,很亮那种)
297
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
- },
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
346
  vertexShader: `
347
347
  attribute vec3 position;
348
348
  attribute vec2 uv;
@@ -350,7 +350,7 @@ const thinHighlightShader = new RawShaderMaterial({
350
350
  void main() {
351
351
  vUv = uv;
352
352
  gl_Position = vec4(position, 1.0);
353
- }`,
353
+ }`,
354
354
  fragmentShader: `
355
355
  #ifdef GL_ES
356
356
  precision highp float;
@@ -396,18 +396,18 @@ const thinHighlightShader = new RawShaderMaterial({
396
396
  // 向白色混合 0.3(保留 7 成辉光本色)+ 亮度乘 1.2:轮廓清晰可辨,又不抢辉光的色。
397
397
  vec3 hl = mix(color, vec3(1.0), 0.3) * 1.2;
398
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
- },
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
+ },
411
411
  vertexShader: `
412
412
  attribute vec3 position;
413
413
  attribute vec2 uv;
@@ -416,7 +416,7 @@ const filterSelectShader = new RawShaderMaterial({
416
416
  vUv = uv;
417
417
  gl_Position = vec4(position, 1.0);
418
418
  }
419
- `,
419
+ `,
420
420
  fragmentShader: `
421
421
  #ifdef GL_ES
422
422
  precision highp float;
@@ -437,16 +437,16 @@ const filterSelectShader = new RawShaderMaterial({
437
437
 
438
438
  gl_FragColor = glowColor;
439
439
  }
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
- },
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
+ },
450
450
  vertexShader: `
451
451
  ${ShaderChunk.common}
452
452
  ${ShaderChunk.logdepthbuf_pars_vertex}
@@ -456,7 +456,7 @@ const copyShader = new ShaderMaterial({
456
456
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
457
457
  ${ShaderChunk.logdepthbuf_vertex}
458
458
  }
459
- `,
459
+ `,
460
460
  fragmentShader: `
461
461
  ${ShaderChunk.logdepthbuf_pars_fragment}
462
462
  uniform sampler2D map;
@@ -465,143 +465,143 @@ const copyShader = new ShaderMaterial({
465
465
  gl_FragColor = texture2D(map, vUv);
466
466
  ${ShaderChunk.logdepthbuf_fragment}
467
467
  }
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
- }
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
+ }