three-base 2.0.168 → 2.0.172
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/FPScontrol.d.ts +41 -7
- package/FPScontrol.js +232 -155
- package/FPScontrol.ts +129 -55
- package/Ground1/Ground1.js +6 -6
- package/Ground1/Ground1.ts +6 -6
- package/MktMesh/MktMesh.d.ts +5 -1
- package/MktMesh/MktMesh.js +20 -7
- package/MktMesh/MktMesh.ts +20 -7
- package/MktMesh/panoSlotBind.js +18 -2
- package/MktMesh/panoSlotBind.ts +18 -1
- package/MktMesh/panoTileStitcher.d.ts +35 -7
- package/MktMesh/panoTileStitcher.js +71 -11
- package/MktMesh/panoTileStitcher.ts +73 -12
- package/MktMesh/types.d.ts +5 -1
- package/MktMesh/types.ts +5 -1
- package/ThreeBase.d.ts +2 -11
- package/ThreeBase.js +14 -26
- package/ThreeBase.ts +14 -26
- package/WaterFlow/WaterFlow.d.ts +1 -1
- package/WaterFlow/WaterFlow.js +1 -1
- package/WaterFlow/WaterFlow.ts +1 -1
- package/package.json +1 -1
- package/pass/bloom_pass.js +7 -14
- package/pass/bloom_pass.ts +7 -16
- package/pass/cover_pass.js +7 -15
- package/pass/cover_pass.ts +7 -17
- package/pass/debugDepthState.d.ts +2 -2
- package/pass/debugDepthState.ts +2 -2
- package/pass/glow_pass.js +8 -16
- package/pass/glow_pass.ts +8 -18
- package/pass/ssao_pass.d.ts +13 -44
- package/pass/ssao_pass.js +60 -78
- package/pass/ssao_pass.ts +74 -88
- package/pass/stroke_pass.js +10 -16
- package/pass/stroke_pass.ts +10 -18
- package/shaders/baseDepthVisShader.d.ts +1 -1
- package/shaders/baseDepthVisShader.js +1 -1
- package/shaders/baseDepthVisShader.ts +1 -1
- package/shaders/debugDepthCompareShader.d.ts +1 -1
- package/shaders/debugDepthCompareShader.js +1 -1
- package/shaders/debugDepthCompareShader.ts +1 -1
- package/shaders/debugExcludedShader.d.ts +6 -4
- package/shaders/debugExcludedShader.js +6 -4
- package/shaders/debugExcludedShader.ts +6 -4
package/WaterFlow/WaterFlow.js
CHANGED
|
@@ -25,7 +25,7 @@ import { ScreenSpaceFluidPass } from './ScreenSpaceFluidPass';
|
|
|
25
25
|
* depthMode: 'logarithmic',
|
|
26
26
|
* });
|
|
27
27
|
* // 每帧:先 renderer.setRenderTarget(baseRenderTarget); renderer.render(scene, camera);
|
|
28
|
-
* // 再
|
|
28
|
+
* // 再 renderVisibleDepthPass(renderer, camera, scene, depthRenderTarget); // 写 baseDepthTexture
|
|
29
29
|
* // 然后 water.update(dt, elapsed);
|
|
30
30
|
* // 最后 setRenderTarget(screenRT); fsQuad.render(renderer, pass.material);
|
|
31
31
|
* // 注意:WaterFlow 的 composite 是纯消费 base 纹理的 fsQuad,可直接放进你的链。
|
package/WaterFlow/WaterFlow.ts
CHANGED
|
@@ -36,7 +36,7 @@ import type {
|
|
|
36
36
|
* depthMode: 'logarithmic',
|
|
37
37
|
* });
|
|
38
38
|
* // 每帧:先 renderer.setRenderTarget(baseRenderTarget); renderer.render(scene, camera);
|
|
39
|
-
* // 再
|
|
39
|
+
* // 再 renderVisibleDepthPass(renderer, camera, scene, depthRenderTarget); // 写 baseDepthTexture
|
|
40
40
|
* // 然后 water.update(dt, elapsed);
|
|
41
41
|
* // 最后 setRenderTarget(screenRT); fsQuad.render(renderer, pass.material);
|
|
42
42
|
* // 注意:WaterFlow 的 composite 是纯消费 base 纹理的 fsQuad,可直接放进你的链。
|
package/package.json
CHANGED
package/pass/bloom_pass.js
CHANGED
|
@@ -15,23 +15,18 @@ const selectDepthTexture = (() => {
|
|
|
15
15
|
baseDepthTexture.anisotropy = 16;
|
|
16
16
|
return baseDepthTexture;
|
|
17
17
|
})();
|
|
18
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染」:selectDepthTexture 挂在本目标上当 depth attachment,
|
|
19
|
+
// mask 那一趟光栅化顺带写出本体深度 ⇒ 原来为同一对象再渲一趟「只出深度」整条删除。
|
|
18
20
|
const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
19
21
|
minFilter: LinearFilter,
|
|
20
22
|
magFilter: LinearFilter,
|
|
21
23
|
format: RGBAFormat,
|
|
24
|
+
depthTexture: selectDepthTexture,
|
|
22
25
|
anisotropy: 16,
|
|
23
|
-
// 无 MSAA:mask
|
|
26
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
24
27
|
// 否则 mask 边缘平滑而深度硬 → depthTest 判定边界与 mask 视觉边缘错位,bloom 边缘锯齿/摩尔纹。
|
|
25
28
|
// 边缘抗锯齿统一由终处理 FXAA 兜底。
|
|
26
29
|
});
|
|
27
|
-
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
28
|
-
const selectDepthTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
29
|
-
minFilter: LinearFilter,
|
|
30
|
-
magFilter: LinearFilter,
|
|
31
|
-
format: RGBAFormat,
|
|
32
|
-
depthTexture: selectDepthTexture,
|
|
33
|
-
anisotropy: 16,
|
|
34
|
-
});
|
|
35
30
|
const selectDepthTestTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
36
31
|
minFilter: LinearFilter,
|
|
37
32
|
magFilter: LinearFilter,
|
|
@@ -117,7 +112,6 @@ export default function bloom_pass(renderer, camera, object3d, baseRenderTarget,
|
|
|
117
112
|
size.multiplyScalar(devicePixelRatio);
|
|
118
113
|
bloomPass.setSize(size.x, size.y);
|
|
119
114
|
selectTextureTarget.setSize(size.x, size.y);
|
|
120
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
121
115
|
// 缺陷②修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
122
116
|
// 需手动把 selectDepthTexture 的尺寸与全屏 baseDepth 对齐,否则深度比例错位导致 bloom 被全部 discard
|
|
123
117
|
selectDepthTexture.image.width = size.x;
|
|
@@ -168,13 +162,12 @@ export default function bloom_pass(renderer, camera, object3d, baseRenderTarget,
|
|
|
168
162
|
}
|
|
169
163
|
});
|
|
170
164
|
try {
|
|
165
|
+
// ⭐ mask 这一趟顺带把本体深度写进 selectDepthTexture(挂在 selectTextureTarget 的 depth
|
|
166
|
+
// attachment 上);原先紧随其后的「只渲深度」第二趟(同材质/同相机/同几何 ⇒ 深度逐位相同)
|
|
167
|
+
// 已在 2026-10-11 皇上旨简化时删除。与材质/父节点还原同生命周期。
|
|
171
168
|
renderer.setRenderTarget(selectTextureTarget);
|
|
172
169
|
renderer.clear();
|
|
173
170
|
renderer.render(scene, camera);
|
|
174
|
-
// 单独渲染对象深度到无 MSAA 目标,供 depthTestShader 做遮挡判定(与材质/父节点还原同生命周期)
|
|
175
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
176
|
-
renderer.clear();
|
|
177
|
-
renderer.render(scene, camera);
|
|
178
171
|
}
|
|
179
172
|
finally {
|
|
180
173
|
// 还原材质 emissive
|
package/pass/bloom_pass.ts
CHANGED
|
@@ -18,25 +18,19 @@ const selectDepthTexture: DepthTexture = (() => {
|
|
|
18
18
|
return baseDepthTexture;
|
|
19
19
|
})();
|
|
20
20
|
|
|
21
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染」:selectDepthTexture 挂在本目标上当 depth attachment,
|
|
22
|
+
// mask 那一趟光栅化顺带写出本体深度 ⇒ 原来为同一对象再渲一趟「只出深度」整条删除。
|
|
21
23
|
const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
22
24
|
minFilter: LinearFilter,
|
|
23
25
|
magFilter: LinearFilter,
|
|
24
26
|
format: RGBAFormat,
|
|
27
|
+
depthTexture: selectDepthTexture,
|
|
25
28
|
anisotropy: 16,
|
|
26
|
-
// 无 MSAA:mask
|
|
29
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
27
30
|
// 否则 mask 边缘平滑而深度硬 → depthTest 判定边界与 mask 视觉边缘错位,bloom 边缘锯齿/摩尔纹。
|
|
28
31
|
// 边缘抗锯齿统一由终处理 FXAA 兜底。
|
|
29
32
|
});
|
|
30
33
|
|
|
31
|
-
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
32
|
-
const selectDepthTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
33
|
-
minFilter: LinearFilter,
|
|
34
|
-
magFilter: LinearFilter,
|
|
35
|
-
format: RGBAFormat,
|
|
36
|
-
depthTexture: selectDepthTexture,
|
|
37
|
-
anisotropy: 16,
|
|
38
|
-
});
|
|
39
|
-
|
|
40
34
|
const selectDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
41
35
|
minFilter: LinearFilter,
|
|
42
36
|
magFilter: LinearFilter,
|
|
@@ -145,7 +139,6 @@ export default function bloom_pass(
|
|
|
145
139
|
size.multiplyScalar(devicePixelRatio);
|
|
146
140
|
bloomPass.setSize(size.x, size.y);
|
|
147
141
|
selectTextureTarget.setSize(size.x, size.y);
|
|
148
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
149
142
|
// 缺陷②修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
150
143
|
// 需手动把 selectDepthTexture 的尺寸与全屏 baseDepth 对齐,否则深度比例错位导致 bloom 被全部 discard
|
|
151
144
|
selectDepthTexture.image.width = size.x;
|
|
@@ -198,14 +191,12 @@ export default function bloom_pass(
|
|
|
198
191
|
});
|
|
199
192
|
|
|
200
193
|
try {
|
|
194
|
+
// ⭐ mask 这一趟顺带把本体深度写进 selectDepthTexture(挂在 selectTextureTarget 的 depth
|
|
195
|
+
// attachment 上);原先紧随其后的「只渲深度」第二趟(同材质/同相机/同几何 ⇒ 深度逐位相同)
|
|
196
|
+
// 已在 2026-10-11 皇上旨简化时删除。与材质/父节点还原同生命周期。
|
|
201
197
|
renderer.setRenderTarget(selectTextureTarget);
|
|
202
198
|
renderer.clear();
|
|
203
199
|
renderer.render(scene, camera);
|
|
204
|
-
|
|
205
|
-
// 单独渲染对象深度到无 MSAA 目标,供 depthTestShader 做遮挡判定(与材质/父节点还原同生命周期)
|
|
206
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
207
|
-
renderer.clear();
|
|
208
|
-
renderer.render(scene, camera);
|
|
209
200
|
} finally {
|
|
210
201
|
// 还原材质 emissive
|
|
211
202
|
emissiveBackup.forEach(({ material, emissive, emissiveIntensity }) => {
|
package/pass/cover_pass.js
CHANGED
|
@@ -20,23 +20,18 @@ const selectDepthTexture = (() => {
|
|
|
20
20
|
baseDepthTexture.anisotropy = 16;
|
|
21
21
|
return baseDepthTexture;
|
|
22
22
|
})();
|
|
23
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染」:selectDepthTexture 挂在本目标上当 depth attachment,
|
|
24
|
+
// mask 那一趟光栅化顺带写出本体深度 ⇒ 原来为同一对象再渲一趟「只出深度」整条删除。
|
|
23
25
|
const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
24
26
|
minFilter: LinearFilter,
|
|
25
27
|
magFilter: LinearFilter,
|
|
26
28
|
format: RGBAFormat,
|
|
29
|
+
depthTexture: selectDepthTexture,
|
|
27
30
|
anisotropy: 16,
|
|
28
|
-
// 无 MSAA:mask
|
|
31
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
29
32
|
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,覆盖边缘锯齿。
|
|
30
33
|
// 边缘抗锯齿统一由终处理 FXAA 兜底。
|
|
31
34
|
});
|
|
32
|
-
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
33
|
-
const selectDepthTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
34
|
-
minFilter: LinearFilter,
|
|
35
|
-
magFilter: LinearFilter,
|
|
36
|
-
format: RGBAFormat,
|
|
37
|
-
depthTexture: selectDepthTexture,
|
|
38
|
-
anisotropy: 16,
|
|
39
|
-
});
|
|
40
35
|
const selectDepthTestTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
41
36
|
minFilter: LinearFilter,
|
|
42
37
|
magFilter: LinearFilter,
|
|
@@ -125,7 +120,6 @@ export default function cover_pass(renderer, camera, object3d, baseDepthTexture,
|
|
|
125
120
|
renderer.getSize(size);
|
|
126
121
|
size.multiplyScalar(devicePixelRatio);
|
|
127
122
|
selectTextureTarget.setSize(size.x, size.y);
|
|
128
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
129
123
|
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
130
124
|
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致颜色覆盖被错误 discard
|
|
131
125
|
selectDepthTexture.image.width = size.x;
|
|
@@ -133,15 +127,13 @@ export default function cover_pass(renderer, camera, object3d, baseDepthTexture,
|
|
|
133
127
|
selectDepthTexture.needsUpdate = true;
|
|
134
128
|
selectDepthTestTextureTarget.setSize(size.x, size.y);
|
|
135
129
|
blur1TextureTarget.setSize(size.x, size.y);
|
|
130
|
+
// ⭐ mask 那一趟光栅化顺带把本体深度写进 selectDepthTexture(挂在 selectTextureTarget 的
|
|
131
|
+
// depth attachment 上);原先紧随其后的「只渲深度」第二趟(同材质/同相机/同几何 ⇒ 深度逐位相同)
|
|
132
|
+
// 已在 2026-10-11 皇上旨简化时删除。
|
|
136
133
|
renderer.setRenderTarget(selectTextureTarget);
|
|
137
134
|
scene.children = [object3d];
|
|
138
135
|
renderer.clear();
|
|
139
136
|
renderer.render(scene, camera);
|
|
140
|
-
// 单独渲染对象深度到无 MSAA 目标,供 depthTestShader 做遮挡判定
|
|
141
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
142
|
-
scene.children = [object3d];
|
|
143
|
-
renderer.clear();
|
|
144
|
-
renderer.render(scene, camera);
|
|
145
137
|
// 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 cover 的遮挡判定
|
|
146
138
|
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
147
139
|
renderer.setRenderTarget(originRenderTarget);
|
package/pass/cover_pass.ts
CHANGED
|
@@ -23,25 +23,19 @@ const selectDepthTexture: DepthTexture = (() => {
|
|
|
23
23
|
return baseDepthTexture;
|
|
24
24
|
})();
|
|
25
25
|
|
|
26
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染」:selectDepthTexture 挂在本目标上当 depth attachment,
|
|
27
|
+
// mask 那一趟光栅化顺带写出本体深度 ⇒ 原来为同一对象再渲一趟「只出深度」整条删除。
|
|
26
28
|
const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
27
29
|
minFilter: LinearFilter,
|
|
28
30
|
magFilter: LinearFilter,
|
|
29
31
|
format: RGBAFormat,
|
|
32
|
+
depthTexture: selectDepthTexture,
|
|
30
33
|
anisotropy: 16,
|
|
31
|
-
// 无 MSAA:mask
|
|
34
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
32
35
|
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,覆盖边缘锯齿。
|
|
33
36
|
// 边缘抗锯齿统一由终处理 FXAA 兜底。
|
|
34
37
|
});
|
|
35
38
|
|
|
36
|
-
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
37
|
-
const selectDepthTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
38
|
-
minFilter: LinearFilter,
|
|
39
|
-
magFilter: LinearFilter,
|
|
40
|
-
format: RGBAFormat,
|
|
41
|
-
depthTexture: selectDepthTexture,
|
|
42
|
-
anisotropy: 16,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
39
|
const selectDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
46
40
|
minFilter: LinearFilter,
|
|
47
41
|
magFilter: LinearFilter,
|
|
@@ -149,7 +143,6 @@ export default function cover_pass(
|
|
|
149
143
|
renderer.getSize(size);
|
|
150
144
|
size.multiplyScalar(devicePixelRatio);
|
|
151
145
|
selectTextureTarget.setSize(size.x, size.y);
|
|
152
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
153
146
|
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
154
147
|
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致颜色覆盖被错误 discard
|
|
155
148
|
selectDepthTexture.image.width = size.x;
|
|
@@ -157,16 +150,13 @@ export default function cover_pass(
|
|
|
157
150
|
selectDepthTexture.needsUpdate = true;
|
|
158
151
|
selectDepthTestTextureTarget.setSize(size.x, size.y);
|
|
159
152
|
blur1TextureTarget.setSize(size.x, size.y);
|
|
153
|
+
// ⭐ mask 那一趟光栅化顺带把本体深度写进 selectDepthTexture(挂在 selectTextureTarget 的
|
|
154
|
+
// depth attachment 上);原先紧随其后的「只渲深度」第二趟(同材质/同相机/同几何 ⇒ 深度逐位相同)
|
|
155
|
+
// 已在 2026-10-11 皇上旨简化时删除。
|
|
160
156
|
renderer.setRenderTarget(selectTextureTarget);
|
|
161
157
|
scene.children = [object3d];
|
|
162
158
|
renderer.clear();
|
|
163
159
|
renderer.render(scene, camera);
|
|
164
|
-
|
|
165
|
-
// 单独渲染对象深度到无 MSAA 目标,供 depthTestShader 做遮挡判定
|
|
166
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
167
|
-
scene.children = [object3d];
|
|
168
|
-
renderer.clear();
|
|
169
|
-
renderer.render(scene, camera);
|
|
170
160
|
// 调试:记录选区深度,供面板「深度判定图 / 辉光深度比对」排查 cover 的遮挡判定
|
|
171
161
|
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
172
162
|
|
|
@@ -2,8 +2,8 @@ import type { DepthTexture } from "three";
|
|
|
2
2
|
/**
|
|
3
3
|
* 深度调试预览模式(面板按钮与控制台 `window.__TB_DEBUG_DEPTH` 共用同一枚举):
|
|
4
4
|
* - "none" :正常渲染(默认)
|
|
5
|
-
* - "global"
|
|
6
|
-
* - "ao" :AO 深度图(aoDepthTexture
|
|
5
|
+
* - "global" :可见深度图(baseDepthTexture,各物体自身材质渲染,含地板)
|
|
6
|
+
* - "ao" :AO 深度图(aoDepthTexture,法线 pass 顺带写入,override 渲染)
|
|
7
7
|
* - "compare" :R=base 深度、G=选区 select 深度(对数反解后归一化)
|
|
8
8
|
* - "judge" :R=base 原始深度、G=select 原始深度、B=判定结果(1=判为被遮挡应 discard)
|
|
9
9
|
* - "excluded":深度图灰度 + 「被排除出深度图的面」叠红(红=挡不住任何后处理)
|
package/pass/debugDepthState.ts
CHANGED
|
@@ -3,8 +3,8 @@ import type { DepthTexture } from "three";
|
|
|
3
3
|
/**
|
|
4
4
|
* 深度调试预览模式(面板按钮与控制台 `window.__TB_DEBUG_DEPTH` 共用同一枚举):
|
|
5
5
|
* - "none" :正常渲染(默认)
|
|
6
|
-
* - "global"
|
|
7
|
-
* - "ao" :AO 深度图(aoDepthTexture
|
|
6
|
+
* - "global" :可见深度图(baseDepthTexture,各物体自身材质渲染,含地板)
|
|
7
|
+
* - "ao" :AO 深度图(aoDepthTexture,法线 pass 顺带写入,override 渲染)
|
|
8
8
|
* - "compare" :R=base 深度、G=选区 select 深度(对数反解后归一化)
|
|
9
9
|
* - "judge" :R=base 原始深度、G=select 原始深度、B=判定结果(1=判为被遮挡应 discard)
|
|
10
10
|
* - "excluded":深度图灰度 + 「被排除出深度图的面」叠红(红=挡不住任何后处理)
|
package/pass/glow_pass.js
CHANGED
|
@@ -14,23 +14,18 @@ const selectDepthTexture = (() => {
|
|
|
14
14
|
baseDepthTexture.anisotropy = 16;
|
|
15
15
|
return baseDepthTexture;
|
|
16
16
|
})();
|
|
17
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染」:selectDepthTexture 挂在本目标上当 depth attachment,
|
|
18
|
+
// mask 那一趟光栅化顺带写出本体深度 ⇒ 原来为同一对象再渲一趟「只出深度」整条删除。
|
|
17
19
|
const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
18
20
|
minFilter: LinearFilter,
|
|
19
21
|
magFilter: LinearFilter,
|
|
20
22
|
format: RGBAFormat,
|
|
23
|
+
depthTexture: selectDepthTexture,
|
|
21
24
|
anisotropy: 16,
|
|
22
|
-
// 无 MSAA:mask
|
|
25
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
23
26
|
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,辉光边缘锯齿。
|
|
24
27
|
// 边缘抗锯齿统一由 mask 内部 FXAA + 终处理 FXAA 兜底。
|
|
25
28
|
});
|
|
26
|
-
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
27
|
-
const selectDepthTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
28
|
-
minFilter: LinearFilter,
|
|
29
|
-
magFilter: LinearFilter,
|
|
30
|
-
format: RGBAFormat,
|
|
31
|
-
depthTexture: selectDepthTexture,
|
|
32
|
-
anisotropy: 16,
|
|
33
|
-
});
|
|
34
29
|
const selectDepthTestTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
35
30
|
minFilter: LinearFilter,
|
|
36
31
|
magFilter: LinearFilter,
|
|
@@ -483,7 +478,6 @@ export default function glow_pass(renderer, camera, object3d, baseDepthTexture,
|
|
|
483
478
|
renderer.getSize(size);
|
|
484
479
|
size.multiplyScalar(devicePixelRatio);
|
|
485
480
|
selectTextureTarget.setSize(size.x, size.y);
|
|
486
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
487
481
|
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
488
482
|
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致辉光被错误 discard
|
|
489
483
|
selectDepthTexture.image.width = size.x;
|
|
@@ -495,16 +489,14 @@ export default function glow_pass(renderer, camera, object3d, baseDepthTexture,
|
|
|
495
489
|
selectDepthBlurTmpTextureTarget.setSize(size.x, size.y);
|
|
496
490
|
selectDepthBlurTextureTarget.setSize(size.x, size.y);
|
|
497
491
|
blurDepthTestTextureTarget.setSize(size.x, size.y);
|
|
498
|
-
// 1. 渲染物体本体 mask
|
|
492
|
+
// 1. 渲染物体本体 mask(灰度)。⭐ 本体深度由同一趟光栅化顺带写进 selectDepthTexture
|
|
493
|
+
// (挂在 selectTextureTarget 的 depth attachment 上);原先的第 2 趟「只渲深度」(供 min-blur
|
|
494
|
+
// 外扩用)与这趟同材质/同相机/同几何 ⇒ 深度逐位相同,2026-10-11 皇上旨简化时删除。
|
|
495
|
+
// (下面的步骤编号保留 3/4/5…,别处注释按号交叉引用,不随之重排。)
|
|
499
496
|
renderer.setRenderTarget(selectTextureTarget);
|
|
500
497
|
scene.children = [object3d];
|
|
501
498
|
renderer.clear();
|
|
502
499
|
renderer.render(scene, camera);
|
|
503
|
-
// 2. 渲染物体本体深度(无 MSAA,供 min-blur 外扩用)
|
|
504
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
505
|
-
scene.children = [object3d];
|
|
506
|
-
renderer.clear();
|
|
507
|
-
renderer.render(scene, camera);
|
|
508
500
|
// 调试:把本次渲染的选区深度记到全局调试状态,供面板「辉光深度比对」读取
|
|
509
501
|
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
510
502
|
// 3. 深度测试(用本体 mask):被真实更近物体挡住的「本体辉光」部分 discard。
|
package/pass/glow_pass.ts
CHANGED
|
@@ -17,25 +17,19 @@ const selectDepthTexture: DepthTexture = (() => {
|
|
|
17
17
|
return baseDepthTexture;
|
|
18
18
|
})();
|
|
19
19
|
|
|
20
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染」:selectDepthTexture 挂在本目标上当 depth attachment,
|
|
21
|
+
// mask 那一趟光栅化顺带写出本体深度 ⇒ 原来为同一对象再渲一趟「只出深度」整条删除。
|
|
20
22
|
const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
21
23
|
minFilter: LinearFilter,
|
|
22
24
|
magFilter: LinearFilter,
|
|
23
25
|
format: RGBAFormat,
|
|
26
|
+
depthTexture: selectDepthTexture,
|
|
24
27
|
anisotropy: 16,
|
|
25
|
-
// 无 MSAA:mask
|
|
28
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
26
29
|
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,辉光边缘锯齿。
|
|
27
30
|
// 边缘抗锯齿统一由 mask 内部 FXAA + 终处理 FXAA 兜底。
|
|
28
31
|
});
|
|
29
32
|
|
|
30
|
-
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
31
|
-
const selectDepthTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
32
|
-
minFilter: LinearFilter,
|
|
33
|
-
magFilter: LinearFilter,
|
|
34
|
-
format: RGBAFormat,
|
|
35
|
-
depthTexture: selectDepthTexture,
|
|
36
|
-
anisotropy: 16,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
33
|
const selectDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
40
34
|
minFilter: LinearFilter,
|
|
41
35
|
magFilter: LinearFilter,
|
|
@@ -521,7 +515,6 @@ export default function glow_pass(
|
|
|
521
515
|
renderer.getSize(size);
|
|
522
516
|
size.multiplyScalar(devicePixelRatio);
|
|
523
517
|
selectTextureTarget.setSize(size.x, size.y);
|
|
524
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
525
518
|
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
526
519
|
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致辉光被错误 discard
|
|
527
520
|
selectDepthTexture.image.width = size.x;
|
|
@@ -534,17 +527,14 @@ export default function glow_pass(
|
|
|
534
527
|
selectDepthBlurTextureTarget.setSize(size.x, size.y);
|
|
535
528
|
blurDepthTestTextureTarget.setSize(size.x, size.y);
|
|
536
529
|
|
|
537
|
-
// 1. 渲染物体本体 mask
|
|
530
|
+
// 1. 渲染物体本体 mask(灰度)。⭐ 本体深度由同一趟光栅化顺带写进 selectDepthTexture
|
|
531
|
+
// (挂在 selectTextureTarget 的 depth attachment 上);原先的第 2 趟「只渲深度」(供 min-blur
|
|
532
|
+
// 外扩用)与这趟同材质/同相机/同几何 ⇒ 深度逐位相同,2026-10-11 皇上旨简化时删除。
|
|
533
|
+
// (下面的步骤编号保留 3/4/5…,别处注释按号交叉引用,不随之重排。)
|
|
538
534
|
renderer.setRenderTarget(selectTextureTarget);
|
|
539
535
|
scene.children = [object3d];
|
|
540
536
|
renderer.clear();
|
|
541
537
|
renderer.render(scene, camera);
|
|
542
|
-
|
|
543
|
-
// 2. 渲染物体本体深度(无 MSAA,供 min-blur 外扩用)
|
|
544
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
545
|
-
scene.children = [object3d];
|
|
546
|
-
renderer.clear();
|
|
547
|
-
renderer.render(scene, camera);
|
|
548
538
|
// 调试:把本次渲染的选区深度记到全局调试状态,供面板「辉光深度比对」读取
|
|
549
539
|
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
550
540
|
|
package/pass/ssao_pass.d.ts
CHANGED
|
@@ -1,67 +1,36 @@
|
|
|
1
1
|
import { MeshNormalMaterial, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* GTAO 在其表面算自遮蔽(褶皱、紧贴其它几何的窄缝)→ 这份 AO 被乘到「透过它看到的
|
|
7
|
-
* 实体」上 → 该区域发黑。
|
|
8
|
-
* b) transparent:true + depthWrite:false(霓虹灯管、光晕、叠加面):深度图保留身后几何(远),
|
|
9
|
-
* 但法线 pass 用 overrideMaterial(MeshNormalMaterial 默认 depthWrite:true)会强行把它的
|
|
10
|
-
* 法线写进去(近)→ 深度与法线指的不是同一个点 → GTAO 几乎必然算错发黑。
|
|
11
|
-
* 故深度 pass 与法线 pass 统一隐藏:该像素的深度/法线即身后不透明几何,AO 由真实可见几何
|
|
12
|
-
* 决定;身后是背景时深度为 1.0,shader 守卫直接判「无遮蔽」(=1),不会发黑。
|
|
13
|
-
*
|
|
14
|
-
* 判据只看 material.transparent 本身,不再依赖 opacity / depthWrite(2026-08-30 修正):
|
|
15
|
-
* 大量半透明是自定义 ShaderMaterial,alpha 由 shader 算出来,而材质的 opacity 仍是默认 1、
|
|
16
|
-
* depthWrite 仍是 true —— 典型如 Ground1 地板(mapColor.a 径向渐变)、聚光灯光斑、
|
|
17
|
-
* effectMaterial1,靠材质属性完全读不出来,会被漏判并继续污染 AO。
|
|
18
|
-
* 代价:Mirror 这类「标了 transparent 但 shader 实际输出 alpha=1.0」的实心反射面会被误排除,
|
|
19
|
-
* 故 Mirror 在构造函数里显式标记 userData.aoOpaque = true 保留(见各 Mirror 实现)。
|
|
20
|
-
* 其余特例同样可用 userData.aoTransparent=true 强制排除 / userData.aoOpaque=true 强制保留。
|
|
21
|
-
*
|
|
22
|
-
* @param includeFloor 是否为「含地板」的 AO 数据准备(GTAO 深度/法线)。
|
|
23
|
-
* - false(默认,可见深度 / 描边/辉光/毛玻璃遮挡判定):地板按普通半透明排除。
|
|
24
|
-
* - true(AO 深度):标了 userData.aoFloor 的地板保留为实体,参与接触 AO 计算。
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* 可见深度图的运行时开关:**标了 `userData.aoFloor` 的地板是否参与遮挡判定**。
|
|
28
|
-
*
|
|
29
|
-
* 默认 false = 保持原设计(可透视地板:透过地板看到的物体照常显示,不被地板挡住)。
|
|
30
|
-
* 置 true 后,地板会写进 baseDepthTexture,于是**被地板挡住的描边/辉光/毛玻璃/覆盖色会被正确遮挡**。
|
|
31
|
-
* 面板「深度调试 → 地板参与遮挡」可一键切换,用于排查"挡不住"是不是地板(如 Ground1)造成的。
|
|
32
|
-
*
|
|
33
|
-
* 只影响 aoFloor 地板这一类;transparent 面的处理不受影响(见 isSeeThroughSurface)。
|
|
34
|
-
*/
|
|
35
|
-
export declare const visibleDepthOptions: {
|
|
36
|
-
includeFloor: boolean;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* 深度 pass:固定排除非实体表面后,将场景深度渲染到 depthRenderTarget。
|
|
40
|
-
* depthRenderTarget.depthTexture 即 baseDepthTexture,供 SSAO / 描边 / 发光等后续 pass 复用。
|
|
3
|
+
* 可见深度 pass:固定排除非实体表面后,用**各物体自身的材质**把场景深度渲染到 depthRenderTarget。
|
|
4
|
+
* depthRenderTarget.depthTexture 即 baseDepthTexture,供描边 / 发光 / 覆盖 / 磨砂的遮挡判定,
|
|
5
|
+
* 也是 SSAO 合成时「真实可见表面」的参考。
|
|
41
6
|
* 排除的非实体对象(sprite/线条/点)在深度图保留 clear 深度(1.0=远),与背景一致;排除的
|
|
42
7
|
* 半透明对象则保留其身后不透明几何的深度(身后无几何时同样为 1.0)。均不影响颜色通道渲染。
|
|
8
|
+
* ⚠️ 名字里的 ao 已不适用(2026-10-11 改名自 renderAoDepthPass):它产出的是**可见深度**,
|
|
9
|
+
* AO 自己的深度挂在法线 pass 上(见 renderAoNormalPass),两者只差 excludeTransparent 一个开关。
|
|
43
10
|
*/
|
|
44
|
-
export declare function
|
|
11
|
+
export declare function renderVisibleDepthPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, excludeTransparent?: boolean): void;
|
|
45
12
|
/**
|
|
46
13
|
* 调试用:把「被排除出可见深度图」的表面单独渲成红色 mask。
|
|
47
14
|
*
|
|
48
|
-
* 这些面在
|
|
15
|
+
* 这些面在 renderVisibleDepthPass 里被 hideNonSurface 隐藏,因此**不会写进 baseDepthTexture**,
|
|
49
16
|
* 也就永远挡不住描边/辉光/毛玻璃/覆盖色 —— 这正是"深度测试看起来失效"最常见的成因
|
|
50
|
-
* (用户以为是 bug,其实是该面被设计成可透视:sprite/线条/点、userData.aoTransparent
|
|
51
|
-
*
|
|
17
|
+
* (用户以为是 bug,其实是该面被设计成可透视:sprite/线条/点、userData.aoTransparent)。
|
|
18
|
+
* ⚠️ 地板不在此列:2026-10-11 起 Ground1 是实心不透明面,正常写进可见深度图。
|
|
52
19
|
* 面板「深度调试 → 排除面标记」叠加显示:灰=能挡住的真实遮挡面,红=被排除、挡不住任何东西。
|
|
53
20
|
*
|
|
54
21
|
* 只渲染 Mesh:sprite / Line2 / Points 在 MeshBasicMaterial override 下渲染异常(见文件头注释),
|
|
55
22
|
* 且它们数量少、用户关心的遮挡体基本都是 Mesh,故跳过。
|
|
56
23
|
*/
|
|
57
|
-
export declare function renderExcludedMaskPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, maskRenderTarget: WebGLRenderTarget,
|
|
24
|
+
export declare function renderExcludedMaskPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, maskRenderTarget: WebGLRenderTarget, excludeTransparent?: boolean): void;
|
|
58
25
|
/**
|
|
59
26
|
* 法线 pass(仅 SSAO 开启时需要):固定排除非实体表面后,以中性灰清屏 + normalMaterial
|
|
60
27
|
* override 将视图空间法线渲染到 normalRenderTarget,供 GTAO 风格 SSAO 使用。
|
|
61
28
|
* 排除对象在法线图保留中性灰清屏色 → unpackRGBToNormal(0.5,0.5,0.5)=(0,0,0) →
|
|
62
29
|
* SSAO 退化法线守卫判"无遮蔽"(=1),避免精灵弹窗被 AO 乘黑。清屏色用后即还原。
|
|
30
|
+
* 深度白拿:normalRenderTarget 挂着 aoDepthTexture 作 depth attachment,这一趟的深度由光栅器
|
|
31
|
+
* 顺带写入 → 就是 AO 用的深度,无需再单独渲一遍(2026-09-14)。
|
|
63
32
|
*/
|
|
64
|
-
export declare function renderAoNormalPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial,
|
|
33
|
+
export declare function renderAoNormalPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, excludeTransparent?: boolean): void;
|
|
65
34
|
export interface SsaoOptions {
|
|
66
35
|
enable: boolean;
|
|
67
36
|
debug?: boolean;
|