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/pass/stroke_pass.js
CHANGED
|
@@ -15,23 +15,20 @@ const selectDepthTexture = (() => {
|
|
|
15
15
|
baseDepthTexture.anisotropy = 16;
|
|
16
16
|
return baseDepthTexture;
|
|
17
17
|
})();
|
|
18
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染,少渲两遍」:selectDepthTexture 直接挂在 mask 目标上当
|
|
19
|
+
// depth attachment —— 深度是光栅器的副产品(零额外代价),mask 那一次渲染顺带把它写进来。
|
|
20
|
+
// 原先还要为同一个对象再单独渲一趟「只出深度」(同材质、同相机、同几何 ⇒ 深度值逐位相同),
|
|
21
|
+
// stroke/glow/cover/bloom 四个 pass 各一遍 ⇒ 每个带特效的对象每帧白渲 4 趟,已整条删除。
|
|
18
22
|
const selectTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
19
23
|
minFilter: LinearFilter,
|
|
20
24
|
magFilter: LinearFilter,
|
|
21
25
|
format: RGBAFormat,
|
|
26
|
+
depthTexture: selectDepthTexture,
|
|
22
27
|
anisotropy: 16,
|
|
23
|
-
// 无 MSAA:mask
|
|
28
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
24
29
|
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,描边边缘锯齿。
|
|
25
30
|
// 边缘抗锯齿统一由 mask 内部 FXAA + 终处理 FXAA 兜底。
|
|
26
31
|
});
|
|
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
32
|
const selectDepthTestTextureTarget = new WebGLRenderTarget(1024, 1024, {
|
|
36
33
|
minFilter: LinearFilter,
|
|
37
34
|
magFilter: LinearFilter,
|
|
@@ -503,7 +500,6 @@ export default function stroke_pass(renderer, camera, object3d, baseDepthTexture
|
|
|
503
500
|
renderer.getSize(size);
|
|
504
501
|
size.multiplyScalar(devicePixelRatio);
|
|
505
502
|
selectTextureTarget.setSize(size.x, size.y);
|
|
506
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
507
503
|
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
508
504
|
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致描边被错误 discard
|
|
509
505
|
selectDepthTexture.image.width = size.x;
|
|
@@ -515,16 +511,14 @@ export default function stroke_pass(renderer, camera, object3d, baseDepthTexture
|
|
|
515
511
|
selectDepthBlurTmpTextureTarget.setSize(size.x, size.y);
|
|
516
512
|
selectDepthBlurTextureTarget.setSize(size.x, size.y);
|
|
517
513
|
blurDepthTestTextureTarget.setSize(size.x, size.y);
|
|
518
|
-
// 1. 渲染物体本体 mask
|
|
514
|
+
// 1. 渲染物体本体 mask(灰度)。⭐ 本体深度由同一趟光栅化顺带写进 selectDepthTexture
|
|
515
|
+
// (挂在 selectTextureTarget 的 depth attachment 上)—— 原先这里还有第 2 趟「只渲深度」,
|
|
516
|
+
// 同材质/同相机/同几何 ⇒ 深度逐位相同,纯重复遍历,2026-10-11 皇上旨简化时删除。
|
|
517
|
+
// (下面的步骤编号保留 3/4/5…,别处注释按号交叉引用,不随之重排。)
|
|
519
518
|
renderer.setRenderTarget(selectTextureTarget);
|
|
520
519
|
scene.children = [object3d];
|
|
521
520
|
renderer.clear();
|
|
522
521
|
renderer.render(scene, camera);
|
|
523
|
-
// 2. 渲染物体本体深度(无 MSAA,供 depthTest 判定遮挡)
|
|
524
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
525
|
-
scene.children = [object3d];
|
|
526
|
-
renderer.clear();
|
|
527
|
-
renderer.render(scene, camera);
|
|
528
522
|
// 调试:把本次渲染的选区深度记到全局调试状态,供面板「辉光深度比对」读取
|
|
529
523
|
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
530
524
|
// 3. 深度测试(用本体 mask):被真实更近物体挡住的「本体描边」部分 discard。
|
package/pass/stroke_pass.ts
CHANGED
|
@@ -18,25 +18,21 @@ const selectDepthTexture: DepthTexture = (() => {
|
|
|
18
18
|
return baseDepthTexture;
|
|
19
19
|
})();
|
|
20
20
|
|
|
21
|
+
// ⭐ 2026-10-11 皇上旨「简化渲染,少渲两遍」:selectDepthTexture 直接挂在 mask 目标上当
|
|
22
|
+
// depth attachment —— 深度是光栅器的副产品(零额外代价),mask 那一次渲染顺带把它写进来。
|
|
23
|
+
// 原先还要为同一个对象再单独渲一趟「只出深度」(同材质、同相机、同几何 ⇒ 深度值逐位相同),
|
|
24
|
+
// stroke/glow/cover/bloom 四个 pass 各一遍 ⇒ 每个带特效的对象每帧白渲 4 趟,已整条删除。
|
|
21
25
|
const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
22
26
|
minFilter: LinearFilter,
|
|
23
27
|
magFilter: LinearFilter,
|
|
24
28
|
format: RGBAFormat,
|
|
29
|
+
depthTexture: selectDepthTexture,
|
|
25
30
|
anisotropy: 16,
|
|
26
|
-
// 无 MSAA:mask
|
|
31
|
+
// 无 MSAA:mask 颜色与它顺带写入的深度必须同为硬边缘,
|
|
27
32
|
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,描边边缘锯齿。
|
|
28
33
|
// 边缘抗锯齿统一由 mask 内部 FXAA + 终处理 FXAA 兜底。
|
|
29
34
|
});
|
|
30
35
|
|
|
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
36
|
const selectDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
41
37
|
minFilter: LinearFilter,
|
|
42
38
|
magFilter: LinearFilter,
|
|
@@ -532,7 +528,6 @@ export default function stroke_pass(
|
|
|
532
528
|
renderer.getSize(size);
|
|
533
529
|
size.multiplyScalar(devicePixelRatio);
|
|
534
530
|
selectTextureTarget.setSize(size.x, size.y);
|
|
535
|
-
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
536
531
|
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
537
532
|
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致描边被错误 discard
|
|
538
533
|
selectDepthTexture.image.width = size.x;
|
|
@@ -545,17 +540,14 @@ export default function stroke_pass(
|
|
|
545
540
|
selectDepthBlurTextureTarget.setSize(size.x, size.y);
|
|
546
541
|
blurDepthTestTextureTarget.setSize(size.x, size.y);
|
|
547
542
|
|
|
548
|
-
// 1. 渲染物体本体 mask
|
|
543
|
+
// 1. 渲染物体本体 mask(灰度)。⭐ 本体深度由同一趟光栅化顺带写进 selectDepthTexture
|
|
544
|
+
// (挂在 selectTextureTarget 的 depth attachment 上)—— 原先这里还有第 2 趟「只渲深度」,
|
|
545
|
+
// 同材质/同相机/同几何 ⇒ 深度逐位相同,纯重复遍历,2026-10-11 皇上旨简化时删除。
|
|
546
|
+
// (下面的步骤编号保留 3/4/5…,别处注释按号交叉引用,不随之重排。)
|
|
549
547
|
renderer.setRenderTarget(selectTextureTarget);
|
|
550
548
|
scene.children = [object3d];
|
|
551
549
|
renderer.clear();
|
|
552
550
|
renderer.render(scene, camera);
|
|
553
|
-
|
|
554
|
-
// 2. 渲染物体本体深度(无 MSAA,供 depthTest 判定遮挡)
|
|
555
|
-
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
556
|
-
scene.children = [object3d];
|
|
557
|
-
renderer.clear();
|
|
558
|
-
renderer.render(scene, camera);
|
|
559
551
|
// 调试:把本次渲染的选区深度记到全局调试状态,供面板「辉光深度比对」读取
|
|
560
552
|
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
561
553
|
|
|
@@ -2,7 +2,7 @@ import { ShaderMaterial } from "three";
|
|
|
2
2
|
/**
|
|
3
3
|
* 调试用:把 baseDepthTexture(可见深度图)直接以灰度输出到屏幕。
|
|
4
4
|
* 对数深度:近=0(黑) 远=1(白)。
|
|
5
|
-
* - 全屏纯白 → 深度图为空(全 clear 1.0),说明
|
|
5
|
+
* - 全屏纯白 → 深度图为空(全 clear 1.0),说明 renderVisibleDepthPass 没把深度写进 baseDepthTexture;
|
|
6
6
|
* 此时所有依赖深度遮挡的后处理(stroke/glow/cover/frosted)都会"一律显示在前"。
|
|
7
7
|
* - 有灰阶/明暗 → 深度图正常,问题在比对侧(selectDepth / depthTestShader)。
|
|
8
8
|
* 触发:在控制台执行 `window.__BASE_DEPTH_VIS = true` 后画面即切到该视图。
|
|
@@ -2,7 +2,7 @@ import { ShaderChunk, ShaderMaterial } from "three";
|
|
|
2
2
|
/**
|
|
3
3
|
* 调试用:把 baseDepthTexture(可见深度图)直接以灰度输出到屏幕。
|
|
4
4
|
* 对数深度:近=0(黑) 远=1(白)。
|
|
5
|
-
* - 全屏纯白 → 深度图为空(全 clear 1.0),说明
|
|
5
|
+
* - 全屏纯白 → 深度图为空(全 clear 1.0),说明 renderVisibleDepthPass 没把深度写进 baseDepthTexture;
|
|
6
6
|
* 此时所有依赖深度遮挡的后处理(stroke/glow/cover/frosted)都会"一律显示在前"。
|
|
7
7
|
* - 有灰阶/明暗 → 深度图正常,问题在比对侧(selectDepth / depthTestShader)。
|
|
8
8
|
* 触发:在控制台执行 `window.__BASE_DEPTH_VIS = true` 后画面即切到该视图。
|
|
@@ -2,7 +2,7 @@ import { ShaderChunk, ShaderMaterial } from "three";
|
|
|
2
2
|
/**
|
|
3
3
|
* 调试用:把 baseDepthTexture(可见深度图)直接以灰度输出到屏幕。
|
|
4
4
|
* 对数深度:近=0(黑) 远=1(白)。
|
|
5
|
-
* - 全屏纯白 → 深度图为空(全 clear 1.0),说明
|
|
5
|
+
* - 全屏纯白 → 深度图为空(全 clear 1.0),说明 renderVisibleDepthPass 没把深度写进 baseDepthTexture;
|
|
6
6
|
* 此时所有依赖深度遮挡的后处理(stroke/glow/cover/frosted)都会"一律显示在前"。
|
|
7
7
|
* - 有灰阶/明暗 → 深度图正常,问题在比对侧(selectDepth / depthTestShader)。
|
|
8
8
|
* 触发:在控制台执行 `window.__BASE_DEPTH_VIS = true` 后画面即切到该视图。
|
|
@@ -5,7 +5,7 @@ import { ShaderMaterial } from "three";
|
|
|
5
5
|
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
6
6
|
* G = 选区自身深度(selectDepthTexture,由 glow_pass/stroke_pass 渲染后写入 debugDepthState)
|
|
7
7
|
* 两路都用 `pow(cameraFar+1, d)-1` 反推到近似线性视深再归一化(背景≈1 → 黄白)。
|
|
8
|
-
* - R 全白、G 也有内容 → 全局 base 深度没写进(
|
|
8
|
+
* - R 全白、G 也有内容 → 全局 base 深度没写进(renderVisibleDepthPass 失效),但选区深度正常;
|
|
9
9
|
* - R、G 都全白 → 两路深度都没写进;
|
|
10
10
|
* - R 有灰阶、G 全白 → 选区深度没写进(glow/stroke 自身的深度 pass 失效);
|
|
11
11
|
* - R、G 都有灰阶 → 深度正常,问题在 depthTestShader 比对侧。
|
|
@@ -5,7 +5,7 @@ import { ShaderChunk, ShaderMaterial } from "three";
|
|
|
5
5
|
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
6
6
|
* G = 选区自身深度(selectDepthTexture,由 glow_pass/stroke_pass 渲染后写入 debugDepthState)
|
|
7
7
|
* 两路都用 `pow(cameraFar+1, d)-1` 反推到近似线性视深再归一化(背景≈1 → 黄白)。
|
|
8
|
-
* - R 全白、G 也有内容 → 全局 base 深度没写进(
|
|
8
|
+
* - R 全白、G 也有内容 → 全局 base 深度没写进(renderVisibleDepthPass 失效),但选区深度正常;
|
|
9
9
|
* - R、G 都全白 → 两路深度都没写进;
|
|
10
10
|
* - R 有灰阶、G 全白 → 选区深度没写进(glow/stroke 自身的深度 pass 失效);
|
|
11
11
|
* - R、G 都有灰阶 → 深度正常,问题在 depthTestShader 比对侧。
|
|
@@ -6,7 +6,7 @@ import { ShaderChunk, ShaderMaterial } from "three";
|
|
|
6
6
|
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
7
7
|
* G = 选区自身深度(selectDepthTexture,由 glow_pass/stroke_pass 渲染后写入 debugDepthState)
|
|
8
8
|
* 两路都用 `pow(cameraFar+1, d)-1` 反推到近似线性视深再归一化(背景≈1 → 黄白)。
|
|
9
|
-
* - R 全白、G 也有内容 → 全局 base 深度没写进(
|
|
9
|
+
* - R 全白、G 也有内容 → 全局 base 深度没写进(renderVisibleDepthPass 失效),但选区深度正常;
|
|
10
10
|
* - R、G 都全白 → 两路深度都没写进;
|
|
11
11
|
* - R 有灰阶、G 全白 → 选区深度没写进(glow/stroke 自身的深度 pass 失效);
|
|
12
12
|
* - R、G 都有灰阶 → 深度正常,问题在 depthTestShader 比对侧。
|
|
@@ -3,11 +3,13 @@ import { ShaderMaterial } from "three";
|
|
|
3
3
|
* 调试用:把「可见深度图」与「被排除面 mask」叠在一起看。
|
|
4
4
|
*
|
|
5
5
|
* 底色 = baseDepthTexture 灰度(近黑远白,同「全局深度图」档);
|
|
6
|
-
* 红色 = 该像素上的表面被
|
|
7
|
-
*
|
|
6
|
+
* 红色 = 该像素上的表面被 renderVisibleDepthPass 排除(sprite/线条/点、userData.aoTransparent)
|
|
7
|
+
* → **它写不进深度图,永远挡不住任何后处理**。
|
|
8
|
+
* ⚠️ 地板 Ground1 不在此列:2026-10-11 皇上旨「物体的深度都要进深度图」,原 aoFloor 排除特例
|
|
9
|
+
* 已整条拆除,地板现在是正常写深度的实心面(该像素应显示为灰、不是红)。
|
|
8
10
|
*
|
|
9
|
-
* 判读:挡不住你的那个面如果是红的 →
|
|
10
|
-
* 把该对象的 userData.aoTransparent
|
|
11
|
+
* 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被标记成可透视;
|
|
12
|
+
* 把该对象的 userData.aoTransparent 去掉即可让它参与遮挡。
|
|
11
13
|
*/
|
|
12
14
|
declare const debugExcludedShader: ShaderMaterial;
|
|
13
15
|
export default debugExcludedShader;
|
|
@@ -3,11 +3,13 @@ import { ShaderChunk, ShaderMaterial } from "three";
|
|
|
3
3
|
* 调试用:把「可见深度图」与「被排除面 mask」叠在一起看。
|
|
4
4
|
*
|
|
5
5
|
* 底色 = baseDepthTexture 灰度(近黑远白,同「全局深度图」档);
|
|
6
|
-
* 红色 = 该像素上的表面被
|
|
7
|
-
*
|
|
6
|
+
* 红色 = 该像素上的表面被 renderVisibleDepthPass 排除(sprite/线条/点、userData.aoTransparent)
|
|
7
|
+
* → **它写不进深度图,永远挡不住任何后处理**。
|
|
8
|
+
* ⚠️ 地板 Ground1 不在此列:2026-10-11 皇上旨「物体的深度都要进深度图」,原 aoFloor 排除特例
|
|
9
|
+
* 已整条拆除,地板现在是正常写深度的实心面(该像素应显示为灰、不是红)。
|
|
8
10
|
*
|
|
9
|
-
* 判读:挡不住你的那个面如果是红的 →
|
|
10
|
-
* 把该对象的 userData.aoTransparent
|
|
11
|
+
* 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被标记成可透视;
|
|
12
|
+
* 把该对象的 userData.aoTransparent 去掉即可让它参与遮挡。
|
|
11
13
|
*/
|
|
12
14
|
const debugExcludedShader = new ShaderMaterial({
|
|
13
15
|
uniforms: {
|
|
@@ -4,11 +4,13 @@ import { ShaderChunk, ShaderMaterial, Texture } from "three";
|
|
|
4
4
|
* 调试用:把「可见深度图」与「被排除面 mask」叠在一起看。
|
|
5
5
|
*
|
|
6
6
|
* 底色 = baseDepthTexture 灰度(近黑远白,同「全局深度图」档);
|
|
7
|
-
* 红色 = 该像素上的表面被
|
|
8
|
-
*
|
|
7
|
+
* 红色 = 该像素上的表面被 renderVisibleDepthPass 排除(sprite/线条/点、userData.aoTransparent)
|
|
8
|
+
* → **它写不进深度图,永远挡不住任何后处理**。
|
|
9
|
+
* ⚠️ 地板 Ground1 不在此列:2026-10-11 皇上旨「物体的深度都要进深度图」,原 aoFloor 排除特例
|
|
10
|
+
* 已整条拆除,地板现在是正常写深度的实心面(该像素应显示为灰、不是红)。
|
|
9
11
|
*
|
|
10
|
-
* 判读:挡不住你的那个面如果是红的 →
|
|
11
|
-
* 把该对象的 userData.aoTransparent
|
|
12
|
+
* 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被标记成可透视;
|
|
13
|
+
* 把该对象的 userData.aoTransparent 去掉即可让它参与遮挡。
|
|
12
14
|
*/
|
|
13
15
|
const debugExcludedShader = new ShaderMaterial({
|
|
14
16
|
uniforms: {
|