three-base 2.0.137 → 2.0.145

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 (273) hide show
  1. package/DirectionalLight.d.ts +2 -2
  2. package/DirectionalLight.js +1 -1
  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.ts +60 -0
  8. package/ExtrudeMesh.js +1 -25
  9. package/ExtrudeMesh.ts +553 -0
  10. package/FPScontrol.d.ts +448 -15
  11. package/FPScontrol.js +1448 -266
  12. package/FPScontrol.ts +1855 -0
  13. package/Fire/Fire.d.ts +4 -4
  14. package/Fire/Fire.js +8 -7
  15. package/Fire/Fire.ts +89 -0
  16. package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +2 -2
  17. package/Fire/{FireGromtry.js → FireGeometry.js} +1 -1
  18. package/Fire/FireGeometry.ts +40 -0
  19. package/Fire/FireMaterial.d.ts +3 -3
  20. package/Fire/FireMaterial.js +1 -1
  21. package/Fire/FireMaterial.ts +89 -0
  22. package/Fire/index.d.ts +1 -0
  23. package/Fire/index.js +1 -0
  24. package/Fire/index.ts +2 -0
  25. package/GLTFDracoLoader.d.ts +71 -0
  26. package/GLTFDracoLoader.js +266 -0
  27. package/GLTFDracoLoader.ts +430 -0
  28. package/Grass/Grass.d.ts +2 -2
  29. package/Grass/Grass.ts +38 -0
  30. package/Grass/index.d.ts +1 -0
  31. package/Grass/index.js +1 -0
  32. package/Grass/index.ts +2 -0
  33. package/Ground1/Ground1.d.ts +2 -3
  34. package/Ground1/Ground1.js +64 -60
  35. package/Ground1/Ground1.ts +114 -0
  36. package/Ground1/index.ts +1 -0
  37. package/MeshBase.d.ts +1 -0
  38. package/MeshBase.js +37 -13
  39. package/MeshBase.ts +253 -0
  40. package/Mirror.d.ts +3 -3
  41. package/Mirror.js +7 -3
  42. package/Mirror.ts +203 -0
  43. package/MktMesh/MktMesh.d.ts +301 -0
  44. package/MktMesh/MktMesh.js +1064 -0
  45. package/MktMesh/MktMesh.ts +1096 -0
  46. package/MktMesh/assetUrl.d.ts +59 -0
  47. package/MktMesh/assetUrl.js +154 -0
  48. package/MktMesh/assetUrl.ts +155 -0
  49. package/MktMesh/mktMappingShader.d.ts +12 -0
  50. package/MktMesh/mktMappingShader.js +139 -0
  51. package/MktMesh/mktMappingShader.ts +139 -0
  52. package/MktMesh/mktShader.d.ts +263 -0
  53. package/MktMesh/mktShader.js +1248 -0
  54. package/MktMesh/mktShader.ts +1344 -0
  55. package/MktMesh/panoBitmapTexture.d.ts +25 -0
  56. package/MktMesh/panoBitmapTexture.js +52 -0
  57. package/MktMesh/panoBitmapTexture.ts +54 -0
  58. package/MktMesh/panoSlotBind.d.ts +29 -0
  59. package/MktMesh/panoSlotBind.js +106 -0
  60. package/MktMesh/panoSlotBind.ts +153 -0
  61. package/MktMesh/panoSlotRoster.d.ts +22 -0
  62. package/MktMesh/panoSlotRoster.js +169 -0
  63. package/MktMesh/panoSlotRoster.ts +168 -0
  64. package/MktMesh/panoTileStitcher.d.ts +119 -0
  65. package/MktMesh/panoTileStitcher.js +533 -0
  66. package/MktMesh/panoTileStitcher.ts +616 -0
  67. package/MktMesh/types.d.ts +75 -0
  68. package/MktMesh/types.js +1 -0
  69. package/MktMesh/types.ts +87 -0
  70. package/MktMesh/wallCapTessellate.d.ts +33 -0
  71. package/MktMesh/wallCapTessellate.js +97 -0
  72. package/MktMesh/wallCapTessellate.ts +68 -0
  73. package/PipeMesh/PathGeometry.js +9 -2
  74. package/PipeMesh/PathGeometry.ts +343 -0
  75. package/PipeMesh/PathPoint.ts +36 -0
  76. package/PipeMesh/PathPointList.js +1 -0
  77. package/PipeMesh/PathPointList.ts +227 -0
  78. package/PipeMesh/PathTubeGeometry.ts +146 -0
  79. package/PipeMesh/PipeMesh.d.ts +1 -1
  80. package/PipeMesh/PipeMesh.js +1 -1
  81. package/PipeMesh/PipeMesh.ts +76 -0
  82. package/PipeMesh/index.ts +1 -0
  83. package/PlaneModal1/PlaneModal1.d.ts +16 -13
  84. package/PlaneModal1/PlaneModal1.js +4 -0
  85. package/PlaneModal1/PlaneModal1.ts +138 -0
  86. package/PlaneModal1/index.ts +1 -0
  87. package/PlaneText.d.ts +2 -14
  88. package/PlaneText.js +7 -2
  89. package/PlaneText.ts +55 -0
  90. package/PlaneWithHtml.d.ts +4 -2
  91. package/PlaneWithHtml.js +2 -1
  92. package/PlaneWithHtml.ts +70 -0
  93. package/PointLight/PointLight.d.ts +3 -4
  94. package/PointLight/PointLight.js +1 -7
  95. package/PointLight/PointLight.ts +67 -0
  96. package/PointLight/index.ts +1 -0
  97. package/README.md +110 -79
  98. package/Sky/Sky.ts +22 -0
  99. package/Sky/index.ts +1 -0
  100. package/SpotLight.d.ts +2 -2
  101. package/SpotLight.js +1 -1
  102. package/SpotLight.ts +74 -0
  103. package/SpriteModal1/SpriteModal1.d.ts +16 -13
  104. package/SpriteModal1/SpriteModal1.js +8 -2
  105. package/SpriteModal1/SpriteModal1.ts +146 -0
  106. package/SpriteModal1/index.ts +1 -0
  107. package/SpriteText.d.ts +14 -13
  108. package/SpriteText.js +22 -9
  109. package/SpriteText.ts +205 -0
  110. package/SpriteText2.d.ts +9 -8
  111. package/SpriteText2.js +57 -32
  112. package/SpriteText2.ts +258 -0
  113. package/SpriteText3.d.ts +86 -0
  114. package/SpriteText3.js +519 -0
  115. package/SpriteText3.ts +599 -0
  116. package/SpriteWithHtml.d.ts +4 -2
  117. package/SpriteWithHtml.ts +50 -0
  118. package/Text3D/Text3D.js +17 -21
  119. package/Text3D/Text3D.ts +77 -0
  120. package/Text3D/fontController.d.ts +10 -9
  121. package/Text3D/fontController.js +17 -50
  122. package/Text3D/fontController.ts +209 -0
  123. package/Text3D/index.ts +1 -0
  124. package/ThreeBase.d.ts +168 -31
  125. package/ThreeBase.js +663 -117
  126. package/ThreeBase.ts +1314 -0
  127. package/ThreeMouse.d.ts +20 -7
  128. package/ThreeMouse.js +78 -32
  129. package/ThreeMouse.ts +472 -0
  130. package/Transition.d.ts +12 -7
  131. package/Transition.js +26 -27
  132. package/Transition.ts +242 -0
  133. package/Water/Water.js +21 -3
  134. package/Water/Water.ts +45 -0
  135. package/Water/index.d.ts +2 -0
  136. package/Water/index.js +2 -0
  137. package/Water/index.ts +2 -0
  138. package/WaterFlow/FloatingDuck.d.ts +88 -0
  139. package/WaterFlow/FloatingDuck.js +307 -0
  140. package/WaterFlow/FloatingDuck.ts +445 -0
  141. package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
  142. package/WaterFlow/GPUFluidSimulation.js +785 -0
  143. package/WaterFlow/GPUFluidSimulation.ts +827 -0
  144. package/WaterFlow/ReservoirSystem.d.ts +106 -0
  145. package/WaterFlow/ReservoirSystem.js +621 -0
  146. package/WaterFlow/ReservoirSystem.ts +754 -0
  147. package/WaterFlow/SPHField.d.ts +35 -0
  148. package/WaterFlow/SPHField.js +204 -0
  149. package/WaterFlow/SPHField.ts +228 -0
  150. package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
  151. package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
  152. package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
  153. package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
  154. package/WaterFlow/ShallowWaterSurface.js +441 -0
  155. package/WaterFlow/ShallowWaterSurface.ts +510 -0
  156. package/WaterFlow/WaterFlow.d.ts +87 -0
  157. package/WaterFlow/WaterFlow.js +171 -0
  158. package/WaterFlow/WaterFlow.ts +219 -0
  159. package/WaterFlow/types.d.ts +161 -0
  160. package/WaterFlow/types.js +1 -0
  161. package/WaterFlow/types.ts +189 -0
  162. package/WaterFlow/waterFlowPass.d.ts +3 -0
  163. package/WaterFlow/waterFlowPass.js +20 -0
  164. package/WaterFlow/waterFlowPass.ts +40 -0
  165. package/collisionOBB.d.ts +42 -0
  166. package/collisionOBB.js +112 -0
  167. package/collisionOBB.ts +108 -0
  168. package/declare.d.ts +25 -167
  169. package/index.js +0 -1
  170. package/index.ts +1 -0
  171. package/instanced/InstancedBatch.d.ts +57 -0
  172. package/instanced/InstancedBatch.js +348 -0
  173. package/instanced/InstancedBatch.ts +406 -0
  174. package/instanced/InstancedChild.d.ts +174 -0
  175. package/instanced/InstancedChild.js +264 -0
  176. package/instanced/InstancedChild.ts +327 -0
  177. package/instanced/InstancedGroup.d.ts +43 -0
  178. package/instanced/InstancedGroup.js +126 -0
  179. package/instanced/InstancedGroup.ts +137 -0
  180. package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +6 -7
  181. package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +36 -47
  182. package/instanced/InstancedMeshBase.ts +292 -0
  183. package/instanced/InstancedTemplate.d.ts +46 -0
  184. package/instanced/InstancedTemplate.js +125 -0
  185. package/instanced/InstancedTemplate.ts +188 -0
  186. package/keyControls.d.ts +29 -0
  187. package/{keyContorls.js → keyControls.js} +10 -7
  188. package/keyControls.ts +107 -0
  189. package/lensflare/LensFlare.d.ts +39 -0
  190. package/lensflare/LensFlare.js +373 -0
  191. package/lensflare/LensFlare.ts +448 -0
  192. package/lensflare/lensflare0.png +0 -0
  193. package/lensflare/lensflare3.png +0 -0
  194. package/lensflare/lensflare_custom.png +0 -0
  195. package/lensflare/lensflare_hex_ghost.png +0 -0
  196. package/lensflare/lensflare_hex_main.png +0 -0
  197. package/package.json +104 -25
  198. package/pass/bloom_pass.d.ts +1 -1
  199. package/pass/bloom_pass.js +127 -40
  200. package/pass/bloom_pass.ts +243 -0
  201. package/pass/cover_pass.d.ts +1 -1
  202. package/pass/cover_pass.js +55 -32
  203. package/pass/cover_pass.ts +182 -0
  204. package/pass/debugDepthState.d.ts +20 -0
  205. package/pass/debugDepthState.js +9 -0
  206. package/pass/debugDepthState.ts +22 -0
  207. package/pass/depthTestBias.d.ts +12 -0
  208. package/pass/depthTestBias.js +12 -0
  209. package/pass/depthTestBias.ts +12 -0
  210. package/pass/effectUserData.d.ts +27 -0
  211. package/pass/effectUserData.js +1 -0
  212. package/pass/effectUserData.ts +46 -0
  213. package/pass/frosted_glass_pass.d.ts +1 -1
  214. package/pass/frosted_glass_pass.js +45 -64
  215. package/pass/frosted_glass_pass.ts +288 -0
  216. package/pass/fsQuad.d.ts +2 -2
  217. package/pass/fsQuad.ts +34 -0
  218. package/pass/glow_pass.d.ts +1 -1
  219. package/pass/glow_pass.js +288 -72
  220. package/pass/glow_pass.ts +654 -0
  221. package/pass/screen_bloom_pass.d.ts +11 -0
  222. package/pass/screen_bloom_pass.js +235 -0
  223. package/pass/screen_bloom_pass.ts +263 -0
  224. package/pass/ssao_pass.d.ts +78 -3
  225. package/pass/ssao_pass.js +642 -206
  226. package/pass/ssao_pass.ts +918 -0
  227. package/pass/stroke_pass.d.ts +1 -1
  228. package/pass/stroke_pass.js +187 -116
  229. package/pass/stroke_pass.ts +638 -0
  230. package/shaders/FXAAShaderMaterial.js +5 -48
  231. package/shaders/FXAAShaderMaterial.ts +201 -0
  232. package/shaders/baseDepthVisShader.d.ts +11 -0
  233. package/shaders/baseDepthVisShader.js +36 -0
  234. package/shaders/baseDepthVisShader.ts +36 -0
  235. package/shaders/baseTextureToRenderShader.js +46 -51
  236. package/shaders/baseTextureToRenderShader.ts +232 -0
  237. package/shaders/copyShader.js +2 -3
  238. package/shaders/copyShader.ts +32 -0
  239. package/shaders/debugDepthCompareShader.d.ts +14 -0
  240. package/shaders/debugDepthCompareShader.js +49 -0
  241. package/shaders/debugDepthCompareShader.ts +50 -0
  242. package/shaders/debugDepthJudgeShader.d.ts +18 -0
  243. package/shaders/debugDepthJudgeShader.js +52 -0
  244. package/shaders/debugDepthJudgeShader.ts +54 -0
  245. package/shaders/debugExcludedShader.d.ts +13 -0
  246. package/shaders/debugExcludedShader.js +46 -0
  247. package/shaders/debugExcludedShader.ts +48 -0
  248. package/spriteTextBg.d.ts +1 -0
  249. package/spriteTextBg.js +20 -0
  250. package/spriteTextBg.ts +20 -0
  251. package/threeLoader.d.ts +8 -7
  252. package/threeLoader.js +58 -67
  253. package/threeLoader.ts +525 -0
  254. package/threeUtils.d.ts +2 -1
  255. package/threeUtils.js +24 -25
  256. package/threeUtils.ts +373 -0
  257. package/types.d.ts +2 -0
  258. package/types.js +6 -0
  259. package/types.ts +8 -0
  260. package/ApngTexture.d.ts +0 -13
  261. package/ApngTexture.js +0 -61
  262. package/ApngTextureManage.d.ts +0 -18
  263. package/ApngTextureManage.js +0 -87
  264. package/KeyFrameAnimation.d.ts +0 -25
  265. package/KeyFrameAnimation.js +0 -78
  266. package/keyContorls.d.ts +0 -25
  267. package/lib/draco/draco_decoder.js +0 -34
  268. package/lib/draco/draco_decoder.wasm +0 -0
  269. package/lib/draco/draco_wasm_wrapper.js +0 -117
  270. package/pass/emissive_ao_pass.d.ts +0 -13
  271. package/pass/emissive_ao_pass.js +0 -370
  272. package/shaders.d.ts +0 -5
  273. package/shaders.js +0 -93
