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.
- package/DirectionalLight.d.ts +6 -6
- package/DirectionalLight.js +68 -68
- package/EventMap.d.ts +103 -103
- package/EventMap.js +17 -17
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +342 -342
- package/FPScontrol.d.ts +531 -511
- package/FPScontrol.js +1866 -1799
- package/FPScontrol.ts +1922 -1855
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +80 -80
- package/Fire/FireGeometry.d.ts +9 -9
- package/Fire/FireGeometry.js +40 -40
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/index.d.ts +2 -2
- package/Fire/index.js +2 -2
- package/GLTFDracoLoader.d.ts +71 -71
- package/GLTFDracoLoader.js +266 -266
- package/GLTFDracoLoader.ts +1 -1
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/index.d.ts +2 -2
- package/Grass/index.js +2 -2
- package/Ground1/Ground1.d.ts +10 -10
- package/Ground1/Ground1.js +71 -71
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/MeshBase.d.ts +36 -36
- package/MeshBase.js +251 -247
- package/MeshBase.ts +6 -2
- package/Mirror.d.ts +25 -25
- package/Mirror.js +143 -143
- package/MktMesh/MktMesh.d.ts +301 -291
- package/MktMesh/MktMesh.js +1064 -1045
- package/MktMesh/MktMesh.ts +32 -11
- package/MktMesh/assetUrl.d.ts +59 -35
- package/MktMesh/assetUrl.js +165 -69
- package/MktMesh/assetUrl.ts +164 -69
- package/MktMesh/mktMappingShader.d.ts +12 -12
- package/MktMesh/mktMappingShader.js +138 -138
- package/MktMesh/mktMappingShader.ts +139 -139
- package/MktMesh/mktShader.d.ts +263 -263
- package/MktMesh/mktShader.js +1236 -1236
- package/MktMesh/mktShader.ts +1344 -1344
- package/MktMesh/panoBitmapTexture.d.ts +25 -25
- package/MktMesh/panoBitmapTexture.js +52 -52
- package/MktMesh/panoBitmapTexture.ts +54 -54
- package/MktMesh/panoSlotBind.d.ts +29 -29
- package/MktMesh/panoSlotBind.js +106 -106
- package/MktMesh/panoSlotBind.ts +153 -153
- package/MktMesh/panoSlotRoster.d.ts +22 -22
- package/MktMesh/panoSlotRoster.js +169 -169
- package/MktMesh/panoSlotRoster.ts +168 -168
- package/MktMesh/panoTileStitcher.d.ts +119 -119
- package/MktMesh/panoTileStitcher.js +529 -529
- package/MktMesh/panoTileStitcher.ts +616 -616
- package/MktMesh/types.d.ts +75 -75
- package/MktMesh/types.js +1 -1
- package/MktMesh/wallCapTessellate.d.ts +33 -33
- package/MktMesh/wallCapTessellate.js +97 -97
- package/MktMesh/wallCapTessellate.ts +68 -68
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +307 -307
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +209 -209
- package/PipeMesh/PathTubeGeometry.d.ts +25 -25
- package/PipeMesh/PathTubeGeometry.js +130 -130
- package/PipeMesh/PipeMesh.d.ts +25 -25
- package/PipeMesh/PipeMesh.js +63 -63
- package/PipeMesh/index.d.ts +1 -1
- package/PipeMesh/index.js +1 -1
- package/PlaneModal1/PlaneModal1.d.ts +34 -34
- package/PlaneModal1/PlaneModal1.js +109 -109
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneText.d.ts +27 -27
- package/PlaneText.js +35 -35
- package/PlaneWithHtml.d.ts +13 -13
- package/PlaneWithHtml.js +66 -64
- package/PlaneWithHtml.ts +3 -1
- package/PointLight/PointLight.d.ts +13 -13
- package/PointLight/PointLight.js +64 -64
- package/PointLight/index.d.ts +1 -1
- package/PointLight/index.js +1 -1
- package/Sky/Sky.d.ts +9 -9
- package/Sky/Sky.js +22 -22
- package/Sky/index.d.ts +1 -1
- package/Sky/index.js +1 -1
- package/SpotLight.d.ts +6 -6
- package/SpotLight.js +72 -72
- package/SpriteModal1/SpriteModal1.d.ts +33 -33
- package/SpriteModal1/SpriteModal1.js +116 -116
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteText.d.ts +46 -46
- package/SpriteText.js +176 -176
- package/SpriteText2.d.ts +48 -48
- package/SpriteText2.js +223 -223
- package/SpriteText3.d.ts +86 -86
- package/SpriteText3.js +517 -517
- package/SpriteText3.ts +599 -599
- package/SpriteWithHtml.d.ts +9 -9
- package/SpriteWithHtml.js +46 -44
- package/SpriteWithHtml.ts +3 -1
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +58 -58
- package/Text3D/fontController.d.ts +60 -60
- package/Text3D/fontController.js +166 -166
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/ThreeBase.d.ts +248 -248
- package/ThreeBase.js +1202 -1202
- package/ThreeBase.ts +1314 -1314
- package/ThreeMouse.d.ts +53 -54
- package/ThreeMouse.js +453 -453
- package/Transition.d.ts +45 -45
- package/Transition.js +209 -209
- package/Water/Water.d.ts +5 -5
- package/Water/Water.js +44 -44
- package/Water/index.d.ts +2 -2
- package/Water/index.js +2 -2
- package/WaterFlow/FloatingDuck.d.ts +88 -88
- package/WaterFlow/FloatingDuck.js +307 -307
- package/WaterFlow/FloatingDuck.ts +445 -445
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -56
- package/WaterFlow/GPUFluidSimulation.js +781 -781
- package/WaterFlow/GPUFluidSimulation.ts +827 -827
- package/WaterFlow/ReservoirSystem.d.ts +106 -106
- package/WaterFlow/ReservoirSystem.js +611 -611
- package/WaterFlow/ReservoirSystem.ts +754 -754
- package/WaterFlow/SPHField.d.ts +35 -35
- package/WaterFlow/SPHField.js +203 -203
- package/WaterFlow/SPHField.ts +228 -228
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -69
- package/WaterFlow/ScreenSpaceFluidPass.js +728 -728
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -789
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -45
- package/WaterFlow/ShallowWaterSurface.js +438 -438
- package/WaterFlow/ShallowWaterSurface.ts +510 -510
- package/WaterFlow/WaterFlow.d.ts +87 -87
- package/WaterFlow/WaterFlow.js +171 -171
- package/WaterFlow/WaterFlow.ts +219 -219
- package/WaterFlow/types.d.ts +161 -161
- package/WaterFlow/types.js +1 -1
- package/WaterFlow/types.ts +189 -189
- package/WaterFlow/waterFlowPass.d.ts +3 -3
- package/WaterFlow/waterFlowPass.js +20 -20
- package/WaterFlow/waterFlowPass.ts +40 -40
- package/collisionOBB.d.ts +42 -42
- package/collisionOBB.js +112 -112
- package/collisionOBB.ts +108 -108
- package/declare.d.ts +25 -25
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/instanced/InstancedBatch.d.ts +57 -57
- package/instanced/InstancedBatch.js +348 -348
- package/instanced/InstancedBatch.ts +406 -406
- package/instanced/InstancedChild.d.ts +174 -174
- package/instanced/InstancedChild.js +264 -264
- package/instanced/InstancedChild.ts +327 -327
- package/instanced/InstancedGroup.d.ts +43 -43
- package/instanced/InstancedGroup.js +126 -126
- package/instanced/InstancedGroup.ts +137 -137
- package/instanced/InstancedMeshBase.d.ts +38 -38
- package/instanced/InstancedMeshBase.js +282 -282
- package/instanced/InstancedTemplate.d.ts +46 -46
- package/instanced/InstancedTemplate.js +125 -125
- package/keyControls.d.ts +29 -30
- package/keyControls.js +101 -101
- package/lensflare/LensFlare.d.ts +39 -39
- package/lensflare/LensFlare.js +284 -284
- package/package.json +6 -1
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +174 -174
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +108 -108
- package/pass/debugDepthState.d.ts +20 -20
- package/pass/debugDepthState.js +9 -9
- package/pass/debugDepthState.ts +22 -22
- package/pass/depthTestBias.d.ts +12 -12
- package/pass/depthTestBias.js +12 -12
- package/pass/depthTestBias.ts +12 -12
- package/pass/effectUserData.d.ts +27 -27
- package/pass/effectUserData.js +1 -1
- package/pass/effectUserData.ts +46 -46
- package/pass/frosted_glass_pass.d.ts +2 -2
- package/pass/frosted_glass_pass.js +150 -150
- package/pass/fsQuad.d.ts +9 -9
- package/pass/fsQuad.js +28 -28
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +350 -350
- package/pass/screen_bloom_pass.d.ts +11 -11
- package/pass/screen_bloom_pass.js +136 -136
- package/pass/ssao_pass.d.ts +88 -88
- package/pass/ssao_pass.js +799 -799
- package/pass/ssao_pass.ts +918 -918
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +267 -267
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +20 -20
- package/shaders/baseDepthVisShader.d.ts +11 -11
- package/shaders/baseDepthVisShader.js +36 -36
- package/shaders/baseDepthVisShader.ts +36 -36
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +19 -19
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +13 -13
- package/shaders/debugDepthCompareShader.d.ts +14 -14
- package/shaders/debugDepthCompareShader.js +49 -49
- package/shaders/debugDepthCompareShader.ts +50 -50
- package/shaders/debugDepthJudgeShader.d.ts +18 -18
- package/shaders/debugDepthJudgeShader.js +52 -52
- package/shaders/debugDepthJudgeShader.ts +54 -54
- package/shaders/debugExcludedShader.d.ts +13 -13
- package/shaders/debugExcludedShader.js +46 -46
- package/shaders/debugExcludedShader.ts +48 -48
- package/spriteTextBg.d.ts +1 -1
- package/spriteTextBg.js +20 -20
- package/spriteTextBg.ts +20 -20
- package/threeLoader.d.ts +35 -35
- package/threeLoader.js +518 -518
- package/threeUtils.d.ts +71 -53
- package/threeUtils.js +363 -329
- package/threeUtils.ts +35 -0
- package/types.d.ts +2 -2
- package/types.js +6 -6
package/pass/debugDepthState.js
CHANGED
|
@@ -1,9 +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
|
-
};
|
|
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
|
+
};
|
package/pass/debugDepthState.ts
CHANGED
|
@@ -1,22 +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
|
-
};
|
|
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
|
+
};
|
package/pass/depthTestBias.d.ts
CHANGED
|
@@ -1,12 +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;
|
|
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;
|
package/pass/depthTestBias.js
CHANGED
|
@@ -1,12 +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;
|
|
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;
|
package/pass/depthTestBias.ts
CHANGED
|
@@ -1,12 +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;
|
|
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;
|
package/pass/effectUserData.d.ts
CHANGED
|
@@ -1,27 +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
|
-
}
|
|
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
|
+
}
|
package/pass/effectUserData.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
package/pass/effectUserData.ts
CHANGED
|
@@ -1,46 +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
|
+
* @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 { DepthTexture, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
|
|
2
|
-
export default function frosted_glass_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, baseRenderTarget: WebGLRenderTarget, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|
|
1
|
+
import { DepthTexture, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
|
|
2
|
+
export default function frosted_glass_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, baseRenderTarget: WebGLRenderTarget, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: xiaosihan
|
|
3
|
-
* @Date: 2026-04-21 00:00:00
|
|
4
|
-
* @Last Modified by: xiaosihan
|
|
5
|
-
* @Last Modified time: 2026-04-21 00:00:00
|
|
6
|
-
*/
|
|
7
|
-
import { DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget } from "three";
|
|
8
|
-
import fsQuad from "./fsQuad";
|
|
9
|
-
import { debugDepthState } from "./debugDepthState";
|
|
10
|
-
const maskTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
11
|
-
minFilter: LinearFilter,
|
|
12
|
-
magFilter: LinearFilter,
|
|
13
|
-
format: RGBAFormat,
|
|
14
|
-
anisotropy: 16,
|
|
15
|
-
});
|
|
16
|
-
const blurTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
17
|
-
minFilter: LinearFilter,
|
|
18
|
-
magFilter: LinearFilter,
|
|
19
|
-
format: RGBAFormat,
|
|
20
|
-
anisotropy: 16,
|
|
21
|
-
});
|
|
22
|
-
const tempBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
23
|
-
minFilter: LinearFilter,
|
|
24
|
-
magFilter: LinearFilter,
|
|
25
|
-
format: RGBAFormat,
|
|
26
|
-
anisotropy: 16,
|
|
27
|
-
});
|
|
28
|
-
// 选中对象的遮罩渲染目标 + 配套深度纹理 + 临时场景:模块级复用,避免每帧 new/dispose 造成 GC 抖动与
|
|
29
|
-
// GPU 资源反复创建销毁(原先在函数内每帧 new 一个 WebGLRenderTarget + DepthTexture + Scene,开销大且不稳)。
|
|
30
|
-
const selectDepthTexture = new DepthTexture(1024, 1024);
|
|
31
|
-
selectDepthTexture.format = DepthFormat;
|
|
32
|
-
selectDepthTexture.type = UnsignedIntType;
|
|
33
|
-
const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
34
|
-
minFilter: LinearFilter,
|
|
35
|
-
magFilter: LinearFilter,
|
|
36
|
-
format: RGBAFormat,
|
|
37
|
-
depthTexture: selectDepthTexture,
|
|
38
|
-
});
|
|
39
|
-
// 临时场景:仅用于把「毛玻璃对象」单独渲进 selectTextureTarget 做遮罩,常驻复用(不每帧 new)。
|
|
40
|
-
const tempScene = new Scene();
|
|
41
|
-
const size = new Vector2();
|
|
42
|
-
const horizontalBlurShader = new ShaderMaterial({
|
|
43
|
-
uniforms: {
|
|
44
|
-
tDiffuse: { value: null },
|
|
45
|
-
h: { value: 1.0 / 512.0 },
|
|
46
|
-
},
|
|
1
|
+
/*
|
|
2
|
+
* @Author: xiaosihan
|
|
3
|
+
* @Date: 2026-04-21 00:00:00
|
|
4
|
+
* @Last Modified by: xiaosihan
|
|
5
|
+
* @Last Modified time: 2026-04-21 00:00:00
|
|
6
|
+
*/
|
|
7
|
+
import { DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget } from "three";
|
|
8
|
+
import fsQuad from "./fsQuad";
|
|
9
|
+
import { debugDepthState } from "./debugDepthState";
|
|
10
|
+
const maskTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
11
|
+
minFilter: LinearFilter,
|
|
12
|
+
magFilter: LinearFilter,
|
|
13
|
+
format: RGBAFormat,
|
|
14
|
+
anisotropy: 16,
|
|
15
|
+
});
|
|
16
|
+
const blurTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
17
|
+
minFilter: LinearFilter,
|
|
18
|
+
magFilter: LinearFilter,
|
|
19
|
+
format: RGBAFormat,
|
|
20
|
+
anisotropy: 16,
|
|
21
|
+
});
|
|
22
|
+
const tempBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
23
|
+
minFilter: LinearFilter,
|
|
24
|
+
magFilter: LinearFilter,
|
|
25
|
+
format: RGBAFormat,
|
|
26
|
+
anisotropy: 16,
|
|
27
|
+
});
|
|
28
|
+
// 选中对象的遮罩渲染目标 + 配套深度纹理 + 临时场景:模块级复用,避免每帧 new/dispose 造成 GC 抖动与
|
|
29
|
+
// GPU 资源反复创建销毁(原先在函数内每帧 new 一个 WebGLRenderTarget + DepthTexture + Scene,开销大且不稳)。
|
|
30
|
+
const selectDepthTexture = new DepthTexture(1024, 1024);
|
|
31
|
+
selectDepthTexture.format = DepthFormat;
|
|
32
|
+
selectDepthTexture.type = UnsignedIntType;
|
|
33
|
+
const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
34
|
+
minFilter: LinearFilter,
|
|
35
|
+
magFilter: LinearFilter,
|
|
36
|
+
format: RGBAFormat,
|
|
37
|
+
depthTexture: selectDepthTexture,
|
|
38
|
+
});
|
|
39
|
+
// 临时场景:仅用于把「毛玻璃对象」单独渲进 selectTextureTarget 做遮罩,常驻复用(不每帧 new)。
|
|
40
|
+
const tempScene = new Scene();
|
|
41
|
+
const size = new Vector2();
|
|
42
|
+
const horizontalBlurShader = new ShaderMaterial({
|
|
43
|
+
uniforms: {
|
|
44
|
+
tDiffuse: { value: null },
|
|
45
|
+
h: { value: 1.0 / 512.0 },
|
|
46
|
+
},
|
|
47
47
|
vertexShader: `
|
|
48
48
|
varying vec2 vUv;
|
|
49
49
|
void main() {
|
|
50
50
|
vUv = uv;
|
|
51
51
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
52
52
|
}
|
|
53
|
-
`,
|
|
53
|
+
`,
|
|
54
54
|
fragmentShader: `
|
|
55
55
|
uniform sampler2D tDiffuse;
|
|
56
56
|
uniform float h;
|
|
@@ -68,23 +68,23 @@ const horizontalBlurShader = new ShaderMaterial({
|
|
|
68
68
|
sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;
|
|
69
69
|
gl_FragColor = sum;
|
|
70
70
|
}
|
|
71
|
-
`,
|
|
72
|
-
depthTest: false,
|
|
73
|
-
depthWrite: false,
|
|
74
|
-
transparent: true,
|
|
75
|
-
});
|
|
76
|
-
const verticalBlurShader = new ShaderMaterial({
|
|
77
|
-
uniforms: {
|
|
78
|
-
tDiffuse: { value: null },
|
|
79
|
-
v: { value: 1.0 / 512.0 },
|
|
80
|
-
},
|
|
71
|
+
`,
|
|
72
|
+
depthTest: false,
|
|
73
|
+
depthWrite: false,
|
|
74
|
+
transparent: true,
|
|
75
|
+
});
|
|
76
|
+
const verticalBlurShader = new ShaderMaterial({
|
|
77
|
+
uniforms: {
|
|
78
|
+
tDiffuse: { value: null },
|
|
79
|
+
v: { value: 1.0 / 512.0 },
|
|
80
|
+
},
|
|
81
81
|
vertexShader: `
|
|
82
82
|
varying vec2 vUv;
|
|
83
83
|
void main() {
|
|
84
84
|
vUv = uv;
|
|
85
85
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
86
86
|
}
|
|
87
|
-
`,
|
|
87
|
+
`,
|
|
88
88
|
fragmentShader: `
|
|
89
89
|
uniform sampler2D tDiffuse;
|
|
90
90
|
uniform float v;
|
|
@@ -102,17 +102,17 @@ const verticalBlurShader = new ShaderMaterial({
|
|
|
102
102
|
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;
|
|
103
103
|
gl_FragColor = sum;
|
|
104
104
|
}
|
|
105
|
-
`,
|
|
106
|
-
depthTest: false,
|
|
107
|
-
depthWrite: false,
|
|
108
|
-
transparent: true,
|
|
109
|
-
});
|
|
110
|
-
const depthTestShader = new ShaderMaterial({
|
|
111
|
-
uniforms: {
|
|
112
|
-
baseDepth: { value: null },
|
|
113
|
-
selectDepth: { value: null },
|
|
114
|
-
cameraFar: { value: 1000.0 },
|
|
115
|
-
},
|
|
105
|
+
`,
|
|
106
|
+
depthTest: false,
|
|
107
|
+
depthWrite: false,
|
|
108
|
+
transparent: true,
|
|
109
|
+
});
|
|
110
|
+
const depthTestShader = new ShaderMaterial({
|
|
111
|
+
uniforms: {
|
|
112
|
+
baseDepth: { value: null },
|
|
113
|
+
selectDepth: { value: null },
|
|
114
|
+
cameraFar: { value: 1000.0 },
|
|
115
|
+
},
|
|
116
116
|
vertexShader: `
|
|
117
117
|
${ShaderChunk.common}
|
|
118
118
|
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
@@ -122,7 +122,7 @@ const depthTestShader = new ShaderMaterial({
|
|
|
122
122
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
123
123
|
${ShaderChunk.logdepthbuf_vertex}
|
|
124
124
|
}
|
|
125
|
-
`,
|
|
125
|
+
`,
|
|
126
126
|
fragmentShader: `
|
|
127
127
|
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
128
128
|
uniform sampler2D baseDepth;
|
|
@@ -150,23 +150,23 @@ const depthTestShader = new ShaderMaterial({
|
|
|
150
150
|
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
|
|
151
151
|
${ShaderChunk.logdepthbuf_fragment}
|
|
152
152
|
}
|
|
153
|
-
`,
|
|
154
|
-
depthTest: true,
|
|
155
|
-
depthWrite: true,
|
|
156
|
-
transparent: true,
|
|
157
|
-
});
|
|
158
|
-
const frostedGlassShader = new ShaderMaterial({
|
|
159
|
-
uniforms: {
|
|
160
|
-
blurTexture: { value: null },
|
|
161
|
-
maskTexture: { value: null },
|
|
162
|
-
},
|
|
153
|
+
`,
|
|
154
|
+
depthTest: true,
|
|
155
|
+
depthWrite: true,
|
|
156
|
+
transparent: true,
|
|
157
|
+
});
|
|
158
|
+
const frostedGlassShader = new ShaderMaterial({
|
|
159
|
+
uniforms: {
|
|
160
|
+
blurTexture: { value: null },
|
|
161
|
+
maskTexture: { value: null },
|
|
162
|
+
},
|
|
163
163
|
vertexShader: `
|
|
164
164
|
varying vec2 vUv;
|
|
165
165
|
void main() {
|
|
166
166
|
vUv = uv;
|
|
167
167
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
168
168
|
}
|
|
169
|
-
`,
|
|
169
|
+
`,
|
|
170
170
|
fragmentShader: `
|
|
171
171
|
uniform sampler2D blurTexture;
|
|
172
172
|
uniform sampler2D maskTexture;
|
|
@@ -185,72 +185,72 @@ const frostedGlassShader = new ShaderMaterial({
|
|
|
185
185
|
// 否则线性值被编码两次 sRGB,毛玻璃区域整体发白,与 screenCopy 的无损拷贝颜色空间不一致。
|
|
186
186
|
gl_FragColor = texture2D(blurTexture, vUv);
|
|
187
187
|
}
|
|
188
|
-
`,
|
|
189
|
-
depthTest: true,
|
|
190
|
-
depthWrite: true,
|
|
191
|
-
transparent: false,
|
|
192
|
-
});
|
|
193
|
-
export default function frosted_glass_pass(renderer, camera, scene, baseRenderTarget, baseDepthTexture, devicePixelRatio) {
|
|
194
|
-
const enabledObjects = [];
|
|
195
|
-
scene.traverseVisible((obj) => {
|
|
196
|
-
if (obj.userData.frosted_glass_enable && obj.isMesh) {
|
|
197
|
-
enabledObjects.push(obj);
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
if (enabledObjects.length === 0) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
const originRenderTarget = renderer.getRenderTarget();
|
|
204
|
-
// 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
|
|
205
|
-
// 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
|
|
206
|
-
renderer.getSize(size);
|
|
207
|
-
size.multiplyScalar(devicePixelRatio);
|
|
208
|
-
maskTextureTarget.setSize(size.x, size.y);
|
|
209
|
-
blurTextureTarget.setSize(size.x, size.y);
|
|
210
|
-
tempBlurTextureTarget.setSize(size.x, size.y);
|
|
211
|
-
selectTextureTarget.setSize(size.x, size.y);
|
|
212
|
-
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
213
|
-
renderer.clear();
|
|
214
|
-
horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
|
|
215
|
-
horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
|
|
216
|
-
fsQuad.render(renderer, horizontalBlurShader);
|
|
217
|
-
renderer.setRenderTarget(blurTextureTarget);
|
|
218
|
-
renderer.clear();
|
|
219
|
-
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
220
|
-
verticalBlurShader.uniforms.v.value = 2.5 / size.y;
|
|
221
|
-
fsQuad.render(renderer, verticalBlurShader);
|
|
222
|
-
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
223
|
-
renderer.clear();
|
|
224
|
-
horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
|
|
225
|
-
horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
|
|
226
|
-
fsQuad.render(renderer, horizontalBlurShader);
|
|
227
|
-
renderer.setRenderTarget(blurTextureTarget);
|
|
228
|
-
renderer.clear();
|
|
229
|
-
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
230
|
-
verticalBlurShader.uniforms.v.value = 2.0 / size.y;
|
|
231
|
-
fsQuad.render(renderer, verticalBlurShader);
|
|
232
|
-
const parents = enabledObjects.map(obj => obj.parent);
|
|
233
|
-
// selectTextureTarget / selectDepthTexture / tempScene 已在模块级复用,仅跟随主画面尺寸 resize,不每帧 new。
|
|
234
|
-
enabledObjects.forEach(obj => tempScene.add(obj));
|
|
235
|
-
renderer.setRenderTarget(selectTextureTarget);
|
|
236
|
-
renderer.clear();
|
|
237
|
-
renderer.render(tempScene, camera);
|
|
238
|
-
// 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 frosted 的遮挡判定
|
|
239
|
-
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
240
|
-
renderer.setRenderTarget(maskTextureTarget);
|
|
241
|
-
renderer.clear();
|
|
242
|
-
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
243
|
-
depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
|
|
244
|
-
depthTestShader.uniforms.cameraFar.value = camera.far;
|
|
245
|
-
fsQuad.render(renderer, depthTestShader);
|
|
246
|
-
enabledObjects.forEach((obj, i) => {
|
|
247
|
-
if (parents[i]) {
|
|
248
|
-
parents[i].add(obj);
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
renderer.setRenderTarget(originRenderTarget);
|
|
252
|
-
renderer.clearDepth();
|
|
253
|
-
frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
|
|
254
|
-
frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
|
|
255
|
-
fsQuad.render(renderer, frostedGlassShader);
|
|
256
|
-
}
|
|
188
|
+
`,
|
|
189
|
+
depthTest: true,
|
|
190
|
+
depthWrite: true,
|
|
191
|
+
transparent: false,
|
|
192
|
+
});
|
|
193
|
+
export default function frosted_glass_pass(renderer, camera, scene, baseRenderTarget, baseDepthTexture, devicePixelRatio) {
|
|
194
|
+
const enabledObjects = [];
|
|
195
|
+
scene.traverseVisible((obj) => {
|
|
196
|
+
if (obj.userData.frosted_glass_enable && obj.isMesh) {
|
|
197
|
+
enabledObjects.push(obj);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
if (enabledObjects.length === 0) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const originRenderTarget = renderer.getRenderTarget();
|
|
204
|
+
// 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
|
|
205
|
+
// 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
|
|
206
|
+
renderer.getSize(size);
|
|
207
|
+
size.multiplyScalar(devicePixelRatio);
|
|
208
|
+
maskTextureTarget.setSize(size.x, size.y);
|
|
209
|
+
blurTextureTarget.setSize(size.x, size.y);
|
|
210
|
+
tempBlurTextureTarget.setSize(size.x, size.y);
|
|
211
|
+
selectTextureTarget.setSize(size.x, size.y);
|
|
212
|
+
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
213
|
+
renderer.clear();
|
|
214
|
+
horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
|
|
215
|
+
horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
|
|
216
|
+
fsQuad.render(renderer, horizontalBlurShader);
|
|
217
|
+
renderer.setRenderTarget(blurTextureTarget);
|
|
218
|
+
renderer.clear();
|
|
219
|
+
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
220
|
+
verticalBlurShader.uniforms.v.value = 2.5 / size.y;
|
|
221
|
+
fsQuad.render(renderer, verticalBlurShader);
|
|
222
|
+
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
223
|
+
renderer.clear();
|
|
224
|
+
horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
|
|
225
|
+
horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
|
|
226
|
+
fsQuad.render(renderer, horizontalBlurShader);
|
|
227
|
+
renderer.setRenderTarget(blurTextureTarget);
|
|
228
|
+
renderer.clear();
|
|
229
|
+
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
230
|
+
verticalBlurShader.uniforms.v.value = 2.0 / size.y;
|
|
231
|
+
fsQuad.render(renderer, verticalBlurShader);
|
|
232
|
+
const parents = enabledObjects.map(obj => obj.parent);
|
|
233
|
+
// selectTextureTarget / selectDepthTexture / tempScene 已在模块级复用,仅跟随主画面尺寸 resize,不每帧 new。
|
|
234
|
+
enabledObjects.forEach(obj => tempScene.add(obj));
|
|
235
|
+
renderer.setRenderTarget(selectTextureTarget);
|
|
236
|
+
renderer.clear();
|
|
237
|
+
renderer.render(tempScene, camera);
|
|
238
|
+
// 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 frosted 的遮挡判定
|
|
239
|
+
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
240
|
+
renderer.setRenderTarget(maskTextureTarget);
|
|
241
|
+
renderer.clear();
|
|
242
|
+
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
243
|
+
depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
|
|
244
|
+
depthTestShader.uniforms.cameraFar.value = camera.far;
|
|
245
|
+
fsQuad.render(renderer, depthTestShader);
|
|
246
|
+
enabledObjects.forEach((obj, i) => {
|
|
247
|
+
if (parents[i]) {
|
|
248
|
+
parents[i].add(obj);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
renderer.setRenderTarget(originRenderTarget);
|
|
252
|
+
renderer.clearDepth();
|
|
253
|
+
frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
|
|
254
|
+
frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
|
|
255
|
+
fsQuad.render(renderer, frostedGlassShader);
|
|
256
|
+
}
|