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.
Files changed (44) hide show
  1. package/FPScontrol.d.ts +41 -7
  2. package/FPScontrol.js +232 -155
  3. package/FPScontrol.ts +129 -55
  4. package/Ground1/Ground1.js +6 -6
  5. package/Ground1/Ground1.ts +6 -6
  6. package/MktMesh/MktMesh.d.ts +5 -1
  7. package/MktMesh/MktMesh.js +20 -7
  8. package/MktMesh/MktMesh.ts +20 -7
  9. package/MktMesh/panoSlotBind.js +18 -2
  10. package/MktMesh/panoSlotBind.ts +18 -1
  11. package/MktMesh/panoTileStitcher.d.ts +35 -7
  12. package/MktMesh/panoTileStitcher.js +71 -11
  13. package/MktMesh/panoTileStitcher.ts +73 -12
  14. package/MktMesh/types.d.ts +5 -1
  15. package/MktMesh/types.ts +5 -1
  16. package/ThreeBase.d.ts +2 -11
  17. package/ThreeBase.js +14 -26
  18. package/ThreeBase.ts +14 -26
  19. package/WaterFlow/WaterFlow.d.ts +1 -1
  20. package/WaterFlow/WaterFlow.js +1 -1
  21. package/WaterFlow/WaterFlow.ts +1 -1
  22. package/package.json +1 -1
  23. package/pass/bloom_pass.js +7 -14
  24. package/pass/bloom_pass.ts +7 -16
  25. package/pass/cover_pass.js +7 -15
  26. package/pass/cover_pass.ts +7 -17
  27. package/pass/debugDepthState.d.ts +2 -2
  28. package/pass/debugDepthState.ts +2 -2
  29. package/pass/glow_pass.js +8 -16
  30. package/pass/glow_pass.ts +8 -18
  31. package/pass/ssao_pass.d.ts +13 -44
  32. package/pass/ssao_pass.js +60 -78
  33. package/pass/ssao_pass.ts +74 -88
  34. package/pass/stroke_pass.js +10 -16
  35. package/pass/stroke_pass.ts +10 -18
  36. package/shaders/baseDepthVisShader.d.ts +1 -1
  37. package/shaders/baseDepthVisShader.js +1 -1
  38. package/shaders/baseDepthVisShader.ts +1 -1
  39. package/shaders/debugDepthCompareShader.d.ts +1 -1
  40. package/shaders/debugDepthCompareShader.js +1 -1
  41. package/shaders/debugDepthCompareShader.ts +1 -1
  42. package/shaders/debugExcludedShader.d.ts +6 -4
  43. package/shaders/debugExcludedShader.js +6 -4
  44. package/shaders/debugExcludedShader.ts +6 -4
@@ -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 颜色与下方 selectDepthTextureTarget(深度)必须同为硬边缘,
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。
@@ -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 颜色与下方 selectDepthTextureTarget(深度)必须同为硬边缘,
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),说明 renderAoDepthPass 没把深度写进 baseDepthTexture;
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),说明 renderAoDepthPass 没把深度写进 baseDepthTexture;
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),说明 renderAoDepthPass 没把深度写进 baseDepthTexture;
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 深度没写进(renderAoDepthPass 失效),但选区深度正常;
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 深度没写进(renderAoDepthPass 失效),但选区深度正常;
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 深度没写进(renderAoDepthPass 失效),但选区深度正常;
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
- * 红色 = 该像素上的表面被 renderAoDepthPass 排除(sprite/线条/点、userData.aoTransparent、
7
- * 标了 userData.aoFloor 的地板 Ground1 等)→ **它写不进深度图,永远挡不住任何后处理**。
6
+ * 红色 = 该像素上的表面被 renderVisibleDepthPass 排除(sprite/线条/点、userData.aoTransparent)
7
+ * → **它写不进深度图,永远挡不住任何后处理**。
8
+ * ⚠️ 地板 Ground1 不在此列:2026-10-11 皇上旨「物体的深度都要进深度图」,原 aoFloor 排除特例
9
+ * 已整条拆除,地板现在是正常写深度的实心面(该像素应显示为灰、不是红)。
8
10
  *
9
- * 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被设计成可透视;
10
- * 把该对象的 userData.aoTransparent 去掉 / 不要标 aoFloor,即可让它参与遮挡。
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
- * 红色 = 该像素上的表面被 renderAoDepthPass 排除(sprite/线条/点、userData.aoTransparent、
7
- * 标了 userData.aoFloor 的地板 Ground1 等)→ **它写不进深度图,永远挡不住任何后处理**。
6
+ * 红色 = 该像素上的表面被 renderVisibleDepthPass 排除(sprite/线条/点、userData.aoTransparent)
7
+ * → **它写不进深度图,永远挡不住任何后处理**。
8
+ * ⚠️ 地板 Ground1 不在此列:2026-10-11 皇上旨「物体的深度都要进深度图」,原 aoFloor 排除特例
9
+ * 已整条拆除,地板现在是正常写深度的实心面(该像素应显示为灰、不是红)。
8
10
  *
9
- * 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被设计成可透视;
10
- * 把该对象的 userData.aoTransparent 去掉 / 不要标 aoFloor,即可让它参与遮挡。
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
- * 红色 = 该像素上的表面被 renderAoDepthPass 排除(sprite/线条/点、userData.aoTransparent、
8
- * 标了 userData.aoFloor 的地板 Ground1 等)→ **它写不进深度图,永远挡不住任何后处理**。
7
+ * 红色 = 该像素上的表面被 renderVisibleDepthPass 排除(sprite/线条/点、userData.aoTransparent)
8
+ * → **它写不进深度图,永远挡不住任何后处理**。
9
+ * ⚠️ 地板 Ground1 不在此列:2026-10-11 皇上旨「物体的深度都要进深度图」,原 aoFloor 排除特例
10
+ * 已整条拆除,地板现在是正常写深度的实心面(该像素应显示为灰、不是红)。
9
11
  *
10
- * 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被设计成可透视;
11
- * 把该对象的 userData.aoTransparent 去掉 / 不要标 aoFloor,即可让它参与遮挡。
12
+ * 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被标记成可透视;
13
+ * 把该对象的 userData.aoTransparent 去掉即可让它参与遮挡。
12
14
  */
13
15
  const debugExcludedShader = new ShaderMaterial({
14
16
  uniforms: {