three-base 2.0.169 → 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 +16 -6
- package/MktMesh/MktMesh.ts +16 -6
- 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/ThreeBase.js
CHANGED
|
@@ -18,7 +18,7 @@ import frosted_glass_pass from "./pass/frosted_glass_pass";
|
|
|
18
18
|
import { flushLensflareOverlays } from "./lensflare/LensFlare";
|
|
19
19
|
import glow_pass from "./pass/glow_pass";
|
|
20
20
|
import stroke_pass from "./pass/stroke_pass";
|
|
21
|
-
import ssao_pass, {
|
|
21
|
+
import ssao_pass, { renderVisibleDepthPass, renderExcludedMaskPass } from "./pass/ssao_pass";
|
|
22
22
|
import screenBloomPass from "./pass/screen_bloom_pass";
|
|
23
23
|
import copyShader from "./shaders/copyShader";
|
|
24
24
|
import { baseTextureToRenderShader } from "./shaders/baseTextureToRenderShader";
|
|
@@ -260,12 +260,13 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
260
260
|
stencilBuffer: false,
|
|
261
261
|
depthTexture: this.baseDepthTexture,
|
|
262
262
|
});
|
|
263
|
-
// AO
|
|
264
|
-
// 法线 pass(renderAoNormalPass,
|
|
265
|
-
// (2026-09-14 优化:删掉原 ssao_pass
|
|
266
|
-
// SSAO 的 GTAO
|
|
267
|
-
//
|
|
268
|
-
//
|
|
263
|
+
// AO 深度纹理:**不再单独渲染一遍** —— 它挂在 normalRenderTarget 上当 depth attachment,
|
|
264
|
+
// 法线 pass(renderAoNormalPass,excludeTransparent=true)渲染时深度由光栅器顺带写入,白拿一张。
|
|
265
|
+
// (2026-09-14 优化:删掉原 ssao_pass 内那次独立的含地板深度 pass,每帧省一次全场景遍历。)
|
|
266
|
+
// SSAO 的 GTAO 采样它(与法线同源);合成时再与 depthRenderTarget(可见深度 = 各物体自身材质渲染)
|
|
267
|
+
// 比对:AO 侧更近说明那像素记到屏幕上不可见的面(抠图空隙 / 单面墙背面)→ 作废该像素 AO。
|
|
268
|
+
// ⚠️ 2026-10-11:地板(Ground1)现在两张图都写(旧的 aoFloor 排除特例已整条拆除),
|
|
269
|
+
// 见 three-base/pass/ssao_pass.ts 文件头与复合守卫说明。
|
|
269
270
|
aoDepthTexture = (() => {
|
|
270
271
|
const t = new DepthTexture(4096, 4096);
|
|
271
272
|
t.format = DepthFormat;
|
|
@@ -276,8 +277,8 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
276
277
|
/**
|
|
277
278
|
* 调试用:深度预览模式。由面板「深度调试」切换,便于逐一看各深度图排查"深度测试全部失效"根因。
|
|
278
279
|
* - "none" :正常渲染(默认)
|
|
279
|
-
* - "global"
|
|
280
|
-
* - "ao" :仅预览 AO 深度图(aoDepthTexture = 法线 pass
|
|
280
|
+
* - "global" :仅预览可见深度图(baseDepthTexture,含地板)。全白=深度为空→renderVisibleDepthPass 没写进深度。
|
|
281
|
+
* - "ao" :仅预览 AO 深度图(aoDepthTexture = 法线 pass 顺带写入)。用于确认深度管线本身是否工作。
|
|
281
282
|
* - "compare" :R=全局 base 深度,G=最近一次 glow/stroke 选区 select 深度。两路任一全白即该侧写入失败。
|
|
282
283
|
* - "excluded":深度图灰度 + 「被排除出深度图的面」叠红(红=该面写不进深度,永远挡不住后处理)。
|
|
283
284
|
* 物体区域(G 暗)若 B 全黑 → 判定从不触发;再看该区 R/G 谁大即可定位是谁缺深度。
|
|
@@ -285,20 +286,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
285
286
|
* 通用控制台入口:任意页面都可 `window.__TB_DEBUG_DEPTH = "judge"`(优先级高于面板属性)。
|
|
286
287
|
*/
|
|
287
288
|
debugDepthPreview = "none";
|
|
288
|
-
/**
|
|
289
|
-
* 可见深度图是否包含「标了 userData.aoFloor 的地板」(如 Ground1)。
|
|
290
|
-
*
|
|
291
|
-
* 默认 false —— 原设计:地板可透视,透过地板看到的物体照常显示(不被地板挡住)。
|
|
292
|
-
* 置 true 后地板会写进 baseDepthTexture,**被地板挡住的描边/辉光/毛玻璃/覆盖色会被正确遮挡**。
|
|
293
|
-
* 排查"怎么都挡不住"时先开这个试一下:若开了就正常,说明挡你的正是可透视地板。
|
|
294
|
-
*/
|
|
295
|
-
get baseDepthIncludeFloor() {
|
|
296
|
-
return visibleDepthOptions.includeFloor;
|
|
297
|
-
}
|
|
298
|
-
set baseDepthIncludeFloor(v) {
|
|
299
|
-
visibleDepthOptions.includeFloor = v;
|
|
300
|
-
this.needRender = true;
|
|
301
|
-
}
|
|
302
289
|
// 法线专用渲染目标(无 MSAA,存储视图空间法线,供 GTAO 风格 SSAO 使用真实法线)
|
|
303
290
|
normalRenderTarget = new WebGLRenderTarget(128, 128, {
|
|
304
291
|
minFilter: LinearFilter,
|
|
@@ -1019,10 +1006,11 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
1019
1006
|
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
1020
1007
|
this.renderer.clear();
|
|
1021
1008
|
this.renderer.render(this.scene, camera);
|
|
1022
|
-
//
|
|
1009
|
+
// 可见深度 pass:用各物体自身材质渲染(含地板;sprite/线条/点与显式 aoTransparent 面除外),
|
|
1010
|
+
// 产出 baseDepthTexture 供描边/发光/覆盖/磨砂做遮挡判定。
|
|
1023
1011
|
// 必须在 base render 之后、所有依赖深度的特效(描边/发光/覆盖/磨砂)之前更新,
|
|
1024
1012
|
// 否则这些特效会用到上一帧旧深度 → 遮挡判定错乱。法线 pass 已收进 ssao_pass 内部。
|
|
1025
|
-
|
|
1013
|
+
renderVisibleDepthPass(this.renderer, camera, this.scene, this.depthRenderTarget);
|
|
1026
1014
|
// 切回 baseRenderTarget,后处理 pass 需要把效果叠加到颜色渲染目标上
|
|
1027
1015
|
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
1028
1016
|
// 效果 mask 灰度图尺寸 = effectiveRatio × resolution,与 baseRenderTarget / baseDepthTexture 同倍率,
|
|
@@ -1088,7 +1076,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
1088
1076
|
// 分辨率按实际帧缓冲像素(已乘 dpr)设置,修复高分屏下 FXAA 采样比例偏大失效的问题。
|
|
1089
1077
|
// ⚠️ 深度调试预览(面板「深度调试」切换,定位"深度测试全部失效"根因):
|
|
1090
1078
|
// 旧控制台入口 `window.__BASE_DEPTH_VIS = true` 仍可用,等价于切到 "global"。
|
|
1091
|
-
// global → baseDepthTexture 灰度。全白=深度为空(
|
|
1079
|
+
// global → baseDepthTexture 灰度。全白=深度为空(renderVisibleDepthPass 没写进)→后处理一律显示在前;有灰阶=深度正常,问题在比对侧。
|
|
1092
1080
|
// ao → aoDepthTexture 灰度(含地板)。确认深度管线本身是否工作(GTAO 是否拿到正确深度)。
|
|
1093
1081
|
// compare → R=全局 base 深度,G=最近一次 glow/stroke 选区的 select 深度。两路任一全白即该侧写入失败。
|
|
1094
1082
|
// judge → R=base 原始深度、G=select 原始深度、B=判定结果(1=判为被遮挡应 discard)。
|
package/ThreeBase.ts
CHANGED
|
@@ -19,7 +19,7 @@ import frosted_glass_pass from "./pass/frosted_glass_pass";
|
|
|
19
19
|
import { flushLensflareOverlays } from "./lensflare/LensFlare";
|
|
20
20
|
import glow_pass from "./pass/glow_pass";
|
|
21
21
|
import stroke_pass from "./pass/stroke_pass";
|
|
22
|
-
import ssao_pass, {
|
|
22
|
+
import ssao_pass, { renderVisibleDepthPass, renderExcludedMaskPass } from "./pass/ssao_pass";
|
|
23
23
|
import screenBloomPass from "./pass/screen_bloom_pass";
|
|
24
24
|
import copyShader from "./shaders/copyShader";
|
|
25
25
|
import { baseTextureToRenderShader } from "./shaders/baseTextureToRenderShader";
|
|
@@ -321,12 +321,13 @@ export default class ThreeBase extends EventDispatcher<ThreeBaseEventTypeMap> {
|
|
|
321
321
|
stencilBuffer: false,
|
|
322
322
|
depthTexture: this.baseDepthTexture,
|
|
323
323
|
});
|
|
324
|
-
// AO
|
|
325
|
-
// 法线 pass(renderAoNormalPass,
|
|
326
|
-
// (2026-09-14 优化:删掉原 ssao_pass
|
|
327
|
-
// SSAO 的 GTAO
|
|
328
|
-
//
|
|
329
|
-
//
|
|
324
|
+
// AO 深度纹理:**不再单独渲染一遍** —— 它挂在 normalRenderTarget 上当 depth attachment,
|
|
325
|
+
// 法线 pass(renderAoNormalPass,excludeTransparent=true)渲染时深度由光栅器顺带写入,白拿一张。
|
|
326
|
+
// (2026-09-14 优化:删掉原 ssao_pass 内那次独立的含地板深度 pass,每帧省一次全场景遍历。)
|
|
327
|
+
// SSAO 的 GTAO 采样它(与法线同源);合成时再与 depthRenderTarget(可见深度 = 各物体自身材质渲染)
|
|
328
|
+
// 比对:AO 侧更近说明那像素记到屏幕上不可见的面(抠图空隙 / 单面墙背面)→ 作废该像素 AO。
|
|
329
|
+
// ⚠️ 2026-10-11:地板(Ground1)现在两张图都写(旧的 aoFloor 排除特例已整条拆除),
|
|
330
|
+
// 见 three-base/pass/ssao_pass.ts 文件头与复合守卫说明。
|
|
330
331
|
aoDepthTexture: DepthTexture = (() => {
|
|
331
332
|
const t = new DepthTexture(4096, 4096);
|
|
332
333
|
t.format = DepthFormat;
|
|
@@ -337,8 +338,8 @@ export default class ThreeBase extends EventDispatcher<ThreeBaseEventTypeMap> {
|
|
|
337
338
|
/**
|
|
338
339
|
* 调试用:深度预览模式。由面板「深度调试」切换,便于逐一看各深度图排查"深度测试全部失效"根因。
|
|
339
340
|
* - "none" :正常渲染(默认)
|
|
340
|
-
* - "global"
|
|
341
|
-
* - "ao" :仅预览 AO 深度图(aoDepthTexture = 法线 pass
|
|
341
|
+
* - "global" :仅预览可见深度图(baseDepthTexture,含地板)。全白=深度为空→renderVisibleDepthPass 没写进深度。
|
|
342
|
+
* - "ao" :仅预览 AO 深度图(aoDepthTexture = 法线 pass 顺带写入)。用于确认深度管线本身是否工作。
|
|
342
343
|
* - "compare" :R=全局 base 深度,G=最近一次 glow/stroke 选区 select 深度。两路任一全白即该侧写入失败。
|
|
343
344
|
* - "excluded":深度图灰度 + 「被排除出深度图的面」叠红(红=该面写不进深度,永远挡不住后处理)。
|
|
344
345
|
* 物体区域(G 暗)若 B 全黑 → 判定从不触发;再看该区 R/G 谁大即可定位是谁缺深度。
|
|
@@ -347,20 +348,6 @@ export default class ThreeBase extends EventDispatcher<ThreeBaseEventTypeMap> {
|
|
|
347
348
|
*/
|
|
348
349
|
public debugDepthPreview: DebugDepthMode = "none";
|
|
349
350
|
|
|
350
|
-
/**
|
|
351
|
-
* 可见深度图是否包含「标了 userData.aoFloor 的地板」(如 Ground1)。
|
|
352
|
-
*
|
|
353
|
-
* 默认 false —— 原设计:地板可透视,透过地板看到的物体照常显示(不被地板挡住)。
|
|
354
|
-
* 置 true 后地板会写进 baseDepthTexture,**被地板挡住的描边/辉光/毛玻璃/覆盖色会被正确遮挡**。
|
|
355
|
-
* 排查"怎么都挡不住"时先开这个试一下:若开了就正常,说明挡你的正是可透视地板。
|
|
356
|
-
*/
|
|
357
|
-
public get baseDepthIncludeFloor(): boolean {
|
|
358
|
-
return visibleDepthOptions.includeFloor;
|
|
359
|
-
}
|
|
360
|
-
public set baseDepthIncludeFloor(v: boolean) {
|
|
361
|
-
visibleDepthOptions.includeFloor = v;
|
|
362
|
-
this.needRender = true;
|
|
363
|
-
}
|
|
364
351
|
// 法线专用渲染目标(无 MSAA,存储视图空间法线,供 GTAO 风格 SSAO 使用真实法线)
|
|
365
352
|
normalRenderTarget: WebGLRenderTarget<Texture> = new WebGLRenderTarget(128, 128, {
|
|
366
353
|
minFilter: LinearFilter,
|
|
@@ -1131,10 +1118,11 @@ export default class ThreeBase extends EventDispatcher<ThreeBaseEventTypeMap> {
|
|
|
1131
1118
|
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
1132
1119
|
this.renderer.clear();
|
|
1133
1120
|
this.renderer.render(this.scene, camera);
|
|
1134
|
-
//
|
|
1121
|
+
// 可见深度 pass:用各物体自身材质渲染(含地板;sprite/线条/点与显式 aoTransparent 面除外),
|
|
1122
|
+
// 产出 baseDepthTexture 供描边/发光/覆盖/磨砂做遮挡判定。
|
|
1135
1123
|
// 必须在 base render 之后、所有依赖深度的特效(描边/发光/覆盖/磨砂)之前更新,
|
|
1136
1124
|
// 否则这些特效会用到上一帧旧深度 → 遮挡判定错乱。法线 pass 已收进 ssao_pass 内部。
|
|
1137
|
-
|
|
1125
|
+
renderVisibleDepthPass(this.renderer, camera, this.scene, this.depthRenderTarget);
|
|
1138
1126
|
// 切回 baseRenderTarget,后处理 pass 需要把效果叠加到颜色渲染目标上
|
|
1139
1127
|
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
1140
1128
|
// 效果 mask 灰度图尺寸 = effectiveRatio × resolution,与 baseRenderTarget / baseDepthTexture 同倍率,
|
|
@@ -1204,7 +1192,7 @@ export default class ThreeBase extends EventDispatcher<ThreeBaseEventTypeMap> {
|
|
|
1204
1192
|
// 分辨率按实际帧缓冲像素(已乘 dpr)设置,修复高分屏下 FXAA 采样比例偏大失效的问题。
|
|
1205
1193
|
// ⚠️ 深度调试预览(面板「深度调试」切换,定位"深度测试全部失效"根因):
|
|
1206
1194
|
// 旧控制台入口 `window.__BASE_DEPTH_VIS = true` 仍可用,等价于切到 "global"。
|
|
1207
|
-
// global → baseDepthTexture 灰度。全白=深度为空(
|
|
1195
|
+
// global → baseDepthTexture 灰度。全白=深度为空(renderVisibleDepthPass 没写进)→后处理一律显示在前;有灰阶=深度正常,问题在比对侧。
|
|
1208
1196
|
// ao → aoDepthTexture 灰度(含地板)。确认深度管线本身是否工作(GTAO 是否拿到正确深度)。
|
|
1209
1197
|
// compare → R=全局 base 深度,G=最近一次 glow/stroke 选区的 select 深度。两路任一全白即该侧写入失败。
|
|
1210
1198
|
// judge → R=base 原始深度、G=select 原始深度、B=判定结果(1=判为被遮挡应 discard)。
|
package/WaterFlow/WaterFlow.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ import type { BasinConfig, FluidParameters, FluidQuality, ReservoirState, WaterF
|
|
|
26
26
|
* depthMode: 'logarithmic',
|
|
27
27
|
* });
|
|
28
28
|
* // 每帧:先 renderer.setRenderTarget(baseRenderTarget); renderer.render(scene, camera);
|
|
29
|
-
* // 再
|
|
29
|
+
* // 再 renderVisibleDepthPass(renderer, camera, scene, depthRenderTarget); // 写 baseDepthTexture
|
|
30
30
|
* // 然后 water.update(dt, elapsed);
|
|
31
31
|
* // 最后 setRenderTarget(screenRT); fsQuad.render(renderer, pass.material);
|
|
32
32
|
* // 注意:WaterFlow 的 composite 是纯消费 base 纹理的 fsQuad,可直接放进你的链。
|
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
|
|