three-base 2.0.137 → 2.0.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DirectionalLight.d.ts +6 -6
- package/DirectionalLight.js +68 -68
- package/DirectionalLight.ts +70 -0
- package/EventMap.d.ts +103 -0
- package/EventMap.js +17 -0
- package/EventMap.ts +139 -0
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/EventMesh.ts +60 -0
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +342 -366
- package/ExtrudeMesh.ts +553 -0
- package/FPScontrol.d.ts +511 -78
- package/FPScontrol.js +1799 -617
- package/FPScontrol.ts +1855 -0
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +80 -79
- package/Fire/Fire.ts +89 -0
- package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +9 -9
- package/Fire/{FireGromtry.js → FireGeometry.js} +40 -40
- package/Fire/FireGeometry.ts +40 -0
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/FireMaterial.ts +89 -0
- package/Fire/index.d.ts +2 -1
- package/Fire/index.js +2 -1
- package/Fire/index.ts +2 -0
- package/GLTFDracoLoader.d.ts +71 -0
- package/GLTFDracoLoader.js +266 -0
- package/GLTFDracoLoader.ts +430 -0
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/Grass.ts +38 -0
- package/Grass/index.d.ts +2 -1
- package/Grass/index.js +2 -1
- package/Grass/index.ts +2 -0
- package/Ground1/Ground1.d.ts +10 -11
- package/Ground1/Ground1.js +95 -91
- package/Ground1/Ground1.ts +114 -0
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/Ground1/index.ts +1 -0
- package/MeshBase.d.ts +36 -35
- package/MeshBase.js +247 -223
- package/MeshBase.ts +253 -0
- package/Mirror.d.ts +25 -25
- package/Mirror.js +143 -139
- package/Mirror.ts +203 -0
- package/MktMesh/MktMesh.d.ts +291 -0
- package/MktMesh/MktMesh.js +1045 -0
- package/MktMesh/MktMesh.ts +1075 -0
- package/MktMesh/assetUrl.d.ts +35 -0
- package/MktMesh/assetUrl.js +69 -0
- package/MktMesh/assetUrl.ts +69 -0
- package/MktMesh/mktMappingShader.d.ts +12 -0
- package/MktMesh/mktMappingShader.js +139 -0
- package/MktMesh/mktMappingShader.ts +139 -0
- package/MktMesh/mktShader.d.ts +263 -0
- package/MktMesh/mktShader.js +1248 -0
- package/MktMesh/mktShader.ts +1344 -0
- package/MktMesh/panoBitmapTexture.d.ts +25 -0
- package/MktMesh/panoBitmapTexture.js +52 -0
- package/MktMesh/panoBitmapTexture.ts +54 -0
- package/MktMesh/panoSlotBind.d.ts +29 -0
- package/MktMesh/panoSlotBind.js +106 -0
- package/MktMesh/panoSlotBind.ts +153 -0
- package/MktMesh/panoSlotRoster.d.ts +22 -0
- package/MktMesh/panoSlotRoster.js +169 -0
- package/MktMesh/panoSlotRoster.ts +168 -0
- package/MktMesh/panoTileStitcher.d.ts +119 -0
- package/MktMesh/panoTileStitcher.js +533 -0
- package/MktMesh/panoTileStitcher.ts +616 -0
- package/MktMesh/types.d.ts +75 -0
- package/MktMesh/types.js +1 -0
- package/MktMesh/types.ts +87 -0
- package/MktMesh/wallCapTessellate.d.ts +33 -0
- package/MktMesh/wallCapTessellate.js +97 -0
- package/MktMesh/wallCapTessellate.ts +68 -0
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +307 -300
- package/PipeMesh/PathGeometry.ts +343 -0
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPoint.ts +36 -0
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +209 -208
- package/PipeMesh/PathPointList.ts +227 -0
- package/PipeMesh/PathTubeGeometry.d.ts +25 -25
- package/PipeMesh/PathTubeGeometry.js +130 -130
- package/PipeMesh/PathTubeGeometry.ts +146 -0
- package/PipeMesh/PipeMesh.d.ts +25 -25
- package/PipeMesh/PipeMesh.js +63 -63
- package/PipeMesh/PipeMesh.ts +76 -0
- package/PipeMesh/index.d.ts +1 -1
- package/PipeMesh/index.js +1 -1
- package/PipeMesh/index.ts +1 -0
- package/PlaneModal1/PlaneModal1.d.ts +34 -31
- package/PlaneModal1/PlaneModal1.js +109 -105
- package/PlaneModal1/PlaneModal1.ts +138 -0
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneModal1/index.ts +1 -0
- package/PlaneText.d.ts +27 -39
- package/PlaneText.js +35 -30
- package/PlaneText.ts +55 -0
- package/PlaneWithHtml.d.ts +13 -11
- package/PlaneWithHtml.js +64 -63
- package/PlaneWithHtml.ts +70 -0
- package/PointLight/PointLight.d.ts +13 -14
- package/PointLight/PointLight.js +64 -70
- package/PointLight/PointLight.ts +67 -0
- package/PointLight/index.d.ts +1 -1
- package/PointLight/index.js +1 -1
- package/PointLight/index.ts +1 -0
- package/README.md +110 -79
- package/Sky/Sky.d.ts +9 -9
- package/Sky/Sky.js +22 -22
- package/Sky/Sky.ts +22 -0
- package/Sky/index.d.ts +1 -1
- package/Sky/index.js +1 -1
- package/Sky/index.ts +1 -0
- package/SpotLight.d.ts +6 -6
- package/SpotLight.js +72 -72
- package/SpotLight.ts +74 -0
- package/SpriteModal1/SpriteModal1.d.ts +33 -30
- package/SpriteModal1/SpriteModal1.js +116 -110
- package/SpriteModal1/SpriteModal1.ts +146 -0
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteModal1/index.ts +1 -0
- package/SpriteText.d.ts +46 -45
- package/SpriteText.js +176 -163
- package/SpriteText.ts +205 -0
- package/SpriteText2.d.ts +48 -47
- package/SpriteText2.js +223 -198
- package/SpriteText2.ts +258 -0
- package/SpriteText3.d.ts +86 -0
- package/SpriteText3.js +519 -0
- package/SpriteText3.ts +599 -0
- package/SpriteWithHtml.d.ts +9 -7
- package/SpriteWithHtml.js +44 -44
- package/SpriteWithHtml.ts +50 -0
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +58 -62
- package/Text3D/Text3D.ts +77 -0
- package/Text3D/fontController.d.ts +60 -59
- package/Text3D/fontController.js +166 -199
- package/Text3D/fontController.ts +209 -0
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/Text3D/index.ts +1 -0
- package/ThreeBase.d.ts +248 -111
- package/ThreeBase.js +1202 -656
- package/ThreeBase.ts +1314 -0
- package/ThreeMouse.d.ts +54 -40
- package/ThreeMouse.js +453 -407
- package/ThreeMouse.ts +472 -0
- package/Transition.d.ts +45 -40
- package/Transition.js +209 -210
- package/Transition.ts +242 -0
- package/Water/Water.d.ts +5 -5
- package/Water/Water.js +44 -26
- package/Water/Water.ts +45 -0
- package/Water/index.d.ts +2 -0
- package/Water/index.js +2 -0
- package/Water/index.ts +2 -0
- package/WaterFlow/FloatingDuck.d.ts +88 -0
- package/WaterFlow/FloatingDuck.js +307 -0
- package/WaterFlow/FloatingDuck.ts +445 -0
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
- package/WaterFlow/GPUFluidSimulation.js +785 -0
- package/WaterFlow/GPUFluidSimulation.ts +827 -0
- package/WaterFlow/ReservoirSystem.d.ts +106 -0
- package/WaterFlow/ReservoirSystem.js +621 -0
- package/WaterFlow/ReservoirSystem.ts +754 -0
- package/WaterFlow/SPHField.d.ts +35 -0
- package/WaterFlow/SPHField.js +204 -0
- package/WaterFlow/SPHField.ts +228 -0
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
- package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
- package/WaterFlow/ShallowWaterSurface.js +441 -0
- package/WaterFlow/ShallowWaterSurface.ts +510 -0
- package/WaterFlow/WaterFlow.d.ts +87 -0
- package/WaterFlow/WaterFlow.js +171 -0
- package/WaterFlow/WaterFlow.ts +219 -0
- package/WaterFlow/types.d.ts +161 -0
- package/WaterFlow/types.js +1 -0
- package/WaterFlow/types.ts +189 -0
- package/WaterFlow/waterFlowPass.d.ts +3 -0
- package/WaterFlow/waterFlowPass.js +20 -0
- package/WaterFlow/waterFlowPass.ts +40 -0
- package/collisionOBB.d.ts +42 -0
- package/collisionOBB.js +112 -0
- package/collisionOBB.ts +108 -0
- package/declare.d.ts +23 -165
- package/index.d.ts +1 -1
- package/index.js +1 -2
- package/index.ts +1 -0
- package/instanced/InstancedBatch.d.ts +57 -0
- package/instanced/InstancedBatch.js +348 -0
- package/instanced/InstancedBatch.ts +406 -0
- package/instanced/InstancedChild.d.ts +174 -0
- package/instanced/InstancedChild.js +264 -0
- package/instanced/InstancedChild.ts +327 -0
- package/instanced/InstancedGroup.d.ts +43 -0
- package/instanced/InstancedGroup.js +126 -0
- package/instanced/InstancedGroup.ts +137 -0
- package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +38 -39
- package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +282 -293
- package/instanced/InstancedMeshBase.ts +292 -0
- package/instanced/InstancedTemplate.d.ts +46 -0
- package/instanced/InstancedTemplate.js +125 -0
- package/instanced/InstancedTemplate.ts +188 -0
- package/keyControls.d.ts +30 -0
- package/{keyContorls.js → keyControls.js} +101 -98
- package/keyControls.ts +107 -0
- package/lensflare/LensFlare.d.ts +39 -0
- package/lensflare/LensFlare.js +373 -0
- package/lensflare/LensFlare.ts +448 -0
- package/lensflare/lensflare0.png +0 -0
- package/lensflare/lensflare3.png +0 -0
- package/lensflare/lensflare_custom.png +0 -0
- package/lensflare/lensflare_hex_ghost.png +0 -0
- package/lensflare/lensflare_hex_main.png +0 -0
- package/package.json +99 -25
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +188 -101
- package/pass/bloom_pass.ts +243 -0
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +122 -99
- package/pass/cover_pass.ts +182 -0
- package/pass/debugDepthState.d.ts +20 -0
- package/pass/debugDepthState.js +9 -0
- package/pass/debugDepthState.ts +22 -0
- package/pass/depthTestBias.d.ts +12 -0
- package/pass/depthTestBias.js +12 -0
- package/pass/depthTestBias.ts +12 -0
- package/pass/effectUserData.d.ts +27 -0
- package/pass/effectUserData.js +1 -0
- package/pass/effectUserData.ts +46 -0
- package/pass/frosted_glass_pass.d.ts +2 -2
- package/pass/frosted_glass_pass.js +167 -186
- package/pass/frosted_glass_pass.ts +288 -0
- package/pass/fsQuad.d.ts +9 -9
- package/pass/fsQuad.js +28 -28
- package/pass/fsQuad.ts +34 -0
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +449 -233
- package/pass/glow_pass.ts +654 -0
- package/pass/screen_bloom_pass.d.ts +11 -0
- package/pass/screen_bloom_pass.js +235 -0
- package/pass/screen_bloom_pass.ts +263 -0
- package/pass/ssao_pass.d.ts +88 -13
- package/pass/ssao_pass.js +802 -366
- package/pass/ssao_pass.ts +918 -0
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +329 -258
- package/pass/stroke_pass.ts +638 -0
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +23 -66
- package/shaders/FXAAShaderMaterial.ts +201 -0
- package/shaders/baseDepthVisShader.d.ts +11 -0
- package/shaders/baseDepthVisShader.js +36 -0
- package/shaders/baseDepthVisShader.ts +36 -0
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +55 -60
- package/shaders/baseTextureToRenderShader.ts +232 -0
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +13 -14
- package/shaders/copyShader.ts +32 -0
- package/shaders/debugDepthCompareShader.d.ts +14 -0
- package/shaders/debugDepthCompareShader.js +49 -0
- package/shaders/debugDepthCompareShader.ts +50 -0
- package/shaders/debugDepthJudgeShader.d.ts +18 -0
- package/shaders/debugDepthJudgeShader.js +52 -0
- package/shaders/debugDepthJudgeShader.ts +54 -0
- package/shaders/debugExcludedShader.d.ts +13 -0
- package/shaders/debugExcludedShader.js +46 -0
- package/shaders/debugExcludedShader.ts +48 -0
- package/spriteTextBg.d.ts +1 -0
- package/spriteTextBg.js +20 -0
- package/spriteTextBg.ts +20 -0
- package/threeLoader.d.ts +35 -34
- package/threeLoader.js +518 -527
- package/threeLoader.ts +525 -0
- package/threeUtils.d.ts +53 -52
- package/threeUtils.js +329 -330
- package/threeUtils.ts +373 -0
- package/types.d.ts +2 -0
- package/types.js +6 -0
- package/types.ts +8 -0
- package/ApngTexture.d.ts +0 -13
- package/ApngTexture.js +0 -61
- package/ApngTextureManage.d.ts +0 -18
- package/ApngTextureManage.js +0 -87
- package/KeyFrameAnimation.d.ts +0 -25
- package/KeyFrameAnimation.js +0 -78
- package/keyContorls.d.ts +0 -25
- package/lib/draco/draco_decoder.js +0 -34
- package/lib/draco/draco_decoder.wasm +0 -0
- package/lib/draco/draco_wasm_wrapper.js +0 -117
- package/pass/emissive_ao_pass.d.ts +0 -13
- package/pass/emissive_ao_pass.js +0 -370
- package/shaders.d.ts +0 -5
- package/shaders.js +0 -93
|
@@ -0,0 +1,288 @@
|
|
|
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, WebGLRenderer, Camera, PerspectiveCamera, Mesh, Object3D } from "three";
|
|
8
|
+
import fsQuad from "./fsQuad";
|
|
9
|
+
import { debugDepthState } from "./debugDepthState";
|
|
10
|
+
|
|
11
|
+
const maskTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
12
|
+
minFilter: LinearFilter,
|
|
13
|
+
magFilter: LinearFilter,
|
|
14
|
+
format: RGBAFormat,
|
|
15
|
+
anisotropy: 16,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const blurTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
19
|
+
minFilter: LinearFilter,
|
|
20
|
+
magFilter: LinearFilter,
|
|
21
|
+
format: RGBAFormat,
|
|
22
|
+
anisotropy: 16,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const tempBlurTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
26
|
+
minFilter: LinearFilter,
|
|
27
|
+
magFilter: LinearFilter,
|
|
28
|
+
format: RGBAFormat,
|
|
29
|
+
anisotropy: 16,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// 选中对象的遮罩渲染目标 + 配套深度纹理 + 临时场景:模块级复用,避免每帧 new/dispose 造成 GC 抖动与
|
|
33
|
+
// GPU 资源反复创建销毁(原先在函数内每帧 new 一个 WebGLRenderTarget + DepthTexture + Scene,开销大且不稳)。
|
|
34
|
+
const selectDepthTexture: DepthTexture = new DepthTexture(1024, 1024);
|
|
35
|
+
selectDepthTexture.format = DepthFormat;
|
|
36
|
+
selectDepthTexture.type = UnsignedIntType;
|
|
37
|
+
|
|
38
|
+
const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
39
|
+
minFilter: LinearFilter,
|
|
40
|
+
magFilter: LinearFilter,
|
|
41
|
+
format: RGBAFormat,
|
|
42
|
+
depthTexture: selectDepthTexture,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// 临时场景:仅用于把「毛玻璃对象」单独渲进 selectTextureTarget 做遮罩,常驻复用(不每帧 new)。
|
|
46
|
+
const tempScene: Scene = new Scene();
|
|
47
|
+
|
|
48
|
+
const size: Vector2 = new Vector2();
|
|
49
|
+
|
|
50
|
+
const horizontalBlurShader: ShaderMaterial = new ShaderMaterial({
|
|
51
|
+
uniforms: {
|
|
52
|
+
tDiffuse: { value: null },
|
|
53
|
+
h: { value: 1.0 / 512.0 },
|
|
54
|
+
},
|
|
55
|
+
vertexShader: `
|
|
56
|
+
varying vec2 vUv;
|
|
57
|
+
void main() {
|
|
58
|
+
vUv = uv;
|
|
59
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
60
|
+
}
|
|
61
|
+
`,
|
|
62
|
+
fragmentShader: `
|
|
63
|
+
uniform sampler2D tDiffuse;
|
|
64
|
+
uniform float h;
|
|
65
|
+
varying vec2 vUv;
|
|
66
|
+
void main() {
|
|
67
|
+
vec4 sum = vec4( 0.0 );
|
|
68
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;
|
|
69
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;
|
|
70
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;
|
|
71
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;
|
|
72
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
|
|
73
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;
|
|
74
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;
|
|
75
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;
|
|
76
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;
|
|
77
|
+
gl_FragColor = sum;
|
|
78
|
+
}
|
|
79
|
+
`,
|
|
80
|
+
depthTest: false,
|
|
81
|
+
depthWrite: false,
|
|
82
|
+
transparent: true,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const verticalBlurShader: ShaderMaterial = new ShaderMaterial({
|
|
86
|
+
uniforms: {
|
|
87
|
+
tDiffuse: { value: null },
|
|
88
|
+
v: { value: 1.0 / 512.0 },
|
|
89
|
+
},
|
|
90
|
+
vertexShader: `
|
|
91
|
+
varying vec2 vUv;
|
|
92
|
+
void main() {
|
|
93
|
+
vUv = uv;
|
|
94
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
95
|
+
}
|
|
96
|
+
`,
|
|
97
|
+
fragmentShader: `
|
|
98
|
+
uniform sampler2D tDiffuse;
|
|
99
|
+
uniform float v;
|
|
100
|
+
varying vec2 vUv;
|
|
101
|
+
void main() {
|
|
102
|
+
vec4 sum = vec4( 0.0 );
|
|
103
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;
|
|
104
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;
|
|
105
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;
|
|
106
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;
|
|
107
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
|
|
108
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;
|
|
109
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;
|
|
110
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;
|
|
111
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;
|
|
112
|
+
gl_FragColor = sum;
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
depthTest: false,
|
|
116
|
+
depthWrite: false,
|
|
117
|
+
transparent: true,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const depthTestShader: ShaderMaterial = new ShaderMaterial({
|
|
121
|
+
uniforms: {
|
|
122
|
+
baseDepth: { value: null },
|
|
123
|
+
selectDepth: { value: null },
|
|
124
|
+
cameraFar: { value: 1000.0 },
|
|
125
|
+
},
|
|
126
|
+
vertexShader: `
|
|
127
|
+
${ShaderChunk.common}
|
|
128
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
129
|
+
varying vec2 vUv;
|
|
130
|
+
void main() {
|
|
131
|
+
vUv = uv;
|
|
132
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
133
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
134
|
+
}
|
|
135
|
+
`,
|
|
136
|
+
fragmentShader: `
|
|
137
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
138
|
+
uniform sampler2D baseDepth;
|
|
139
|
+
uniform sampler2D selectDepth;
|
|
140
|
+
uniform float cameraFar;
|
|
141
|
+
varying vec2 vUv;
|
|
142
|
+
void main() {
|
|
143
|
+
float selectDepthValue = texture2D(selectDepth, vUv).r;
|
|
144
|
+
float baseDepthValue = texture2D(baseDepth, vUv).r;
|
|
145
|
+
// 对数深度反解为线性视图深度。
|
|
146
|
+
float zSel = pow(cameraFar + 1.0, selectDepthValue) - 1.0;
|
|
147
|
+
float zBase = pow(cameraFar + 1.0, baseDepthValue) - 1.0;
|
|
148
|
+
float bias = max(zSel, 1.0) * 0.0015;
|
|
149
|
+
// 该像素没有毛玻璃对象(selectDepth 仍是清屏值 1.0 → zSel == cameraFar)→ 不参与合成。
|
|
150
|
+
// ⚠️ 旧实现让背景像素「直接保留毛玻璃」,导致没有对象的像素同样写白 mask;
|
|
151
|
+
// 而 frostedGlassShader 是全屏 fsQuad,只要 mask.a>=0.01 就输出 blurTexture
|
|
152
|
+
// → 整个场景被糊一层(表现为"开启毛玻璃后全场景变模糊")。
|
|
153
|
+
if (zSel >= cameraFar) {
|
|
154
|
+
discard;
|
|
155
|
+
}
|
|
156
|
+
// 毛玻璃为实体:丢弃被更近场景几何遮挡的部分
|
|
157
|
+
if (zSel > zBase + bias) {
|
|
158
|
+
discard;
|
|
159
|
+
}
|
|
160
|
+
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
|
|
161
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
162
|
+
}
|
|
163
|
+
`,
|
|
164
|
+
depthTest: true,
|
|
165
|
+
depthWrite: true,
|
|
166
|
+
transparent: true,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const frostedGlassShader: ShaderMaterial = new ShaderMaterial({
|
|
170
|
+
uniforms: {
|
|
171
|
+
blurTexture: { value: null },
|
|
172
|
+
maskTexture: { value: null },
|
|
173
|
+
},
|
|
174
|
+
vertexShader: `
|
|
175
|
+
varying vec2 vUv;
|
|
176
|
+
void main() {
|
|
177
|
+
vUv = uv;
|
|
178
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
179
|
+
}
|
|
180
|
+
`,
|
|
181
|
+
fragmentShader: `
|
|
182
|
+
uniform sampler2D blurTexture;
|
|
183
|
+
uniform sampler2D maskTexture;
|
|
184
|
+
varying vec2 vUv;
|
|
185
|
+
|
|
186
|
+
void main() {
|
|
187
|
+
vec4 mask = texture2D(maskTexture, vUv);
|
|
188
|
+
|
|
189
|
+
if(mask.a < 0.01){
|
|
190
|
+
discard;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// 后处理全程在线性空间处理:blurTexture 来自 baseRenderTarget(线性格式,RawShaderMaterial
|
|
194
|
+
// 采样即为原始线性值,three 不会自动解码/编码),模糊混合后直接输出线性值写入线性目标,
|
|
195
|
+
// 由终处理 baseTextureToRenderShader 统一做唯一的 sRGB 编码。切勿在此手动 sRGBTransferOETF,
|
|
196
|
+
// 否则线性值被编码两次 sRGB,毛玻璃区域整体发白,与 screenCopy 的无损拷贝颜色空间不一致。
|
|
197
|
+
gl_FragColor = texture2D(blurTexture, vUv);
|
|
198
|
+
}
|
|
199
|
+
`,
|
|
200
|
+
depthTest: true,
|
|
201
|
+
depthWrite: true,
|
|
202
|
+
transparent: false,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
export default function frosted_glass_pass(
|
|
206
|
+
renderer: WebGLRenderer,
|
|
207
|
+
camera: Camera,
|
|
208
|
+
scene: Scene,
|
|
209
|
+
baseRenderTarget: WebGLRenderTarget,
|
|
210
|
+
baseDepthTexture: DepthTexture,
|
|
211
|
+
devicePixelRatio: number
|
|
212
|
+
): void {
|
|
213
|
+
const enabledObjects: Mesh[] = [];
|
|
214
|
+
scene.traverseVisible((obj: Object3D) => {
|
|
215
|
+
if ((obj.userData as { frosted_glass_enable?: boolean }).frosted_glass_enable && (obj as Mesh).isMesh) {
|
|
216
|
+
enabledObjects.push(obj as Mesh);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
if (enabledObjects.length === 0) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const originRenderTarget = renderer.getRenderTarget();
|
|
225
|
+
|
|
226
|
+
// 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
|
|
227
|
+
// 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
|
|
228
|
+
renderer.getSize(size);
|
|
229
|
+
size.multiplyScalar(devicePixelRatio);
|
|
230
|
+
maskTextureTarget.setSize(size.x, size.y);
|
|
231
|
+
blurTextureTarget.setSize(size.x, size.y);
|
|
232
|
+
tempBlurTextureTarget.setSize(size.x, size.y);
|
|
233
|
+
selectTextureTarget.setSize(size.x, size.y);
|
|
234
|
+
|
|
235
|
+
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
236
|
+
renderer.clear();
|
|
237
|
+
horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
|
|
238
|
+
horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
|
|
239
|
+
fsQuad.render(renderer, horizontalBlurShader);
|
|
240
|
+
|
|
241
|
+
renderer.setRenderTarget(blurTextureTarget);
|
|
242
|
+
renderer.clear();
|
|
243
|
+
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
244
|
+
verticalBlurShader.uniforms.v.value = 2.5 / size.y;
|
|
245
|
+
fsQuad.render(renderer, verticalBlurShader);
|
|
246
|
+
|
|
247
|
+
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
248
|
+
renderer.clear();
|
|
249
|
+
horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
|
|
250
|
+
horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
|
|
251
|
+
fsQuad.render(renderer, horizontalBlurShader);
|
|
252
|
+
|
|
253
|
+
renderer.setRenderTarget(blurTextureTarget);
|
|
254
|
+
renderer.clear();
|
|
255
|
+
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
256
|
+
verticalBlurShader.uniforms.v.value = 2.0 / size.y;
|
|
257
|
+
fsQuad.render(renderer, verticalBlurShader);
|
|
258
|
+
|
|
259
|
+
const parents: (Object3D | null)[] = enabledObjects.map(obj => obj.parent);
|
|
260
|
+
|
|
261
|
+
// selectTextureTarget / selectDepthTexture / tempScene 已在模块级复用,仅跟随主画面尺寸 resize,不每帧 new。
|
|
262
|
+
enabledObjects.forEach(obj => tempScene.add(obj));
|
|
263
|
+
|
|
264
|
+
renderer.setRenderTarget(selectTextureTarget);
|
|
265
|
+
renderer.clear();
|
|
266
|
+
renderer.render(tempScene, camera);
|
|
267
|
+
// 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 frosted 的遮挡判定
|
|
268
|
+
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
269
|
+
|
|
270
|
+
renderer.setRenderTarget(maskTextureTarget);
|
|
271
|
+
renderer.clear();
|
|
272
|
+
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
273
|
+
depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
|
|
274
|
+
depthTestShader.uniforms.cameraFar.value = (camera as PerspectiveCamera).far;
|
|
275
|
+
fsQuad.render(renderer, depthTestShader);
|
|
276
|
+
|
|
277
|
+
enabledObjects.forEach((obj, i: number) => {
|
|
278
|
+
if (parents[i]) {
|
|
279
|
+
parents[i]!.add(obj);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
renderer.setRenderTarget(originRenderTarget);
|
|
284
|
+
renderer.clearDepth();
|
|
285
|
+
frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
|
|
286
|
+
frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
|
|
287
|
+
fsQuad.render(renderer, frostedGlassShader);
|
|
288
|
+
}
|
package/pass/fsQuad.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { BufferGeometry, Material, Mesh, OrthographicCamera, Scene, WebGLRenderer } from "three";
|
|
2
|
-
declare class FullScreenQuad extends Scene {
|
|
3
|
-
constructor();
|
|
4
|
-
mesh: Mesh<BufferGeometry<
|
|
5
|
-
orthographicCamera: OrthographicCamera;
|
|
6
|
-
render(renderer: WebGLRenderer, material: Material): void;
|
|
7
|
-
}
|
|
8
|
-
declare const fsQuad: FullScreenQuad;
|
|
9
|
-
export default fsQuad;
|
|
1
|
+
import { BufferGeometry, Material, Mesh, NormalBufferAttributes, Object3DEventMap, OrthographicCamera, Scene, WebGLRenderer } from "three";
|
|
2
|
+
declare class FullScreenQuad extends Scene {
|
|
3
|
+
constructor();
|
|
4
|
+
mesh: Mesh<BufferGeometry<NormalBufferAttributes>, Material, Object3DEventMap>;
|
|
5
|
+
orthographicCamera: OrthographicCamera;
|
|
6
|
+
render(renderer: WebGLRenderer, material: Material): void;
|
|
7
|
+
}
|
|
8
|
+
declare const fsQuad: FullScreenQuad;
|
|
9
|
+
export default fsQuad;
|
package/pass/fsQuad.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: xiaosihan
|
|
3
|
-
* @Date: 2023-05-09 01:36:35
|
|
4
|
-
* @Last Modified by: xiaosihan
|
|
5
|
-
* @Last Modified time: 2025-01-28 04:04:33
|
|
6
|
-
*/
|
|
7
|
-
import { BufferGeometry, Float32BufferAttribute, Mesh, MeshBasicMaterial, OrthographicCamera, Scene } from "three";
|
|
8
|
-
class FullScreenQuad extends Scene {
|
|
9
|
-
constructor() {
|
|
10
|
-
super();
|
|
11
|
-
}
|
|
12
|
-
mesh = (() => {
|
|
13
|
-
const geometry = new BufferGeometry();
|
|
14
|
-
geometry.setAttribute("position", new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));
|
|
15
|
-
geometry.setAttribute("uv", new Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2));
|
|
16
|
-
const mesh = new Mesh(geometry, new MeshBasicMaterial());
|
|
17
|
-
this.add(mesh);
|
|
18
|
-
return mesh;
|
|
19
|
-
})();
|
|
20
|
-
orthographicCamera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);
|
|
21
|
-
render(renderer, material) {
|
|
22
|
-
this.mesh.material = material;
|
|
23
|
-
renderer.render(this, this.orthographicCamera);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
// 创建一个渲染工具 用于处理纹理
|
|
27
|
-
const fsQuad = new FullScreenQuad(); // 渲染辅助器
|
|
28
|
-
export default fsQuad;
|
|
1
|
+
/*
|
|
2
|
+
* @Author: xiaosihan
|
|
3
|
+
* @Date: 2023-05-09 01:36:35
|
|
4
|
+
* @Last Modified by: xiaosihan
|
|
5
|
+
* @Last Modified time: 2025-01-28 04:04:33
|
|
6
|
+
*/
|
|
7
|
+
import { BufferGeometry, Float32BufferAttribute, Mesh, MeshBasicMaterial, OrthographicCamera, Scene } from "three";
|
|
8
|
+
class FullScreenQuad extends Scene {
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
}
|
|
12
|
+
mesh = (() => {
|
|
13
|
+
const geometry = new BufferGeometry();
|
|
14
|
+
geometry.setAttribute("position", new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));
|
|
15
|
+
geometry.setAttribute("uv", new Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2));
|
|
16
|
+
const mesh = new Mesh(geometry, new MeshBasicMaterial());
|
|
17
|
+
this.add(mesh);
|
|
18
|
+
return mesh;
|
|
19
|
+
})();
|
|
20
|
+
orthographicCamera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);
|
|
21
|
+
render(renderer, material) {
|
|
22
|
+
this.mesh.material = material;
|
|
23
|
+
renderer.render(this, this.orthographicCamera);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// 创建一个渲染工具 用于处理纹理
|
|
27
|
+
const fsQuad = new FullScreenQuad(); // 渲染辅助器
|
|
28
|
+
export default fsQuad;
|
package/pass/fsQuad.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: xiaosihan
|
|
3
|
+
* @Date: 2023-05-09 01:36:35
|
|
4
|
+
* @Last Modified by: xiaosihan
|
|
5
|
+
* @Last Modified time: 2025-01-28 04:04:33
|
|
6
|
+
*/
|
|
7
|
+
import { BufferGeometry, Float32BufferAttribute, Material, Mesh, MeshBasicMaterial, NormalBufferAttributes, Object3DEventMap, OrthographicCamera, Scene, WebGLRenderer } from "three";
|
|
8
|
+
|
|
9
|
+
class FullScreenQuad extends Scene {
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
mesh: Mesh<BufferGeometry<NormalBufferAttributes>, Material, Object3DEventMap> = (() => {
|
|
15
|
+
const geometry = new BufferGeometry();
|
|
16
|
+
geometry.setAttribute("position", new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));
|
|
17
|
+
geometry.setAttribute("uv", new Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2));
|
|
18
|
+
const mesh = new Mesh(geometry, new MeshBasicMaterial());
|
|
19
|
+
this.add(mesh);
|
|
20
|
+
return mesh;
|
|
21
|
+
})();
|
|
22
|
+
|
|
23
|
+
orthographicCamera: OrthographicCamera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);
|
|
24
|
+
|
|
25
|
+
render(renderer: WebGLRenderer, material: Material): void {
|
|
26
|
+
this.mesh.material = material;
|
|
27
|
+
renderer.render(this, this.orthographicCamera);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 创建一个渲染工具 用于处理纹理
|
|
32
|
+
const fsQuad: FullScreenQuad = new FullScreenQuad(); // 渲染辅助器
|
|
33
|
+
|
|
34
|
+
export default fsQuad;
|
package/pass/glow_pass.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|
|
1
|
+
import { DepthTexture, WebGLRenderer, Camera, Object3D } from "three";
|
|
2
|
+
export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|