@@ -0,0 +1,182 @@
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2024-09-23 21:07:06
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2025-01-28 04:01:58
6
+ */
7
+ /*
8
+ * @Author: xiaosihan
9
+ * @Date: 2023-05-09 00:35:17
10
+ * @Last Modified by: xiaosihan
11
+ * @Last Modified time: 2023-05-09 02:33:28
12
+ */
13
+ import { Color, DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget, WebGLRenderer, Camera, PerspectiveCamera, Object3D } from "three";
14
+ import fsQuad from "./fsQuad";
15
+ import { EffectUserData } from "./effectUserData";
16
+ import { debugDepthState } from "./debugDepthState";
17
+
18
+ const selectDepthTexture: DepthTexture = (() => {
19
+ const baseDepthTexture = new DepthTexture(1024, 1024);
20
+ baseDepthTexture.format = DepthFormat;
21
+ baseDepthTexture.type = UnsignedIntType;
22
+ baseDepthTexture.anisotropy = 16;
23
+ return baseDepthTexture;
24
+ })();
25
+
26
+ const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
27
+ minFilter: LinearFilter,
28
+ magFilter: LinearFilter,
29
+ format: RGBAFormat,
30
+ anisotropy: 16,
31
+ // 无 MSAA:mask 颜色与下方 selectDepthTextureTarget(深度)必须同为硬边缘,
32
+ // 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,覆盖边缘锯齿。
33
+ // 边缘抗锯齿统一由终处理 FXAA 兜底。
34
+ });
35
+
36
+ // 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
37
+ const selectDepthTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
38
+ minFilter: LinearFilter,
39
+ magFilter: LinearFilter,
40
+ format: RGBAFormat,
41
+ depthTexture: selectDepthTexture,
42
+ anisotropy: 16,
43
+ });
44
+
45
+ const selectDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
46
+ minFilter: LinearFilter,
47
+ magFilter: LinearFilter,
48
+ format: RGBAFormat,
49
+ anisotropy: 16,
50
+ // 无 MSAA:深度测试 mask 无需抗锯齿,去掉以提速
51
+ });
52
+
53
+ const blur1TextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
54
+ minFilter: LinearFilter,
55
+ magFilter: LinearFilter,
56
+ format: RGBAFormat,
57
+ });
58
+
59
+ const size: Vector2 = new Vector2();
60
+
61
+ const depthTestShader: ShaderMaterial = new ShaderMaterial({
62
+ uniforms: {
63
+ color: { value: new Color("#440000") },
64
+ opacity: { value: 1 },
65
+ depthTest: { value: true },
66
+ baseDepth: { value: null },
67
+ selectDepth: { value: null },
68
+ cameraFar: { value: 1000.0 },
69
+ },
70
+ vertexShader: `
71
+ ${ShaderChunk.common}
72
+ ${ShaderChunk.logdepthbuf_pars_vertex}
73
+ varying vec2 vUv;
74
+ void main() {
75
+ vUv = uv;
76
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
77
+ ${ShaderChunk.logdepthbuf_vertex}
78
+ }
79
+ `,
80
+ fragmentShader: `
81
+ ${ShaderChunk.logdepthbuf_pars_fragment}
82
+ uniform vec3 color;
83
+ uniform float opacity;
84
+ uniform bool depthTest;
85
+ uniform sampler2D baseDepth;
86
+ uniform sampler2D selectDepth;
87
+ uniform float cameraFar;
88
+ varying vec2 vUv;
89
+ void main() {
90
+ if( depthTest ){
91
+ float coverBaseD = texture2D(baseDepth, vUv).r;
92
+ float coverSelD = texture2D(selectDepth, vUv).r;
93
+ // 对数深度反解成线性视图深度,线性空间做遮挡判定。
94
+ float zBase = pow(cameraFar + 1.0, coverBaseD) - 1.0;
95
+ float zSel = pow(cameraFar + 1.0, coverSelD) - 1.0;
96
+ float bias = max(zSel, 1.0) * 0.0015;
97
+ // 该像素没有覆盖对象(selectDepth 仍是清屏值 1.0 → zSel == cameraFar)→ 不参与合成。
98
+ // ⚠️ 旧实现让背景像素「直接保留覆盖色」,导致没有对象的像素同样输出覆盖色
99
+ // → 整个场景被覆盖色染一层(与 frosted_glass / bloom 是同一个模板 bug)。
100
+ // 语义与下方 depthTest=false 分支的「selectDepth < 1.0 才输出」保持一致。
101
+ if (zSel >= cameraFar) {
102
+ discard;
103
+ }
104
+ // 仅丢弃被更近场景几何遮挡的部分
105
+ if (zBase < zSel - bias) {
106
+ discard;
107
+ }
108
+ gl_FragColor = vec4(color, opacity);
109
+ }else{
110
+ if(texture2D(selectDepth, vUv).r < 1.0){
111
+ gl_FragColor = vec4(color, opacity);
112
+ }else{
113
+ discard;
114
+ }
115
+ }
116
+
117
+ ${ShaderChunk.logdepthbuf_fragment}
118
+ }
119
+ `,
120
+ depthTest: true,
121
+ depthWrite: true,
122
+ transparent: true,
123
+ });
124
+
125
+ const scene: Scene = new Scene();
126
+
127
+ export default function cover_pass(
128
+ renderer: WebGLRenderer,
129
+ camera: Camera,
130
+ object3d: Object3D,
131
+ baseDepthTexture: DepthTexture,
132
+ devicePixelRatio: number
133
+ ): void {
134
+ const {
135
+ cover_enable = false,
136
+ cover_color = "#04fa12",
137
+ cover_opacity = 1,
138
+ cover_depth_test = true,
139
+ } = object3d.userData as EffectUserData;
140
+
141
+ if (!cover_enable || cover_opacity === 0) {
142
+ return;
143
+ }
144
+
145
+ const originRenderTarget = renderer.getRenderTarget();
146
+
147
+ // 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
148
+ // 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
149
+ renderer.getSize(size);
150
+ size.multiplyScalar(devicePixelRatio);
151
+ selectTextureTarget.setSize(size.x, size.y);
152
+ selectDepthTextureTarget.setSize(size.x, size.y);
153
+ // 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
154
+ // 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致颜色覆盖被错误 discard
155
+ selectDepthTexture.image.width = size.x;
156
+ selectDepthTexture.image.height = size.y;
157
+ selectDepthTexture.needsUpdate = true;
158
+ selectDepthTestTextureTarget.setSize(size.x, size.y);
159
+ blur1TextureTarget.setSize(size.x, size.y);
160
+ renderer.setRenderTarget(selectTextureTarget);
161
+ scene.children = [object3d];
162
+ renderer.clear();
163
+ renderer.render(scene, camera);
164
+
165
+ // 单独渲染对象深度到无 MSAA 目标,供 depthTestShader 做遮挡判定
166
+ renderer.setRenderTarget(selectDepthTextureTarget);
167
+ scene.children = [object3d];
168
+ renderer.clear();
169
+ renderer.render(scene, camera);
170
+ // 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 cover 的遮挡判定
171
+ debugDepthState.lastSelectDepth = selectDepthTexture;
172
+
173
+ renderer.setRenderTarget(originRenderTarget);
174
+ renderer.clearDepth();
175
+ depthTestShader.uniforms.color.value.set(cover_color);
176
+ depthTestShader.uniforms.opacity.value = cover_opacity;
177
+ depthTestShader.uniforms.depthTest.value = cover_depth_test;
178
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
179
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
180
+ depthTestShader.uniforms.cameraFar.value = (camera as PerspectiveCamera).far;
181
+ fsQuad.render(renderer, depthTestShader);
182
+ }
@@ -0,0 +1,20 @@
1
+ import type { DepthTexture } from "three";
2
+ /**
3
+ * 深度调试预览模式(面板按钮与控制台 `window.__TB_DEBUG_DEPTH` 共用同一枚举):
4
+ * - "none" :正常渲染(默认)
5
+ * - "global" :全局深度图(baseDepthTexture,排除地板)
6
+ * - "ao" :AO 深度图(aoDepthTexture,含地板)
7
+ * - "compare" :R=base 深度、G=选区 select 深度(对数反解后归一化)
8
+ * - "judge" :R=base 原始深度、G=select 原始深度、B=判定结果(1=判为被遮挡应 discard)
9
+ * - "excluded":深度图灰度 + 「被排除出深度图的面」叠红(红=挡不住任何后处理)
10
+ */
11
+ export type DebugDepthMode = "none" | "global" | "ao" | "compare" | "judge" | "excluded";
12
+ /**
13
+ * 调试用全局状态:记录最近一次 glow_pass / stroke_pass 渲染的「选区自身深度图」(selectDepth)。
14
+ * 供 ThreeBase 渲染末尾的「辉光深度比对」调试视图读取(R=全局 base 深度,G=选区 select 深度),
15
+ * 让用户一眼看出到底是「全局 base 深度没写进」还是「选区自身深度没写进」。
16
+ * 由各 pass 在渲染完 selectDepth 后写入;每帧会被最后一个被处理的可见对象覆盖(调试够用)。
17
+ */
18
+ export declare const debugDepthState: {
19
+ lastSelectDepth: DepthTexture | null;
20
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 调试用全局状态:记录最近一次 glow_pass / stroke_pass 渲染的「选区自身深度图」(selectDepth)。
3
+ * 供 ThreeBase 渲染末尾的「辉光深度比对」调试视图读取(R=全局 base 深度,G=选区 select 深度),
4
+ * 让用户一眼看出到底是「全局 base 深度没写进」还是「选区自身深度没写进」。
5
+ * 由各 pass 在渲染完 selectDepth 后写入;每帧会被最后一个被处理的可见对象覆盖(调试够用)。
6
+ */
7
+ export const debugDepthState = {
8
+ lastSelectDepth: null,
9
+ };
@@ -0,0 +1,22 @@
1
+ import type { DepthTexture } from "three";
2
+
3
+ /**
4
+ * 深度调试预览模式(面板按钮与控制台 `window.__TB_DEBUG_DEPTH` 共用同一枚举):
5
+ * - "none" :正常渲染(默认)
6
+ * - "global" :全局深度图(baseDepthTexture,排除地板)
7
+ * - "ao" :AO 深度图(aoDepthTexture,含地板)
8
+ * - "compare" :R=base 深度、G=选区 select 深度(对数反解后归一化)
9
+ * - "judge" :R=base 原始深度、G=select 原始深度、B=判定结果(1=判为被遮挡应 discard)
10
+ * - "excluded":深度图灰度 + 「被排除出深度图的面」叠红(红=挡不住任何后处理)
11
+ */
12
+ export type DebugDepthMode = "none" | "global" | "ao" | "compare" | "judge" | "excluded";
13
+
14
+ /**
15
+ * 调试用全局状态:记录最近一次 glow_pass / stroke_pass 渲染的「选区自身深度图」(selectDepth)。
16
+ * 供 ThreeBase 渲染末尾的「辉光深度比对」调试视图读取(R=全局 base 深度,G=选区 select 深度),
17
+ * 让用户一眼看出到底是「全局 base 深度没写进」还是「选区自身深度没写进」。
18
+ * 由各 pass 在渲染完 selectDepth 后写入;每帧会被最后一个被处理的可见对象覆盖(调试够用)。
19
+ */
20
+ export const debugDepthState: { lastSelectDepth: DepthTexture | null } = {
21
+ lastSelectDepth: null,
22
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 深度遮挡判定容差(对数深度空间)—— 单一常量源。
3
+ *
4
+ * 语义:`baseD < selD - DEPTH_TEST_BIAS` 时判定「该像素被更近的真实几何挡住」→ discard。
5
+ * (DepthTexture 存的是对数深度,值越小越近。)
6
+ *
7
+ * ⚠️ 必须单一源:stroke_pass 的 depthTestShader 与调试用的 debugDepthJudgeShader
8
+ * 都依赖它。若两边各写一份字面量,改一边忘另一边 → 调试视图与真实判定不一致,
9
+ * 排查时会得出完全错误的结论(本次深度排查已踩过这类"两处漂移"的坑)。
10
+ * 护栏见 test/depthDebug.test.js C 组。
11
+ */
12
+ export declare const DEPTH_TEST_BIAS = 0.0006;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 深度遮挡判定容差(对数深度空间)—— 单一常量源。
3
+ *
4
+ * 语义:`baseD < selD - DEPTH_TEST_BIAS` 时判定「该像素被更近的真实几何挡住」→ discard。
5
+ * (DepthTexture 存的是对数深度,值越小越近。)
6
+ *
7
+ * ⚠️ 必须单一源:stroke_pass 的 depthTestShader 与调试用的 debugDepthJudgeShader
8
+ * 都依赖它。若两边各写一份字面量,改一边忘另一边 → 调试视图与真实判定不一致,
9
+ * 排查时会得出完全错误的结论(本次深度排查已踩过这类"两处漂移"的坑)。
10
+ * 护栏见 test/depthDebug.test.js C 组。
11
+ */
12
+ export const DEPTH_TEST_BIAS = 0.0006;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 深度遮挡判定容差(对数深度空间)—— 单一常量源。
3
+ *
4
+ * 语义:`baseD < selD - DEPTH_TEST_BIAS` 时判定「该像素被更近的真实几何挡住」→ discard。
5
+ * (DepthTexture 存的是对数深度,值越小越近。)
6
+ *
7
+ * ⚠️ 必须单一源:stroke_pass 的 depthTestShader 与调试用的 debugDepthJudgeShader
8
+ * 都依赖它。若两边各写一份字面量,改一边忘另一边 → 调试视图与真实判定不一致,
9
+ * 排查时会得出完全错误的结论(本次深度排查已踩过这类"两处漂移"的坑)。
10
+ * 护栏见 test/depthDebug.test.js C 组。
11
+ */
12
+ export const DEPTH_TEST_BIAS = 0.0006;
@@ -0,0 +1,27 @@
1
+ /** 特效与鼠标事件共用的 userData 字段 */
2
+ export interface EffectUserData {
3
+ stroke_enable?: boolean;
4
+ stroke_color?: string;
5
+ stroke_width?: number;
6
+ glow_enable?: boolean;
7
+ glow_color?: string;
8
+ glow_width?: number;
9
+ glow_opacity?: number;
10
+ glow_sigma?: number;
11
+ glow_threshold?: number;
12
+ glow_iterations?: number;
13
+ glow_intensity?: number;
14
+ glow_additive?: boolean;
15
+ glow_highlight_width?: number;
16
+ cover_enable?: boolean;
17
+ cover_color?: string;
18
+ cover_opacity?: number;
19
+ cover_depth_test?: boolean;
20
+ bloom_enable?: boolean;
21
+ bloom_threshold?: number;
22
+ bloom_strength?: number;
23
+ bloom_radius?: number;
24
+ frosted_glass_enable?: boolean;
25
+ cursor?: string;
26
+ enableEvent?: boolean;
27
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,46 @@
1
+ /*
2
+ * @Author: software-engineer(寇豆码)
3
+ * @Description: 特效相关 userData 字段的统一类型定义。
4
+ * 覆盖 stroke / glow / cover / bloom / frosted_glass 等 pass 读取的全部开关字段,
5
+ * 以及 ThreeMouse 事件开关(cursor / enableEvent),供各 pass 用 `as EffectUserData`
6
+ * 取代各自内联的 `as { ... }`,避免类型散落与漂移。
7
+ */
8
+ /** 特效与鼠标事件共用的 userData 字段 */
9
+ export interface EffectUserData {
10
+ // ── stroke(描边)──
11
+ stroke_enable?: boolean;
12
+ stroke_color?: string;
13
+ stroke_width?: number;
14
+
15
+ // ── glow(辉光)──
16
+ glow_enable?: boolean;
17
+ glow_color?: string;
18
+ glow_width?: number;
19
+ glow_opacity?: number;
20
+ glow_sigma?: number;
21
+ glow_threshold?: number;
22
+ glow_iterations?: number;
23
+ glow_intensity?: number; // 亮度倍增,可 >1 让光晕很亮(配合 glow_additive 发光叠加更明显)
24
+ glow_additive?: boolean; // true=加性混合(发光叠加到画面),false=普通半透明覆盖(默认)
25
+ glow_highlight_width?: number; // 薄高亮层粗细(像素,默认 2);始终绘制(=0 时扩张宽为 0、无可见环),无开关参数。
26
+ // 薄高亮层是 glow 的默认行为(贴物体边缘一圈更亮的细线),无需开启参数。
27
+
28
+ // ── cover(覆盖)──
29
+ cover_enable?: boolean;
30
+ cover_color?: string;
31
+ cover_opacity?: number;
32
+ cover_depth_test?: boolean;
33
+
34
+ // ── bloom(泛光)──
35
+ bloom_enable?: boolean;
36
+ bloom_threshold?: number;
37
+ bloom_strength?: number;
38
+ bloom_radius?: number;
39
+
40
+ // ── frosted glass(毛玻璃)──
41
+ frosted_glass_enable?: boolean;
42
+
43
+ // ── 鼠标事件开关(ThreeMouse)──
44
+ cursor?: string;
45
+ enableEvent?: boolean;
46
+ }
@@ -1,2 +1,2 @@
1
- import { Camera, DepthTexture, Scene, WebGLRenderTarget, WebGLRenderer } from "three";
1
+ import { DepthTexture, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
2
2
  export default function frosted_glass_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, baseRenderTarget: WebGLRenderTarget, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
@@ -4,31 +4,41 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2026-04-21 00:00:00
6
6
  */
7
- import { DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
7
+ import { DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget } from "three";
8
8
  import fsQuad from "./fsQuad";
9
- // 深度测试后的毛玻璃遮罩纹理
10
- const maskTextureTarget = new WebGLRenderTarget(512, 512, {
9
+ import { debugDepthState } from "./debugDepthState";
10
+ const maskTextureTarget = new WebGLRenderTarget(1024, 1024, {
11
11
  minFilter: LinearFilter,
12
12
  magFilter: LinearFilter,
13
13
  format: RGBAFormat,
14
14
  anisotropy: 16,
15
15
  });
16
- // 模糊后的纹理
17
16
  const blurTextureTarget = new WebGLRenderTarget(1024, 1024, {
18
17
  minFilter: LinearFilter,
19
18
  magFilter: LinearFilter,
20
19
  format: RGBAFormat,
21
20
  anisotropy: 16,
22
21
  });
23
- // 临时模糊纹理(用于两阶段模糊)
24
22
  const tempBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
25
23
  minFilter: LinearFilter,
26
24
  magFilter: LinearFilter,
27
25
  format: RGBAFormat,
28
26
  anisotropy: 16,
29
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();
30
41
  const size = new Vector2();
31
- // 水平模糊着色器(使用 three.js 风格的高斯模糊)
32
42
  const horizontalBlurShader = new ShaderMaterial({
33
43
  uniforms: {
34
44
  tDiffuse: { value: null },
@@ -63,7 +73,6 @@ const horizontalBlurShader = new ShaderMaterial({
63
73
  depthWrite: false,
64
74
  transparent: true,
65
75
  });
66
- // 垂直模糊着色器(使用 three.js 风格的高斯模糊)
67
76
  const verticalBlurShader = new ShaderMaterial({
68
77
  uniforms: {
69
78
  tDiffuse: { value: null },
@@ -98,11 +107,11 @@ const verticalBlurShader = new ShaderMaterial({
98
107
  depthWrite: false,
99
108
  transparent: true,
100
109
  });
101
- // 深度测试着色器(渲染毛玻璃对象,通过深度对比生成遮罩)
102
110
  const depthTestShader = new ShaderMaterial({
103
111
  uniforms: {
104
- baseDepth: { value: null }, // 整个场景的深度纹理
105
- selectDepth: { value: null }, // 毛玻璃对象的深度纹理
112
+ baseDepth: { value: null },
113
+ selectDepth: { value: null },
114
+ cameraFar: { value: 1000.0 },
106
115
  },
107
116
  vertexShader: `
108
117
  ${ShaderChunk.common}
@@ -118,22 +127,26 @@ const depthTestShader = new ShaderMaterial({
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
  }
@@ -142,11 +155,10 @@ const depthTestShader = new ShaderMaterial({
142
155
  depthWrite: true,
143
156
  transparent: true,
144
157
  });
145
- // 毛玻璃合成着色器(用遮罩纹理裁剪模糊区域)
146
158
  const frostedGlassShader = new ShaderMaterial({
147
159
  uniforms: {
148
- blurTexture: { value: null }, // 高斯模糊后的全场景纹理
149
- maskTexture: { value: null }, // 深度遮罩纹理
160
+ blurTexture: { value: null },
161
+ maskTexture: { value: null },
150
162
  },
151
163
  vertexShader: `
152
164
  varying vec2 vUv;
@@ -161,25 +173,24 @@ const frostedGlassShader = new ShaderMaterial({
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);
174
187
  }
175
188
  `,
176
189
  depthTest: true,
177
190
  depthWrite: true,
178
191
  transparent: false,
179
192
  });
180
- // 毛玻璃后处理通道
181
193
  export default function frosted_glass_pass(renderer, camera, scene, baseRenderTarget, baseDepthTexture, devicePixelRatio) {
182
- // 收集所有启用了毛玻璃特效的 Mesh 对象
183
194
  const enabledObjects = [];
184
195
  scene.traverseVisible((obj) => {
185
196
  if (obj.userData.frosted_glass_enable && obj.isMesh) {
@@ -189,87 +200,57 @@ export default function frosted_glass_pass(renderer, camera, scene, baseRenderTa
189
200
  if (enabledObjects.length === 0) {
190
201
  return;
191
202
  }
192
- // 保存原帧缓冲区
193
203
  const originRenderTarget = renderer.getRenderTarget();
194
- // 按实际渲染尺寸调整所有 RenderTarget
204
+ // 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
205
+ // 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
195
206
  renderer.getSize(size);
196
207
  size.multiplyScalar(devicePixelRatio);
197
208
  maskTextureTarget.setSize(size.x, size.y);
198
209
  blurTextureTarget.setSize(size.x, size.y);
199
210
  tempBlurTextureTarget.setSize(size.x, size.y);
200
- // ========== 第一步:对全场景纹理做高斯模糊(两遍,增强模糊效果) ==========
201
- // 1. 第一阶段水平模糊
211
+ selectTextureTarget.setSize(size.x, size.y);
202
212
  renderer.setRenderTarget(tempBlurTextureTarget);
203
213
  renderer.clear();
204
214
  horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
205
215
  horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
206
216
  fsQuad.render(renderer, horizontalBlurShader);
207
- // 2. 第一阶段垂直模糊
208
217
  renderer.setRenderTarget(blurTextureTarget);
209
218
  renderer.clear();
210
219
  verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
211
220
  verticalBlurShader.uniforms.v.value = 2.5 / size.y;
212
221
  fsQuad.render(renderer, verticalBlurShader);
213
- // 3. 第二阶段水平模糊
214
222
  renderer.setRenderTarget(tempBlurTextureTarget);
215
223
  renderer.clear();
216
224
  horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
217
225
  horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
218
226
  fsQuad.render(renderer, horizontalBlurShader);
219
- // 4. 第二阶段垂直模糊
220
227
  renderer.setRenderTarget(blurTextureTarget);
221
228
  renderer.clear();
222
229
  verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
223
230
  verticalBlurShader.uniforms.v.value = 2.0 / size.y;
224
231
  fsQuad.render(renderer, verticalBlurShader);
225
- // ========== 第二步:渲染毛玻璃对象,提取深度遮罩 ==========
226
- // 记录原始 parent,渲染完恢复
227
232
  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();
233
+ // selectTextureTarget / selectDepthTexture / tempScene 已在模块级复用,仅跟随主画面尺寸 resize,不每帧 new。
239
234
  enabledObjects.forEach(obj => tempScene.add(obj));
240
235
  renderer.setRenderTarget(selectTextureTarget);
241
236
  renderer.clear();
242
237
  renderer.render(tempScene, camera);
243
- // 用深度测试 shader 生成遮罩
238
+ // 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 frosted 的遮挡判定
239
+ debugDepthState.lastSelectDepth = selectDepthTexture;
244
240
  renderer.setRenderTarget(maskTextureTarget);
245
241
  renderer.clear();
246
242
  depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
247
243
  depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
244
+ depthTestShader.uniforms.cameraFar.value = camera.far;
248
245
  fsQuad.render(renderer, depthTestShader);
249
- // 恢复所有对象的 parent
250
246
  enabledObjects.forEach((obj, i) => {
251
247
  if (parents[i]) {
252
248
  parents[i].add(obj);
253
249
  }
254
250
  });
255
- // 释放临时的 RenderTarget
256
- selectTextureTarget.dispose();
257
- // ========== 第三步:合成毛玻璃效果 ==========
258
251
  renderer.setRenderTarget(originRenderTarget);
259
252
  renderer.clearDepth();
260
253
  frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
261
254
  frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
262
255
  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
256
  }