three-base 2.0.129 → 2.0.134
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/ApngTexture.d.ts +13 -13
- package/ApngTexture.js +61 -61
- package/ApngTextureManage.d.ts +18 -18
- package/ApngTextureManage.js +87 -87
- package/DirectionalLight.d.ts +6 -0
- package/DirectionalLight.js +68 -0
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +366 -366
- package/FPScontrol.d.ts +71 -50
- package/FPScontrol.js +505 -232
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +79 -79
- package/Fire/FireGromtry.d.ts +9 -9
- package/Fire/FireGromtry.js +40 -40
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/index.d.ts +1 -1
- package/Fire/index.js +1 -1
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/index.d.ts +1 -1
- package/Grass/index.js +1 -1
- package/Ground1/Ground1.d.ts +11 -11
- package/Ground1/Ground1.js +54 -54
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/InstancedMeshBase.d.ts +39 -39
- package/InstancedMeshBase.js +293 -293
- package/KeyFrameAnimation.d.ts +25 -25
- package/KeyFrameAnimation.js +78 -78
- package/MeshBase.d.ts +35 -35
- package/MeshBase.js +223 -223
- package/Mirror.d.ts +25 -25
- package/Mirror.js +139 -139
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +300 -300
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +208 -208
- 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 +31 -31
- package/PlaneModal1/PlaneModal1.js +105 -105
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneText.d.ts +39 -39
- package/PlaneText.js +30 -30
- package/PlaneWithHtml.d.ts +11 -11
- package/PlaneWithHtml.js +63 -68
- package/PointLight/PointLight.d.ts +14 -13
- package/PointLight/PointLight.js +70 -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 -0
- package/SpotLight.js +72 -0
- package/SpriteModal1/SpriteModal1.d.ts +30 -30
- package/SpriteModal1/SpriteModal1.js +110 -110
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteText.d.ts +45 -45
- package/SpriteText.js +163 -163
- package/SpriteText2.d.ts +47 -47
- package/SpriteText2.js +198 -198
- package/SpriteWithHtml.d.ts +7 -7
- package/SpriteWithHtml.js +44 -49
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +62 -62
- package/Text3D/fontController.d.ts +59 -59
- package/Text3D/fontController.js +199 -199
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/ThreeBase.d.ts +97 -81
- package/ThreeBase.js +613 -559
- package/ThreeMouse.d.ts +40 -40
- package/ThreeMouse.js +407 -409
- package/Transition.d.ts +40 -40
- package/Transition.js +210 -207
- package/Water/Water.d.ts +5 -0
- package/Water/Water.js +26 -0
- package/Water/waternormals.jpg +0 -0
- package/declare.d.ts +167 -0
- package/index.d.ts +1 -1
- package/index.js +2 -2
- package/keyContorls.d.ts +25 -25
- package/keyContorls.js +98 -98
- package/package.json +1 -1
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +99 -99
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +95 -95
- package/pass/frosted_glass_pass.d.ts +2 -0
- package/pass/frosted_glass_pass.js +275 -0
- 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 +310 -254
- package/pass/ssao_pass.d.ts +11 -0
- package/pass/ssao_pass.js +294 -0
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +199 -199
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +21 -21
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +14 -14
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +14 -14
- package/shaders.d.ts +5 -5
- package/shaders.js +42 -42
- package/threeLoader.d.ts +34 -34
- package/threeLoader.js +527 -527
- package/threeUtils.d.ts +52 -52
- package/threeUtils.js +330 -330
package/pass/cover_pass.js
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
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, UnsignedShortType, Vector2, WebGLRenderTarget
|
|
14
|
-
import fsQuad from "./fsQuad";
|
|
15
|
-
// 选中对象的深度纹理
|
|
16
|
-
const selectDepthTexture = (() => {
|
|
17
|
-
const baseDepthTexture = new DepthTexture(1024, 1024);
|
|
18
|
-
baseDepthTexture.format = DepthFormat;
|
|
19
|
-
baseDepthTexture.type = UnsignedShortType;
|
|
20
|
-
baseDepthTexture.anisotropy = 16;
|
|
21
|
-
return baseDepthTexture;
|
|
22
|
-
})();
|
|
23
|
-
// 选中对象的纹理
|
|
24
|
-
const selectTextureTarget = new WebGLRenderTarget(512, 512, {
|
|
25
|
-
minFilter: LinearFilter,
|
|
26
|
-
magFilter: LinearFilter,
|
|
27
|
-
format: RGBAFormat,
|
|
28
|
-
depthTexture: selectDepthTexture,
|
|
29
|
-
anisotropy: 16,
|
|
30
|
-
});
|
|
31
|
-
// 深度测试后的选中纹理
|
|
32
|
-
const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
|
|
33
|
-
minFilter: LinearFilter,
|
|
34
|
-
magFilter: LinearFilter,
|
|
35
|
-
format: RGBAFormat,
|
|
36
|
-
anisotropy: 16,
|
|
37
|
-
});
|
|
38
|
-
const blur1TextureTarget = new WebGLRenderTarget(512, 512, {
|
|
39
|
-
minFilter: LinearFilter,
|
|
40
|
-
magFilter: LinearFilter,
|
|
41
|
-
format: RGBAFormat,
|
|
42
|
-
});
|
|
43
|
-
const size = new Vector2();
|
|
44
|
-
//深度比对纹理
|
|
45
|
-
const depthTestShader = new ShaderMaterial({
|
|
46
|
-
uniforms: {
|
|
47
|
-
color: { value: new Color("#440000") },
|
|
48
|
-
opacity: { value: 1 },
|
|
49
|
-
depthTest: { value: true },
|
|
50
|
-
baseDepth: { value: null },
|
|
51
|
-
selectDepth: { value: null }, // 选中的对象深度纹理
|
|
52
|
-
},
|
|
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, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
|
|
14
|
+
import fsQuad from "./fsQuad";
|
|
15
|
+
// 选中对象的深度纹理
|
|
16
|
+
const selectDepthTexture = (() => {
|
|
17
|
+
const baseDepthTexture = new DepthTexture(1024, 1024);
|
|
18
|
+
baseDepthTexture.format = DepthFormat;
|
|
19
|
+
baseDepthTexture.type = UnsignedShortType;
|
|
20
|
+
baseDepthTexture.anisotropy = 16;
|
|
21
|
+
return baseDepthTexture;
|
|
22
|
+
})();
|
|
23
|
+
// 选中对象的纹理
|
|
24
|
+
const selectTextureTarget = new WebGLRenderTarget(512, 512, {
|
|
25
|
+
minFilter: LinearFilter,
|
|
26
|
+
magFilter: LinearFilter,
|
|
27
|
+
format: RGBAFormat,
|
|
28
|
+
depthTexture: selectDepthTexture,
|
|
29
|
+
anisotropy: 16,
|
|
30
|
+
});
|
|
31
|
+
// 深度测试后的选中纹理
|
|
32
|
+
const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
|
|
33
|
+
minFilter: LinearFilter,
|
|
34
|
+
magFilter: LinearFilter,
|
|
35
|
+
format: RGBAFormat,
|
|
36
|
+
anisotropy: 16,
|
|
37
|
+
});
|
|
38
|
+
const blur1TextureTarget = new WebGLRenderTarget(512, 512, {
|
|
39
|
+
minFilter: LinearFilter,
|
|
40
|
+
magFilter: LinearFilter,
|
|
41
|
+
format: RGBAFormat,
|
|
42
|
+
});
|
|
43
|
+
const size = new Vector2();
|
|
44
|
+
//深度比对纹理
|
|
45
|
+
const depthTestShader = new ShaderMaterial({
|
|
46
|
+
uniforms: {
|
|
47
|
+
color: { value: new Color("#440000") }, //颜色
|
|
48
|
+
opacity: { value: 1 }, // 透明度
|
|
49
|
+
depthTest: { value: true }, // 开启深度测试
|
|
50
|
+
baseDepth: { value: null }, // 整个场景的深度纹理
|
|
51
|
+
selectDepth: { value: null }, // 选中的对象深度纹理
|
|
52
|
+
},
|
|
53
53
|
vertexShader: `
|
|
54
54
|
${ShaderChunk.common}
|
|
55
55
|
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
@@ -61,7 +61,7 @@ const depthTestShader = new ShaderMaterial({
|
|
|
61
61
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
62
62
|
${ShaderChunk.logdepthbuf_vertex}
|
|
63
63
|
}
|
|
64
|
-
`,
|
|
64
|
+
`,
|
|
65
65
|
fragmentShader: `
|
|
66
66
|
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
67
67
|
uniform vec3 color;
|
|
@@ -89,45 +89,45 @@ const depthTestShader = new ShaderMaterial({
|
|
|
89
89
|
|
|
90
90
|
${ShaderChunk.logdepthbuf_fragment}
|
|
91
91
|
}
|
|
92
|
-
`,
|
|
93
|
-
depthTest: true,
|
|
94
|
-
depthWrite: true,
|
|
95
|
-
transparent: true,
|
|
96
|
-
});
|
|
97
|
-
// 场景对象
|
|
98
|
-
const scene = new Scene();
|
|
99
|
-
// 给模型覆盖一层颜色 后处理通道
|
|
100
|
-
export default function cover_pass(renderer, camera, object3d, baseDepthTexture, devicePixelRatio) {
|
|
101
|
-
const { cover_enable = false, cover_color = "#04fa12", cover_opacity = 1, cover_depth_test = true, // 颜色叠加是否开启深度测试
|
|
102
|
-
} = object3d.userData;
|
|
103
|
-
if (!cover_enable || cover_opacity === 0) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// 保存原帧缓冲区
|
|
107
|
-
const originRenderTarget = renderer.getRenderTarget();
|
|
108
|
-
// 设置选中目标的帧缓冲区
|
|
109
|
-
renderer.getSize(size);
|
|
110
|
-
size.multiplyScalar(devicePixelRatio);
|
|
111
|
-
selectTextureTarget.setSize(size.x, size.y);
|
|
112
|
-
selectDethpTestTextureTarget.setSize(size.x, size.y);
|
|
113
|
-
blur1TextureTarget.setSize(size.x, size.y);
|
|
114
|
-
renderer.setRenderTarget(selectTextureTarget);
|
|
115
|
-
scene.children = [object3d];
|
|
116
|
-
renderer.clear();
|
|
117
|
-
renderer.render(scene, camera);
|
|
118
|
-
//更具深度测试绘制叠加颜色
|
|
119
|
-
renderer.setRenderTarget(originRenderTarget);
|
|
120
|
-
renderer.clearDepth();
|
|
121
|
-
depthTestShader.uniforms.color.value.set(cover_color);
|
|
122
|
-
depthTestShader.uniforms.opacity.value = cover_opacity;
|
|
123
|
-
depthTestShader.uniforms.depthTest.value = cover_depth_test;
|
|
124
|
-
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
125
|
-
depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
|
|
126
|
-
fsQuad.render(renderer, depthTestShader);
|
|
127
|
-
// 调试代码
|
|
128
|
-
// renderer.setRenderTarget(null);
|
|
129
|
-
// renderer.clearDepth();
|
|
130
|
-
// copyShader.uniforms.map.value = blur2TextureTarget.texture;
|
|
131
|
-
// fsQuad.render(renderer, copyShader);
|
|
132
|
-
// return;
|
|
133
|
-
}
|
|
92
|
+
`,
|
|
93
|
+
depthTest: true,
|
|
94
|
+
depthWrite: true,
|
|
95
|
+
transparent: true,
|
|
96
|
+
});
|
|
97
|
+
// 场景对象
|
|
98
|
+
const scene = new Scene();
|
|
99
|
+
// 给模型覆盖一层颜色 后处理通道
|
|
100
|
+
export default function cover_pass(renderer, camera, object3d, baseDepthTexture, devicePixelRatio) {
|
|
101
|
+
const { cover_enable = false, cover_color = "#04fa12", cover_opacity = 1, cover_depth_test = true, // 颜色叠加是否开启深度测试
|
|
102
|
+
} = object3d.userData;
|
|
103
|
+
if (!cover_enable || cover_opacity === 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// 保存原帧缓冲区
|
|
107
|
+
const originRenderTarget = renderer.getRenderTarget();
|
|
108
|
+
// 设置选中目标的帧缓冲区
|
|
109
|
+
renderer.getSize(size);
|
|
110
|
+
size.multiplyScalar(devicePixelRatio);
|
|
111
|
+
selectTextureTarget.setSize(size.x, size.y);
|
|
112
|
+
selectDethpTestTextureTarget.setSize(size.x, size.y);
|
|
113
|
+
blur1TextureTarget.setSize(size.x, size.y);
|
|
114
|
+
renderer.setRenderTarget(selectTextureTarget);
|
|
115
|
+
scene.children = [object3d];
|
|
116
|
+
renderer.clear();
|
|
117
|
+
renderer.render(scene, camera);
|
|
118
|
+
//更具深度测试绘制叠加颜色
|
|
119
|
+
renderer.setRenderTarget(originRenderTarget);
|
|
120
|
+
renderer.clearDepth();
|
|
121
|
+
depthTestShader.uniforms.color.value.set(cover_color);
|
|
122
|
+
depthTestShader.uniforms.opacity.value = cover_opacity;
|
|
123
|
+
depthTestShader.uniforms.depthTest.value = cover_depth_test;
|
|
124
|
+
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
125
|
+
depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
|
|
126
|
+
fsQuad.render(renderer, depthTestShader);
|
|
127
|
+
// 调试代码
|
|
128
|
+
// renderer.setRenderTarget(null);
|
|
129
|
+
// renderer.clearDepth();
|
|
130
|
+
// copyShader.uniforms.map.value = blur2TextureTarget.texture;
|
|
131
|
+
// fsQuad.render(renderer, copyShader);
|
|
132
|
+
// return;
|
|
133
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Camera, DepthTexture, Scene, WebGLRenderTarget, WebGLRenderer } from "three";
|
|
2
|
+
export default function frosted_glass_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, baseRenderTarget: WebGLRenderTarget, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|
|
@@ -0,0 +1,275 @@
|
|
|
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, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
|
|
8
|
+
import fsQuad from "./fsQuad";
|
|
9
|
+
// 深度测试后的毛玻璃遮罩纹理
|
|
10
|
+
const maskTextureTarget = new WebGLRenderTarget(512, 512, {
|
|
11
|
+
minFilter: LinearFilter,
|
|
12
|
+
magFilter: LinearFilter,
|
|
13
|
+
format: RGBAFormat,
|
|
14
|
+
anisotropy: 16,
|
|
15
|
+
});
|
|
16
|
+
// 模糊后的纹理
|
|
17
|
+
const blurTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
18
|
+
minFilter: LinearFilter,
|
|
19
|
+
magFilter: LinearFilter,
|
|
20
|
+
format: RGBAFormat,
|
|
21
|
+
anisotropy: 16,
|
|
22
|
+
});
|
|
23
|
+
// 临时模糊纹理(用于两阶段模糊)
|
|
24
|
+
const tempBlurTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
25
|
+
minFilter: LinearFilter,
|
|
26
|
+
magFilter: LinearFilter,
|
|
27
|
+
format: RGBAFormat,
|
|
28
|
+
anisotropy: 16,
|
|
29
|
+
});
|
|
30
|
+
const size = new Vector2();
|
|
31
|
+
// 水平模糊着色器(使用 three.js 风格的高斯模糊)
|
|
32
|
+
const horizontalBlurShader = new ShaderMaterial({
|
|
33
|
+
uniforms: {
|
|
34
|
+
tDiffuse: { value: null },
|
|
35
|
+
h: { value: 1.0 / 512.0 },
|
|
36
|
+
},
|
|
37
|
+
vertexShader: `
|
|
38
|
+
varying vec2 vUv;
|
|
39
|
+
void main() {
|
|
40
|
+
vUv = uv;
|
|
41
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
42
|
+
}
|
|
43
|
+
`,
|
|
44
|
+
fragmentShader: `
|
|
45
|
+
uniform sampler2D tDiffuse;
|
|
46
|
+
uniform float h;
|
|
47
|
+
varying vec2 vUv;
|
|
48
|
+
void main() {
|
|
49
|
+
vec4 sum = vec4( 0.0 );
|
|
50
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;
|
|
51
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;
|
|
52
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;
|
|
53
|
+
sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;
|
|
54
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
|
|
55
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;
|
|
56
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;
|
|
57
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;
|
|
58
|
+
sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;
|
|
59
|
+
gl_FragColor = sum;
|
|
60
|
+
}
|
|
61
|
+
`,
|
|
62
|
+
depthTest: false,
|
|
63
|
+
depthWrite: false,
|
|
64
|
+
transparent: true,
|
|
65
|
+
});
|
|
66
|
+
// 垂直模糊着色器(使用 three.js 风格的高斯模糊)
|
|
67
|
+
const verticalBlurShader = new ShaderMaterial({
|
|
68
|
+
uniforms: {
|
|
69
|
+
tDiffuse: { value: null },
|
|
70
|
+
v: { value: 1.0 / 512.0 },
|
|
71
|
+
},
|
|
72
|
+
vertexShader: `
|
|
73
|
+
varying vec2 vUv;
|
|
74
|
+
void main() {
|
|
75
|
+
vUv = uv;
|
|
76
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
77
|
+
}
|
|
78
|
+
`,
|
|
79
|
+
fragmentShader: `
|
|
80
|
+
uniform sampler2D tDiffuse;
|
|
81
|
+
uniform float v;
|
|
82
|
+
varying vec2 vUv;
|
|
83
|
+
void main() {
|
|
84
|
+
vec4 sum = vec4( 0.0 );
|
|
85
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;
|
|
86
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;
|
|
87
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;
|
|
88
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;
|
|
89
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
|
|
90
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;
|
|
91
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;
|
|
92
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;
|
|
93
|
+
sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;
|
|
94
|
+
gl_FragColor = sum;
|
|
95
|
+
}
|
|
96
|
+
`,
|
|
97
|
+
depthTest: false,
|
|
98
|
+
depthWrite: false,
|
|
99
|
+
transparent: true,
|
|
100
|
+
});
|
|
101
|
+
// 深度测试着色器(渲染毛玻璃对象,通过深度对比生成遮罩)
|
|
102
|
+
const depthTestShader = new ShaderMaterial({
|
|
103
|
+
uniforms: {
|
|
104
|
+
baseDepth: { value: null }, // 整个场景的深度纹理
|
|
105
|
+
selectDepth: { value: null }, // 毛玻璃对象的深度纹理
|
|
106
|
+
},
|
|
107
|
+
vertexShader: `
|
|
108
|
+
${ShaderChunk.common}
|
|
109
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
110
|
+
varying vec2 vUv;
|
|
111
|
+
void main() {
|
|
112
|
+
vUv = uv;
|
|
113
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
114
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
115
|
+
}
|
|
116
|
+
`,
|
|
117
|
+
fragmentShader: `
|
|
118
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
119
|
+
uniform sampler2D baseDepth;
|
|
120
|
+
uniform sampler2D selectDepth;
|
|
121
|
+
varying vec2 vUv;
|
|
122
|
+
void main() {
|
|
123
|
+
// 毛玻璃对象深度
|
|
124
|
+
float selectDepthValue = texture2D(selectDepth, vUv).r;
|
|
125
|
+
// 场景深度
|
|
126
|
+
float baseDepthValue = texture2D(baseDepth, vUv).r;
|
|
127
|
+
|
|
128
|
+
// 背景是空的时候丢弃(没有场景物体可模糊)
|
|
129
|
+
if(baseDepthValue >= 1.0){
|
|
130
|
+
discard;
|
|
131
|
+
}
|
|
132
|
+
// 毛玻璃对象深度远于场景深度时丢弃(被场景物体遮挡的部分不显示)
|
|
133
|
+
if(selectDepthValue > baseDepthValue){
|
|
134
|
+
discard;
|
|
135
|
+
}
|
|
136
|
+
// 输出白色遮罩,alpha=1
|
|
137
|
+
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
|
|
138
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
139
|
+
}
|
|
140
|
+
`,
|
|
141
|
+
depthTest: true,
|
|
142
|
+
depthWrite: true,
|
|
143
|
+
transparent: true,
|
|
144
|
+
});
|
|
145
|
+
// 毛玻璃合成着色器(用遮罩纹理裁剪模糊区域)
|
|
146
|
+
const frostedGlassShader = new ShaderMaterial({
|
|
147
|
+
uniforms: {
|
|
148
|
+
blurTexture: { value: null }, // 高斯模糊后的全场景纹理
|
|
149
|
+
maskTexture: { value: null }, // 深度遮罩纹理
|
|
150
|
+
},
|
|
151
|
+
vertexShader: `
|
|
152
|
+
varying vec2 vUv;
|
|
153
|
+
void main() {
|
|
154
|
+
vUv = uv;
|
|
155
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
156
|
+
}
|
|
157
|
+
`,
|
|
158
|
+
fragmentShader: `
|
|
159
|
+
uniform sampler2D blurTexture;
|
|
160
|
+
uniform sampler2D maskTexture;
|
|
161
|
+
varying vec2 vUv;
|
|
162
|
+
|
|
163
|
+
void main() {
|
|
164
|
+
// 采样遮罩纹理
|
|
165
|
+
vec4 mask = texture2D(maskTexture, vUv);
|
|
166
|
+
|
|
167
|
+
// 遮罩区域为空时丢弃(非毛玻璃区域)
|
|
168
|
+
if(mask.a < 0.01){
|
|
169
|
+
discard;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// 在遮罩区域使用模糊后的纹理
|
|
173
|
+
gl_FragColor = sRGBTransferOETF(texture2D(blurTexture, vUv));
|
|
174
|
+
}
|
|
175
|
+
`,
|
|
176
|
+
depthTest: true,
|
|
177
|
+
depthWrite: true,
|
|
178
|
+
transparent: false,
|
|
179
|
+
});
|
|
180
|
+
// 毛玻璃后处理通道
|
|
181
|
+
export default function frosted_glass_pass(renderer, camera, scene, baseRenderTarget, baseDepthTexture, devicePixelRatio) {
|
|
182
|
+
// 收集所有启用了毛玻璃特效的 Mesh 对象
|
|
183
|
+
const enabledObjects = [];
|
|
184
|
+
scene.traverseVisible((obj) => {
|
|
185
|
+
if (obj.userData.frosted_glass_enable && obj.isMesh) {
|
|
186
|
+
enabledObjects.push(obj);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
if (enabledObjects.length === 0) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// 保存原帧缓冲区
|
|
193
|
+
const originRenderTarget = renderer.getRenderTarget();
|
|
194
|
+
// 按实际渲染尺寸调整所有 RenderTarget
|
|
195
|
+
renderer.getSize(size);
|
|
196
|
+
size.multiplyScalar(devicePixelRatio);
|
|
197
|
+
maskTextureTarget.setSize(size.x, size.y);
|
|
198
|
+
blurTextureTarget.setSize(size.x, size.y);
|
|
199
|
+
tempBlurTextureTarget.setSize(size.x, size.y);
|
|
200
|
+
// ========== 第一步:对全场景纹理做高斯模糊(两遍,增强模糊效果) ==========
|
|
201
|
+
// 1. 第一阶段水平模糊
|
|
202
|
+
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
203
|
+
renderer.clear();
|
|
204
|
+
horizontalBlurShader.uniforms.tDiffuse.value = baseRenderTarget.texture;
|
|
205
|
+
horizontalBlurShader.uniforms.h.value = 2.5 / size.x;
|
|
206
|
+
fsQuad.render(renderer, horizontalBlurShader);
|
|
207
|
+
// 2. 第一阶段垂直模糊
|
|
208
|
+
renderer.setRenderTarget(blurTextureTarget);
|
|
209
|
+
renderer.clear();
|
|
210
|
+
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
211
|
+
verticalBlurShader.uniforms.v.value = 2.5 / size.y;
|
|
212
|
+
fsQuad.render(renderer, verticalBlurShader);
|
|
213
|
+
// 3. 第二阶段水平模糊
|
|
214
|
+
renderer.setRenderTarget(tempBlurTextureTarget);
|
|
215
|
+
renderer.clear();
|
|
216
|
+
horizontalBlurShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
|
|
217
|
+
horizontalBlurShader.uniforms.h.value = 2.0 / size.x;
|
|
218
|
+
fsQuad.render(renderer, horizontalBlurShader);
|
|
219
|
+
// 4. 第二阶段垂直模糊
|
|
220
|
+
renderer.setRenderTarget(blurTextureTarget);
|
|
221
|
+
renderer.clear();
|
|
222
|
+
verticalBlurShader.uniforms.tDiffuse.value = tempBlurTextureTarget.texture;
|
|
223
|
+
verticalBlurShader.uniforms.v.value = 2.0 / size.y;
|
|
224
|
+
fsQuad.render(renderer, verticalBlurShader);
|
|
225
|
+
// ========== 第二步:渲染毛玻璃对象,提取深度遮罩 ==========
|
|
226
|
+
// 记录原始 parent,渲染完恢复
|
|
227
|
+
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();
|
|
239
|
+
enabledObjects.forEach(obj => tempScene.add(obj));
|
|
240
|
+
renderer.setRenderTarget(selectTextureTarget);
|
|
241
|
+
renderer.clear();
|
|
242
|
+
renderer.render(tempScene, camera);
|
|
243
|
+
// 用深度测试 shader 生成遮罩
|
|
244
|
+
renderer.setRenderTarget(maskTextureTarget);
|
|
245
|
+
renderer.clear();
|
|
246
|
+
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
247
|
+
depthTestShader.uniforms.selectDepth.value = selectTextureTarget.depthTexture;
|
|
248
|
+
fsQuad.render(renderer, depthTestShader);
|
|
249
|
+
// 恢复所有对象的 parent
|
|
250
|
+
enabledObjects.forEach((obj, i) => {
|
|
251
|
+
if (parents[i]) {
|
|
252
|
+
parents[i].add(obj);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
// 释放临时的 RenderTarget
|
|
256
|
+
selectTextureTarget.dispose();
|
|
257
|
+
// ========== 第三步:合成毛玻璃效果 ==========
|
|
258
|
+
renderer.setRenderTarget(originRenderTarget);
|
|
259
|
+
renderer.clearDepth();
|
|
260
|
+
frostedGlassShader.uniforms.blurTexture.value = blurTextureTarget.texture;
|
|
261
|
+
frostedGlassShader.uniforms.maskTexture.value = maskTextureTarget.texture;
|
|
262
|
+
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
|
+
}
|
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<import("three").NormalBufferAttributes>, Material, import("three").Object3DEventMap>;
|
|
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, OrthographicCamera, Scene, WebGLRenderer } from "three";
|
|
2
|
+
declare class FullScreenQuad extends Scene {
|
|
3
|
+
constructor();
|
|
4
|
+
mesh: Mesh<BufferGeometry<import("three").NormalBufferAttributes>, Material, import("three").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/glow_pass.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Camera, DepthTexture, Object3D, WebGLRenderer } from "three";
|
|
2
|
-
export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|
|
1
|
+
import { Camera, DepthTexture, Object3D, WebGLRenderer } from "three";
|
|
2
|
+
export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;
|