s3m-three 0.4.24 → 0.4.26
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/dist/browser/assets/{s3mWorker-DvAUA8NJ.js → s3mWorker-DHOVIrAU.js} +1 -1
- package/dist/browser/s3m-three.iife.ext-three.js +107 -36
- package/dist/browser/s3m-three.iife.js +107 -36
- package/dist/core/CustomAttributes.d.ts +7 -0
- package/dist/core/CustomAttributes.d.ts.map +1 -0
- package/dist/core/CustomAttributes.js +48 -0
- package/dist/core/CustomAttributes.js.map +1 -0
- package/dist/core/DXTTextureDecode.d.ts +5 -2
- package/dist/core/DXTTextureDecode.d.ts.map +1 -1
- package/dist/core/DXTTextureDecode.js +17 -7
- package/dist/core/DXTTextureDecode.js.map +1 -1
- package/dist/core/Draco.d.ts.map +1 -1
- package/dist/core/Draco.js +149 -2
- package/dist/core/Draco.js.map +1 -1
- package/dist/core/MeshOpt.d.ts.map +1 -1
- package/dist/core/MeshOpt.js +2 -0
- package/dist/core/MeshOpt.js.map +1 -1
- package/dist/core/S3M1Parser.d.ts.map +1 -1
- package/dist/core/S3M1Parser.js +114 -27
- package/dist/core/S3M1Parser.js.map +1 -1
- package/dist/core/S3MBParser.d.ts +5 -2
- package/dist/core/S3MBParser.d.ts.map +1 -1
- package/dist/core/S3MBParser.js +27 -12
- package/dist/core/S3MBParser.js.map +1 -1
- package/dist/core/TileGeometry.d.ts +1 -0
- package/dist/core/TileGeometry.d.ts.map +1 -1
- package/dist/core/TileGeometry.js +25 -7
- package/dist/core/TileGeometry.js.map +1 -1
- package/dist/core/types.d.ts +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/render/GeometryBuilder.d.ts.map +1 -1
- package/dist/render/GeometryBuilder.js +36 -2
- package/dist/render/GeometryBuilder.js.map +1 -1
- package/dist/render/MotionBlurPass.d.ts +130 -0
- package/dist/render/MotionBlurPass.d.ts.map +1 -0
- package/dist/render/MotionBlurPass.js +394 -0
- package/dist/render/MotionBlurPass.js.map +1 -0
- package/dist/render/S3MViewer.d.ts +27 -0
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +76 -4
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/viewer/PickService.d.ts +2 -0
- package/dist/render/viewer/PickService.d.ts.map +1 -1
- package/dist/render/viewer/PickService.js +1 -1
- package/dist/render/viewer/PickService.js.map +1 -1
- package/dist/render/viewer/types.d.ts +22 -0
- package/dist/render/viewer/types.d.ts.map +1 -1
- package/dist/render/viewer/types.js.map +1 -1
- package/dist/tileset/S3MTileset.d.ts +19 -0
- package/dist/tileset/S3MTileset.d.ts.map +1 -1
- package/dist/tileset/S3MTileset.js +71 -4
- package/dist/tileset/S3MTileset.js.map +1 -1
- package/dist/worker/S3MWorkerClient.d.ts +1 -1
- package/dist/worker/S3MWorkerClient.d.ts.map +1 -1
- package/dist/worker/S3MWorkerClient.js +2 -2
- package/dist/worker/S3MWorkerClient.js.map +1 -1
- package/dist/worker/s3mWorker.js +792 -636
- package/dist/worker/s3mWorker.js.map +1 -1
- package/docs/API.md +18 -5
- package/docs/FORMAT-NOTES.md +10 -0
- package/package.json +1 -1
- package/src/core/CustomAttributes.ts +53 -0
- package/src/core/DXTTextureDecode.ts +17 -7
- package/src/core/Draco.ts +168 -6
- package/src/core/MeshOpt.ts +2 -0
- package/src/core/S3M1Parser.ts +102 -22
- package/src/core/S3MBParser.ts +33 -14
- package/src/core/TileGeometry.ts +34 -7
- package/src/core/types.ts +1 -0
- package/src/index.ts +4 -2
- package/src/render/GeometryBuilder.ts +37 -2
- package/src/render/MotionBlurPass.ts +453 -0
- package/src/render/S3MViewer.ts +78 -4
- package/src/render/viewer/PickService.ts +1 -1
- package/src/render/viewer/types.ts +22 -0
- package/src/tileset/S3MTileset.ts +74 -3
- package/src/vendor/draco_decoder.module.d.ts +15 -1
- package/src/worker/S3MWorkerClient.ts +7 -2
- package/src/worker/s3mWorker.ts +6 -2
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可选的运动模糊后处理(默认关闭)—— issue #4
|
|
3
|
+
*
|
|
4
|
+
* 动机:低端 / 移动设备 FPS 低,运动物体出现卡顿(judder)与边缘闪烁(shimmer)。
|
|
5
|
+
* 运动模糊本质是「骗眼睛」的特效:把离散帧之间的跳变填成连续模糊,在感知层面
|
|
6
|
+
* 弥补低帧率的不顺滑。它不提升分辨率 / 几何 / 静态画质,只对「正在运动」的画面有效。
|
|
7
|
+
*
|
|
8
|
+
* 两种模式(成本差异大):
|
|
9
|
+
*
|
|
10
|
+
* - `afterimage`(推荐低端机):当前帧 + 上一帧全屏混合,每帧 3 个全屏 pass
|
|
11
|
+
* (场景 → RT、混合 → RT、合成 → 宿主 framebuffer),几乎零边际 GPU 成本。
|
|
12
|
+
* 不是方向感知的:快速平移 / 旋转时像「拖影」而非「方向模糊」,damp 太高会出重影。
|
|
13
|
+
* - `velocity`:相机运动模糊。用「上一帧 MVP ↔ 当前帧 MVP」在 shader 里逐像素反推
|
|
14
|
+
* 裁剪空间速度,沿速度向量 8 tap 采样求平均(方向感知,快速平移是真正的方向拉丝)。
|
|
15
|
+
* 只覆盖相机运动(地图场景的主要运动源),单体动画不产生拖影。
|
|
16
|
+
*
|
|
17
|
+
* 宿主共享上下文下的三条硬约束(与 GpuEdgePass 同一套思路):
|
|
18
|
+
*
|
|
19
|
+
* 1. **本层是画在宿主(MapLibre)framebuffer 上的**,不能整帧后处理宿主画面 ——
|
|
20
|
+
* 场景先进自己的 RT(线性空间,three 往非 XR RT 渲染时不做色调映射 / sRGB 转换,
|
|
21
|
+
* 见 WebGLPrograms 的 outputColorSpace 分支),再用全屏 quad 合成回宿主 framebuffer。
|
|
22
|
+
* 2. **深度不能丢**:直渲时 S3M 几何写宿主深度,后画的宿主图层靠它遮挡。合成 quad
|
|
23
|
+
* 用 `gl_FragDepth` 写回 RT 里记录的深度,遮挡关系与直渲一致;被宿主地形挡住的
|
|
24
|
+
* 像素照样不出现。没有几何的像素(天空)discard,不写深度。
|
|
25
|
+
* 3. **色调映射 / 色彩空间要补**:three 只在渲染到屏幕(target=null)时才对片元做
|
|
26
|
+
* tone mapping 与 linear→sRGB 转换;RT 里存的是线性值,合成 shader 末尾必须
|
|
27
|
+
* `#include <tonemapping_fragment>` + `#include <colorspace_fragment>` 补上,
|
|
28
|
+
* 否则整层会比直渲发暗发灰。
|
|
29
|
+
*
|
|
30
|
+
* 已知限制(有意为之,见 docs/API.md):
|
|
31
|
+
* - 拖影只出现在「当前帧几何覆盖范围内」:合成 quad 依赖本帧深度,快速甩动时
|
|
32
|
+
* 轮廓之外的残影会被丢弃(不写深度就不能保住遮挡正确性)。
|
|
33
|
+
* - 透明混合的顺序语义有细微变化:直渲是「逐片元 tone map 后混合」,这里是
|
|
34
|
+
* 「线性混合后统一 tone map」,半透明重叠区的色值有极小偏差。
|
|
35
|
+
* - RT 用 HalfFloatType(半精度浮点):线性空间的高光 / 自发光不被 clamp 到 [0,1],
|
|
36
|
+
* 代价是三张全屏纹理显存 ×2、带宽 ×2 —— 低端机的取舍见 docs 的性能调优。
|
|
37
|
+
*
|
|
38
|
+
* 只支持 WebGL2(`gl_FragDepth` + `DepthTexture`)。WebGL1 上 `supported()` 返回
|
|
39
|
+
* false,调用方回退直渲路径,行为与不开运动模糊一致。
|
|
40
|
+
*/
|
|
41
|
+
import * as THREE from 'three';
|
|
42
|
+
/** 公共选项(S3MViewerOptions.motionBlur 的形状) */
|
|
43
|
+
export interface MotionBlurOptions {
|
|
44
|
+
/**
|
|
45
|
+
* 模式:`'afterimage'`(帧间混合,便宜,默认)/ `'velocity'`(相机速度方向模糊,贵一点)。
|
|
46
|
+
* 不传整个 `motionBlur` 对象 = 关闭;传了对象但没写 mode = afterimage。
|
|
47
|
+
*/
|
|
48
|
+
mode?: 'afterimage' | 'velocity';
|
|
49
|
+
/**
|
|
50
|
+
* 拖尾长度(仅 afterimage 用):上一帧在结果里的保留比例,0~0.98。
|
|
51
|
+
* `'auto'`(默认)按实时 FPS 收敛 —— 帧率越低拖影越长,公式见 `autoMotionBlurDamp`。
|
|
52
|
+
*/
|
|
53
|
+
damp?: number | 'auto';
|
|
54
|
+
/**
|
|
55
|
+
* 拖影上限(仅 velocity 用):速度向量的最大屏幕偏移,取绘图缓冲宽度的百分比,0~1。
|
|
56
|
+
* 默认 `0.05`(屏宽 5%)—— 瞬移 / 视角跳变时不整屏拉丝。快速甩动想要更长拖尾调大即可。
|
|
57
|
+
*/
|
|
58
|
+
maxOffset?: number;
|
|
59
|
+
}
|
|
60
|
+
/** 归一化后的配置(viewer 内部持有) */
|
|
61
|
+
export interface MotionBlurConfig {
|
|
62
|
+
mode: 'afterimage' | 'velocity';
|
|
63
|
+
damp: number | 'auto';
|
|
64
|
+
maxOffset: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 选项归一化。不传 / null / 非对象 = 关闭(返回 null);传了对象 = 开启:
|
|
68
|
+
* mode 缺省或非法回退 `'afterimage'`;damp 缺省 / NaN = `'auto'`,数值钳到 [0, 0.98];
|
|
69
|
+
* maxOffset 缺省 / NaN = 0.05,数值钳到 [0, 1]。
|
|
70
|
+
* 0.98 封顶是防「永远糊着」——damp 趋近 1 时残影按几何级数衰减,30 帧都散不掉。
|
|
71
|
+
*/
|
|
72
|
+
export declare function normalizeMotionBlur(o: MotionBlurOptions | null | undefined): MotionBlurConfig | null;
|
|
73
|
+
/**
|
|
74
|
+
* FPS 自适应拖尾(issue #4 的低端机专项:damp 不写死)。
|
|
75
|
+
*
|
|
76
|
+
* `damp = 0.55^(fps/60)` 封顶 0.92:
|
|
77
|
+
* - 60fps ≈ 0.55(克制,桌面 / 高刷屏几乎无感);
|
|
78
|
+
* - 30fps ≈ 0.74、15fps ≈ 0.86(帧间隔越长,需要填的时间洞越宽,拖影越长);
|
|
79
|
+
* - 等价于「拖影覆盖的帧数随帧率降低而增长」,这正是低帧率卡顿需要的补偿;
|
|
80
|
+
* - 未知帧率(0 / NaN,启动前几百毫秒)按 60fps 保守取值,避免开局糊脸。
|
|
81
|
+
*/
|
|
82
|
+
export declare function autoMotionBlurDamp(fps: number): number;
|
|
83
|
+
/** 每帧入参:mode/damp 已由 viewer 解析(auto → 数值),mvp 为本帧完整裁剪矩阵 */
|
|
84
|
+
export interface MotionBlurParams {
|
|
85
|
+
mode: 'afterimage' | 'velocity';
|
|
86
|
+
damp: number;
|
|
87
|
+
/** velocity 拖影上限(屏宽百分比,来自归一化后的配置) */
|
|
88
|
+
maxOffset: number;
|
|
89
|
+
/** 本帧 world→clip(viewer 的 _frameMvp,已乘 ENU 矩阵) */
|
|
90
|
+
mvp: THREE.Matrix4;
|
|
91
|
+
/** mvp 的逆(viewer 的 camera.projectionMatrixInverse,每帧已维护) */
|
|
92
|
+
mvpInverse: THREE.Matrix4;
|
|
93
|
+
}
|
|
94
|
+
export declare class MotionBlurPass {
|
|
95
|
+
/** 本帧场景(线性颜色 + 深度纹理,两种模式共用) */
|
|
96
|
+
rtScene: THREE.WebGLRenderTarget | null;
|
|
97
|
+
/** afterimage 的 ping-pong 累积目标:同一张纹理不能同时读写(WebGL 未定义行为) */
|
|
98
|
+
rtPrevRead: THREE.WebGLRenderTarget | null;
|
|
99
|
+
rtPrevWrite: THREE.WebGLRenderTarget | null;
|
|
100
|
+
/** 上一帧的 MVP(velocity 用;首帧 = 当前帧 → 零速度) */
|
|
101
|
+
readonly _prevMvp: THREE.Matrix4;
|
|
102
|
+
/** 上一次 render 的模式:模式切换后累积链作废,afterimage 首帧按 damp=0 重新起步 */
|
|
103
|
+
private _lastMode;
|
|
104
|
+
private _hasPrev;
|
|
105
|
+
private width;
|
|
106
|
+
private height;
|
|
107
|
+
/** afterimage 累积材质(渲染进 RT,无混合、无色彩转换) */
|
|
108
|
+
readonly blendMat: THREE.ShaderMaterial;
|
|
109
|
+
/** 上屏合成材质(premultiplied 混合 + gl_FragDepth + tone map / sRGB 补偿) */
|
|
110
|
+
private readonly compositeMat;
|
|
111
|
+
/** velocity 一步上屏材质(同为 premultiplied + gl_FragDepth) */
|
|
112
|
+
readonly velocityMat: THREE.ShaderMaterial;
|
|
113
|
+
private readonly quadScene;
|
|
114
|
+
private readonly quadCamera;
|
|
115
|
+
constructor();
|
|
116
|
+
/** gl_FragDepth 与 DepthTexture 都是 WebGL2 核心特性,WebGL1 直接不参与 */
|
|
117
|
+
supported(renderer: THREE.WebGLRenderer): boolean;
|
|
118
|
+
private ensureSceneTarget;
|
|
119
|
+
/** afterimage 才需要累积 RT;velocity 用不到就不建(省两份全屏 RGBA) */
|
|
120
|
+
private ensurePrevTargets;
|
|
121
|
+
private setQuadMaterial;
|
|
122
|
+
/**
|
|
123
|
+
* 渲一帧。调用方保证:场景本帧还没画过(本 pass 接管「场景 → 屏幕」这一步),
|
|
124
|
+
* 且 supported() 为 true。帧末 prevMvp 滚动为本帧 mvp。
|
|
125
|
+
*/
|
|
126
|
+
render(renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.Camera, width: number, height: number, params: MotionBlurParams): void;
|
|
127
|
+
private disposeTargets;
|
|
128
|
+
dispose(): void;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=MotionBlurPass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MotionBlurPass.d.ts","sourceRoot":"","sources":["../../src/render/MotionBlurPass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAapG;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;IACnB,4DAA4D;IAC5D,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;CAC3B;AA0FD,qBAAa,cAAc;IACzB,+BAA+B;IAC/B,OAAO,EAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAQ;IAC/C,2DAA2D;IAC3D,UAAU,EAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAQ;IAClD,WAAW,EAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAQ;IACnD,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,gBAAuB;IACxC,2DAA2D;IAC3D,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IAEnB,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC;IACxC,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;;IAiE/E,8DAA8D;IAC9D,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO;IAIjD,OAAO,CAAC,iBAAiB;IAuBzB,sDAAsD;IACtD,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,eAAe;IAKvB;;;OAGG;IACH,MAAM,CACJ,QAAQ,EAAE,KAAK,CAAC,aAAa,EAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI;IAoEP,OAAO,CAAC,cAAc;IAetB,OAAO,IAAI,IAAI;CAUhB"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可选的运动模糊后处理(默认关闭)—— issue #4
|
|
3
|
+
*
|
|
4
|
+
* 动机:低端 / 移动设备 FPS 低,运动物体出现卡顿(judder)与边缘闪烁(shimmer)。
|
|
5
|
+
* 运动模糊本质是「骗眼睛」的特效:把离散帧之间的跳变填成连续模糊,在感知层面
|
|
6
|
+
* 弥补低帧率的不顺滑。它不提升分辨率 / 几何 / 静态画质,只对「正在运动」的画面有效。
|
|
7
|
+
*
|
|
8
|
+
* 两种模式(成本差异大):
|
|
9
|
+
*
|
|
10
|
+
* - `afterimage`(推荐低端机):当前帧 + 上一帧全屏混合,每帧 3 个全屏 pass
|
|
11
|
+
* (场景 → RT、混合 → RT、合成 → 宿主 framebuffer),几乎零边际 GPU 成本。
|
|
12
|
+
* 不是方向感知的:快速平移 / 旋转时像「拖影」而非「方向模糊」,damp 太高会出重影。
|
|
13
|
+
* - `velocity`:相机运动模糊。用「上一帧 MVP ↔ 当前帧 MVP」在 shader 里逐像素反推
|
|
14
|
+
* 裁剪空间速度,沿速度向量 8 tap 采样求平均(方向感知,快速平移是真正的方向拉丝)。
|
|
15
|
+
* 只覆盖相机运动(地图场景的主要运动源),单体动画不产生拖影。
|
|
16
|
+
*
|
|
17
|
+
* 宿主共享上下文下的三条硬约束(与 GpuEdgePass 同一套思路):
|
|
18
|
+
*
|
|
19
|
+
* 1. **本层是画在宿主(MapLibre)framebuffer 上的**,不能整帧后处理宿主画面 ——
|
|
20
|
+
* 场景先进自己的 RT(线性空间,three 往非 XR RT 渲染时不做色调映射 / sRGB 转换,
|
|
21
|
+
* 见 WebGLPrograms 的 outputColorSpace 分支),再用全屏 quad 合成回宿主 framebuffer。
|
|
22
|
+
* 2. **深度不能丢**:直渲时 S3M 几何写宿主深度,后画的宿主图层靠它遮挡。合成 quad
|
|
23
|
+
* 用 `gl_FragDepth` 写回 RT 里记录的深度,遮挡关系与直渲一致;被宿主地形挡住的
|
|
24
|
+
* 像素照样不出现。没有几何的像素(天空)discard,不写深度。
|
|
25
|
+
* 3. **色调映射 / 色彩空间要补**:three 只在渲染到屏幕(target=null)时才对片元做
|
|
26
|
+
* tone mapping 与 linear→sRGB 转换;RT 里存的是线性值,合成 shader 末尾必须
|
|
27
|
+
* `#include <tonemapping_fragment>` + `#include <colorspace_fragment>` 补上,
|
|
28
|
+
* 否则整层会比直渲发暗发灰。
|
|
29
|
+
*
|
|
30
|
+
* 已知限制(有意为之,见 docs/API.md):
|
|
31
|
+
* - 拖影只出现在「当前帧几何覆盖范围内」:合成 quad 依赖本帧深度,快速甩动时
|
|
32
|
+
* 轮廓之外的残影会被丢弃(不写深度就不能保住遮挡正确性)。
|
|
33
|
+
* - 透明混合的顺序语义有细微变化:直渲是「逐片元 tone map 后混合」,这里是
|
|
34
|
+
* 「线性混合后统一 tone map」,半透明重叠区的色值有极小偏差。
|
|
35
|
+
* - RT 用 HalfFloatType(半精度浮点):线性空间的高光 / 自发光不被 clamp 到 [0,1],
|
|
36
|
+
* 代价是三张全屏纹理显存 ×2、带宽 ×2 —— 低端机的取舍见 docs 的性能调优。
|
|
37
|
+
*
|
|
38
|
+
* 只支持 WebGL2(`gl_FragDepth` + `DepthTexture`)。WebGL1 上 `supported()` 返回
|
|
39
|
+
* false,调用方回退直渲路径,行为与不开运动模糊一致。
|
|
40
|
+
*/
|
|
41
|
+
import * as THREE from 'three';
|
|
42
|
+
/**
|
|
43
|
+
* 选项归一化。不传 / null / 非对象 = 关闭(返回 null);传了对象 = 开启:
|
|
44
|
+
* mode 缺省或非法回退 `'afterimage'`;damp 缺省 / NaN = `'auto'`,数值钳到 [0, 0.98];
|
|
45
|
+
* maxOffset 缺省 / NaN = 0.05,数值钳到 [0, 1]。
|
|
46
|
+
* 0.98 封顶是防「永远糊着」——damp 趋近 1 时残影按几何级数衰减,30 帧都散不掉。
|
|
47
|
+
*/
|
|
48
|
+
export function normalizeMotionBlur(o) {
|
|
49
|
+
if (!o || typeof o !== 'object')
|
|
50
|
+
return null;
|
|
51
|
+
const mode = o.mode === 'velocity' ? 'velocity' : 'afterimage';
|
|
52
|
+
let damp = 'auto';
|
|
53
|
+
if (typeof o.damp === 'number' && Number.isFinite(o.damp)) {
|
|
54
|
+
damp = Math.min(0.98, Math.max(0, o.damp));
|
|
55
|
+
}
|
|
56
|
+
// maxOffset 是屏宽百分比:>1 等于不设上限(整屏拉丝),负数无意义
|
|
57
|
+
let maxOffset = 0.05;
|
|
58
|
+
if (typeof o.maxOffset === 'number' && Number.isFinite(o.maxOffset)) {
|
|
59
|
+
maxOffset = Math.min(1, Math.max(0, o.maxOffset));
|
|
60
|
+
}
|
|
61
|
+
return { mode, damp, maxOffset };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* FPS 自适应拖尾(issue #4 的低端机专项:damp 不写死)。
|
|
65
|
+
*
|
|
66
|
+
* `damp = 0.55^(fps/60)` 封顶 0.92:
|
|
67
|
+
* - 60fps ≈ 0.55(克制,桌面 / 高刷屏几乎无感);
|
|
68
|
+
* - 30fps ≈ 0.74、15fps ≈ 0.86(帧间隔越长,需要填的时间洞越宽,拖影越长);
|
|
69
|
+
* - 等价于「拖影覆盖的帧数随帧率降低而增长」,这正是低帧率卡顿需要的补偿;
|
|
70
|
+
* - 未知帧率(0 / NaN,启动前几百毫秒)按 60fps 保守取值,避免开局糊脸。
|
|
71
|
+
*/
|
|
72
|
+
export function autoMotionBlurDamp(fps) {
|
|
73
|
+
const f = Number.isFinite(fps) && fps > 0 ? fps : 60;
|
|
74
|
+
return Math.min(0.92, 0.55 ** (f / 60));
|
|
75
|
+
}
|
|
76
|
+
const QUAD_VERT = /* glsl */ `
|
|
77
|
+
out vec2 vUv;
|
|
78
|
+
void main() {
|
|
79
|
+
vUv = uv;
|
|
80
|
+
// 直接给裁剪空间坐标,不走任何矩阵 —— 全屏 quad 没有相机语义(同 GpuEdgePass)
|
|
81
|
+
gl_Position = vec4( position.xy, 0.0, 1.0 );
|
|
82
|
+
}
|
|
83
|
+
`;
|
|
84
|
+
/** afterimage 累积:new = cur×(1-damp) + prev×damp,premultiplied 颜色直接线性混合 */
|
|
85
|
+
const BLEND_FRAG = /* glsl */ `
|
|
86
|
+
uniform sampler2D tCur;
|
|
87
|
+
uniform sampler2D tPrev;
|
|
88
|
+
uniform float uDamp;
|
|
89
|
+
in vec2 vUv;
|
|
90
|
+
|
|
91
|
+
void main() {
|
|
92
|
+
vec4 cur = texture( tCur, vUv );
|
|
93
|
+
vec4 prev = texture( tPrev, vUv );
|
|
94
|
+
// RT 是线性空间(three 往 RT 渲染不做输出转换),混合本身也不涉及 tone map —— 原样直写
|
|
95
|
+
gl_FragColor = cur * ( 1.0 - uDamp ) + prev * uDamp;
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
98
|
+
/**
|
|
99
|
+
* 上屏合成:把 RT 的线性 premultiplied 结果转回宿主 framebuffer。
|
|
100
|
+
* 色调映射 + linear→sRGB 必须在这里补(three 只对渲染到屏幕的片元做这两步)。
|
|
101
|
+
*/
|
|
102
|
+
const COMPOSITE_FRAG = /* glsl */ `
|
|
103
|
+
uniform sampler2D tSrc;
|
|
104
|
+
uniform sampler2D tDepth;
|
|
105
|
+
in vec2 vUv;
|
|
106
|
+
|
|
107
|
+
void main() {
|
|
108
|
+
float d = texture( tDepth, vUv ).x;
|
|
109
|
+
// 没有几何(天空 / 底图)不画也不写深度:与直渲「这里没画过」完全一致
|
|
110
|
+
if ( d >= 0.999999 ) discard;
|
|
111
|
+
vec4 c = texture( tSrc, vUv );
|
|
112
|
+
if ( c.a <= 0.004 ) discard;
|
|
113
|
+
// 写回本帧几何的深度:后画的宿主图层照旧能被 S3M 建筑挡住
|
|
114
|
+
gl_FragDepth = d;
|
|
115
|
+
gl_FragColor = c;
|
|
116
|
+
#include <tonemapping_fragment>
|
|
117
|
+
#include <colorspace_fragment>
|
|
118
|
+
}
|
|
119
|
+
`;
|
|
120
|
+
/**
|
|
121
|
+
* velocity:用上一帧 MVP 反推每像素裁剪空间速度,沿速度 8 tap 采样求平均。
|
|
122
|
+
* 速度是相机运动的(地图场景的主要运动源);单体动画不在其内。
|
|
123
|
+
*/
|
|
124
|
+
const VELOCITY_FRAG = /* glsl */ `
|
|
125
|
+
uniform sampler2D tCur;
|
|
126
|
+
uniform sampler2D tDepth;
|
|
127
|
+
uniform mat4 uCurInv;
|
|
128
|
+
uniform mat4 uPrevMvp;
|
|
129
|
+
uniform float uMaxOffset;
|
|
130
|
+
in vec2 vUv;
|
|
131
|
+
|
|
132
|
+
void main() {
|
|
133
|
+
float d = texture( tDepth, vUv ).x;
|
|
134
|
+
if ( d >= 0.999999 ) discard;
|
|
135
|
+
|
|
136
|
+
// ndc → 上一帧 ndc:相机没动 → 速度为 0;快速平移 → 沿运动方向拉丝
|
|
137
|
+
vec4 ray = uCurInv * vec4( vUv * 2.0 - 1.0, d * 2.0 - 1.0, 1.0 );
|
|
138
|
+
vec4 prevClip = uPrevMvp * ray;
|
|
139
|
+
vec2 prevUv = ( prevClip.xy / prevClip.w ) * 0.5 + 0.5;
|
|
140
|
+
vec2 vel = prevUv - vUv;
|
|
141
|
+
// 拖影上限(屏幕宽度的百分比):瞬移 / 视角跳变时不整屏拉丝
|
|
142
|
+
float len = length( vel );
|
|
143
|
+
if ( len > uMaxOffset ) vel *= uMaxOffset / len;
|
|
144
|
+
|
|
145
|
+
// premultiplied 颜色的平均仍是 premultiplied —— alpha 通道一起被平均
|
|
146
|
+
vec4 acc = vec4( 0.0 );
|
|
147
|
+
for ( int i = 0; i < 8; i++ ) {
|
|
148
|
+
float t = ( float( i ) + 0.5 ) / 8.0 - 0.5;
|
|
149
|
+
acc += texture( tCur, vUv + vel * t );
|
|
150
|
+
}
|
|
151
|
+
acc /= 8.0;
|
|
152
|
+
if ( acc.a <= 0.004 ) discard;
|
|
153
|
+
|
|
154
|
+
gl_FragDepth = d;
|
|
155
|
+
gl_FragColor = acc;
|
|
156
|
+
#include <tonemapping_fragment>
|
|
157
|
+
#include <colorspace_fragment>
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
export class MotionBlurPass {
|
|
161
|
+
/** 本帧场景(线性颜色 + 深度纹理,两种模式共用) */
|
|
162
|
+
rtScene = null;
|
|
163
|
+
/** afterimage 的 ping-pong 累积目标:同一张纹理不能同时读写(WebGL 未定义行为) */
|
|
164
|
+
rtPrevRead = null;
|
|
165
|
+
rtPrevWrite = null;
|
|
166
|
+
/** 上一帧的 MVP(velocity 用;首帧 = 当前帧 → 零速度) */
|
|
167
|
+
_prevMvp = new THREE.Matrix4();
|
|
168
|
+
/** 上一次 render 的模式:模式切换后累积链作废,afterimage 首帧按 damp=0 重新起步 */
|
|
169
|
+
_lastMode = null;
|
|
170
|
+
_hasPrev = false;
|
|
171
|
+
width = 0;
|
|
172
|
+
height = 0;
|
|
173
|
+
/** afterimage 累积材质(渲染进 RT,无混合、无色彩转换) */
|
|
174
|
+
blendMat;
|
|
175
|
+
/** 上屏合成材质(premultiplied 混合 + gl_FragDepth + tone map / sRGB 补偿) */
|
|
176
|
+
compositeMat;
|
|
177
|
+
/** velocity 一步上屏材质(同为 premultiplied + gl_FragDepth) */
|
|
178
|
+
velocityMat;
|
|
179
|
+
quadScene = new THREE.Scene();
|
|
180
|
+
quadCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
|
|
181
|
+
constructor() {
|
|
182
|
+
this.blendMat = new THREE.ShaderMaterial({
|
|
183
|
+
glslVersion: THREE.GLSL3,
|
|
184
|
+
uniforms: {
|
|
185
|
+
tCur: { value: null },
|
|
186
|
+
tPrev: { value: null },
|
|
187
|
+
uDamp: { value: 0.55 },
|
|
188
|
+
},
|
|
189
|
+
vertexShader: QUAD_VERT,
|
|
190
|
+
fragmentShader: BLEND_FRAG,
|
|
191
|
+
// 直写累积 RT:混合发生在 shader 里,不能让 fixed-function blending 再叠一次
|
|
192
|
+
blending: THREE.NoBlending,
|
|
193
|
+
depthTest: false,
|
|
194
|
+
depthWrite: false,
|
|
195
|
+
side: THREE.DoubleSide,
|
|
196
|
+
});
|
|
197
|
+
this.compositeMat = new THREE.ShaderMaterial({
|
|
198
|
+
glslVersion: THREE.GLSL3,
|
|
199
|
+
uniforms: {
|
|
200
|
+
tSrc: { value: null },
|
|
201
|
+
tDepth: { value: null },
|
|
202
|
+
},
|
|
203
|
+
vertexShader: QUAD_VERT,
|
|
204
|
+
fragmentShader: COMPOSITE_FRAG,
|
|
205
|
+
transparent: true,
|
|
206
|
+
// RT 里是 premultiplied 颜色(场景以 NormalBlending 渲进透明底必然如此)
|
|
207
|
+
blending: THREE.CustomBlending,
|
|
208
|
+
blendSrc: THREE.OneFactor,
|
|
209
|
+
blendDst: THREE.OneMinusSrcAlphaFactor,
|
|
210
|
+
blendSrcAlpha: THREE.OneFactor,
|
|
211
|
+
blendDstAlpha: THREE.OneMinusSrcAlphaFactor,
|
|
212
|
+
depthTest: true,
|
|
213
|
+
depthWrite: true,
|
|
214
|
+
side: THREE.DoubleSide,
|
|
215
|
+
});
|
|
216
|
+
this.velocityMat = new THREE.ShaderMaterial({
|
|
217
|
+
glslVersion: THREE.GLSL3,
|
|
218
|
+
uniforms: {
|
|
219
|
+
tCur: { value: null },
|
|
220
|
+
tDepth: { value: null },
|
|
221
|
+
uCurInv: { value: new THREE.Matrix4() },
|
|
222
|
+
uPrevMvp: { value: new THREE.Matrix4() },
|
|
223
|
+
uMaxOffset: { value: 0.05 },
|
|
224
|
+
},
|
|
225
|
+
vertexShader: QUAD_VERT,
|
|
226
|
+
fragmentShader: VELOCITY_FRAG,
|
|
227
|
+
transparent: true,
|
|
228
|
+
blending: THREE.CustomBlending,
|
|
229
|
+
blendSrc: THREE.OneFactor,
|
|
230
|
+
blendDst: THREE.OneMinusSrcAlphaFactor,
|
|
231
|
+
blendSrcAlpha: THREE.OneFactor,
|
|
232
|
+
blendDstAlpha: THREE.OneMinusSrcAlphaFactor,
|
|
233
|
+
depthTest: true,
|
|
234
|
+
depthWrite: true,
|
|
235
|
+
side: THREE.DoubleSide,
|
|
236
|
+
});
|
|
237
|
+
// 一个 quad 换材质复用:blend / composite / velocity 都是全屏、无相机语义
|
|
238
|
+
const quad = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.blendMat);
|
|
239
|
+
quad.frustumCulled = false;
|
|
240
|
+
quad.raycast = () => { };
|
|
241
|
+
this.quadScene.add(quad);
|
|
242
|
+
}
|
|
243
|
+
/** gl_FragDepth 与 DepthTexture 都是 WebGL2 核心特性,WebGL1 直接不参与 */
|
|
244
|
+
supported(renderer) {
|
|
245
|
+
return renderer.capabilities.isWebGL2 === true;
|
|
246
|
+
}
|
|
247
|
+
ensureSceneTarget(width, height) {
|
|
248
|
+
if (this.rtScene && this.width === width && this.height === height)
|
|
249
|
+
return;
|
|
250
|
+
this.disposeTargets();
|
|
251
|
+
const w = Math.max(1, width);
|
|
252
|
+
const h = Math.max(1, height);
|
|
253
|
+
// 场景 RT:颜色 + 深度纹理(深度既用于 velocity 反推,也用于合成时写回 gl_FragDepth)。
|
|
254
|
+
// HalfFloatType 是必须的:RT 里存的是 tone map 之前的线性值,UnsignedByteType 会把
|
|
255
|
+
// 高光 / 自发光(>1)clamp 到 [0,1],合成 tone map 后与直渲有可感知色差;代价是显存 ×2。
|
|
256
|
+
this.rtScene = new THREE.WebGLRenderTarget(w, h, {
|
|
257
|
+
minFilter: THREE.LinearFilter,
|
|
258
|
+
magFilter: THREE.LinearFilter,
|
|
259
|
+
format: THREE.RGBAFormat,
|
|
260
|
+
type: THREE.HalfFloatType,
|
|
261
|
+
depthBuffer: true,
|
|
262
|
+
stencilBuffer: false,
|
|
263
|
+
generateMipmaps: false,
|
|
264
|
+
});
|
|
265
|
+
this.rtScene.texture.generateMipmaps = false;
|
|
266
|
+
this.rtScene.depthTexture = new THREE.DepthTexture(w, h, THREE.UnsignedIntType);
|
|
267
|
+
this.width = w;
|
|
268
|
+
this.height = h;
|
|
269
|
+
}
|
|
270
|
+
/** afterimage 才需要累积 RT;velocity 用不到就不建(省两份全屏 RGBA) */
|
|
271
|
+
ensurePrevTargets(width, height) {
|
|
272
|
+
if (this.rtPrevRead && this.rtPrevWrite)
|
|
273
|
+
return;
|
|
274
|
+
const w = Math.max(1, width);
|
|
275
|
+
const h = Math.max(1, height);
|
|
276
|
+
const mk = () => {
|
|
277
|
+
// WebGL 保证新分配纹理零初始化,配合「首帧 damp=0」不需要显式 clear。
|
|
278
|
+
// 与场景 RT 同为 HalfFloat:累积链的中间值同样在线性空间,clamp 会逐帧劣化高光
|
|
279
|
+
const rt = new THREE.WebGLRenderTarget(w, h, {
|
|
280
|
+
minFilter: THREE.LinearFilter,
|
|
281
|
+
magFilter: THREE.LinearFilter,
|
|
282
|
+
format: THREE.RGBAFormat,
|
|
283
|
+
type: THREE.HalfFloatType,
|
|
284
|
+
depthBuffer: false,
|
|
285
|
+
stencilBuffer: false,
|
|
286
|
+
generateMipmaps: false,
|
|
287
|
+
});
|
|
288
|
+
rt.texture.generateMipmaps = false;
|
|
289
|
+
return rt;
|
|
290
|
+
};
|
|
291
|
+
this.rtPrevRead = mk();
|
|
292
|
+
this.rtPrevWrite = mk();
|
|
293
|
+
}
|
|
294
|
+
setQuadMaterial(mat) {
|
|
295
|
+
const quad = this.quadScene.children[0];
|
|
296
|
+
quad.material = mat;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* 渲一帧。调用方保证:场景本帧还没画过(本 pass 接管「场景 → 屏幕」这一步),
|
|
300
|
+
* 且 supported() 为 true。帧末 prevMvp 滚动为本帧 mvp。
|
|
301
|
+
*/
|
|
302
|
+
render(renderer, scene, camera, width, height, params) {
|
|
303
|
+
if (width <= 0 || height <= 0)
|
|
304
|
+
return;
|
|
305
|
+
this.ensureSceneTarget(width, height);
|
|
306
|
+
const rtScene = this.rtScene;
|
|
307
|
+
if (!rtScene)
|
|
308
|
+
return;
|
|
309
|
+
// ---- 1. 场景 → RT(线性空间,透明底。clear color 状态要还原,宿主没让我们改它) ----
|
|
310
|
+
const prevClearColor = renderer.getClearColor(new THREE.Color());
|
|
311
|
+
const prevClearAlpha = renderer.getClearAlpha();
|
|
312
|
+
renderer.setRenderTarget(rtScene);
|
|
313
|
+
renderer.setViewport(0, 0, width, height);
|
|
314
|
+
renderer.setClearColor(0x000000, 0);
|
|
315
|
+
renderer.clear(true, true, true);
|
|
316
|
+
renderer.render(scene, camera);
|
|
317
|
+
// ---- 2. 模糊 + 上屏 ----
|
|
318
|
+
if (params.mode === 'velocity') {
|
|
319
|
+
// velocity:无需累积,沿速度 8 tap 采样直接上屏
|
|
320
|
+
const u = this.velocityMat.uniforms;
|
|
321
|
+
u.tCur.value = rtScene.texture;
|
|
322
|
+
u.tDepth.value = rtScene.depthTexture;
|
|
323
|
+
u.uCurInv.value.copy(params.mvpInverse);
|
|
324
|
+
// 首帧(或刚从 afterimage 切过来还没 prev)prev = cur → 零速度,纯透传
|
|
325
|
+
u.uPrevMvp.value.copy(this._hasPrev ? this._prevMvp : params.mvp);
|
|
326
|
+
u.uMaxOffset.value = params.maxOffset;
|
|
327
|
+
this.setQuadMaterial(this.velocityMat);
|
|
328
|
+
renderer.setRenderTarget(null);
|
|
329
|
+
renderer.setViewport(0, 0, width, height);
|
|
330
|
+
renderer.resetState();
|
|
331
|
+
renderer.render(this.quadScene, this.quadCamera);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.ensurePrevTargets(width, height);
|
|
335
|
+
if (!this.rtPrevRead || !this.rtPrevWrite)
|
|
336
|
+
return;
|
|
337
|
+
// 累积链刚起步(首帧 / 尺寸重建 / 从 velocity 切回来):damp 按 0,
|
|
338
|
+
// 本帧只写当前帧 —— 旧残影不该从别的模式或上一段会话里冒出来
|
|
339
|
+
const firstAccum = this._lastMode !== 'afterimage';
|
|
340
|
+
const u = this.blendMat.uniforms;
|
|
341
|
+
u.tCur.value = rtScene.texture;
|
|
342
|
+
u.tPrev.value = this.rtPrevRead.texture;
|
|
343
|
+
// damp 由 normalizeMotionBlur 钳过、auto 已由 viewer 解析成数值,这里直传
|
|
344
|
+
u.uDamp.value = firstAccum ? 0 : params.damp;
|
|
345
|
+
this.setQuadMaterial(this.blendMat);
|
|
346
|
+
renderer.setRenderTarget(this.rtPrevWrite);
|
|
347
|
+
renderer.setViewport(0, 0, width, height);
|
|
348
|
+
renderer.render(this.quadScene, this.quadCamera);
|
|
349
|
+
const cu = this.compositeMat.uniforms;
|
|
350
|
+
cu.tSrc.value = this.rtPrevWrite.texture;
|
|
351
|
+
cu.tDepth.value = rtScene.depthTexture;
|
|
352
|
+
this.setQuadMaterial(this.compositeMat);
|
|
353
|
+
renderer.setRenderTarget(null);
|
|
354
|
+
renderer.setViewport(0, 0, width, height);
|
|
355
|
+
renderer.resetState();
|
|
356
|
+
renderer.render(this.quadScene, this.quadCamera);
|
|
357
|
+
// ping-pong:本帧的累积结果成为下一帧的 prev
|
|
358
|
+
const t = this.rtPrevRead;
|
|
359
|
+
this.rtPrevRead = this.rtPrevWrite;
|
|
360
|
+
this.rtPrevWrite = t;
|
|
361
|
+
}
|
|
362
|
+
renderer.setClearColor(prevClearColor, prevClearAlpha);
|
|
363
|
+
// 帧末滚动:下一帧的「上一帧」就是本帧
|
|
364
|
+
this._prevMvp.copy(params.mvp);
|
|
365
|
+
this._hasPrev = true;
|
|
366
|
+
this._lastMode = params.mode;
|
|
367
|
+
}
|
|
368
|
+
disposeTargets() {
|
|
369
|
+
for (const rt of [this.rtScene, this.rtPrevRead, this.rtPrevWrite]) {
|
|
370
|
+
if (!rt)
|
|
371
|
+
continue;
|
|
372
|
+
rt.depthTexture?.dispose();
|
|
373
|
+
rt.dispose();
|
|
374
|
+
}
|
|
375
|
+
this.rtScene = null;
|
|
376
|
+
this.rtPrevRead = null;
|
|
377
|
+
this.rtPrevWrite = null;
|
|
378
|
+
this.width = 0;
|
|
379
|
+
this.height = 0;
|
|
380
|
+
this._hasPrev = false;
|
|
381
|
+
this._lastMode = null;
|
|
382
|
+
}
|
|
383
|
+
dispose() {
|
|
384
|
+
this.disposeTargets();
|
|
385
|
+
this.blendMat.dispose();
|
|
386
|
+
this.compositeMat.dispose();
|
|
387
|
+
this.velocityMat.dispose();
|
|
388
|
+
this.quadScene.traverse((o) => {
|
|
389
|
+
const mesh = o;
|
|
390
|
+
mesh.geometry?.dispose?.();
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=MotionBlurPass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MotionBlurPass.js","sourceRoot":"","sources":["../../src/render/MotionBlurPass.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ import type { LightOptions, S3MViewerOptions, PickResult, PickableRef, PathFollo
|
|
|
27
27
|
import type { OutlineMaterial, StyleMode, S3MStyle, EdgeModes, EdgesOption, MaterialQuality, ColorPipeline } from './StyleMaterial.js';
|
|
28
28
|
import { Picker } from './Picker.js';
|
|
29
29
|
import { GpuEdgePass } from './GpuEdgePass.js';
|
|
30
|
+
import type { MotionBlurOptions } from './MotionBlurPass.js';
|
|
30
31
|
import { Animator } from '../anim/Animator.js';
|
|
31
32
|
import type { ClipOptions, LineOfSightOptions, LineOfSightResult, LngLatAlt, MeasureResult, SkylineResult, Vec3, ViewshedResult } from '../analysis/index.js';
|
|
32
33
|
import type { TransitionOptions } from '../anim/Animator.js';
|
|
@@ -47,6 +48,7 @@ export type { FeatureStyle, ColorByFieldOptions, ThematicLegendEntry, ThematicRe
|
|
|
47
48
|
export type { GroundMode, GroundOptions, } from './GroundManager.js';
|
|
48
49
|
export { GroundManager, DatasetManager, FeatureStyleManager };
|
|
49
50
|
export type { PickResult, LightOptions, S3MViewerOptions, PickableRef, PathFollowOptions, } from './viewer/types.js';
|
|
51
|
+
export type { MotionBlurOptions, MotionBlurConfig } from './MotionBlurPass.js';
|
|
50
52
|
/** 单体沿折线运动的参数 */
|
|
51
53
|
export declare class S3MViewer {
|
|
52
54
|
readonly options: S3MViewerOptions;
|
|
@@ -184,6 +186,12 @@ export declare class S3MViewer {
|
|
|
184
186
|
private readonly _unsupported;
|
|
185
187
|
/** LOD 判定屏幕高度的 DPR 上限。Infinity = 不截断(默认,行为同旧版) */
|
|
186
188
|
private _lodPixelRatioCap;
|
|
189
|
+
/**
|
|
190
|
+
* 运动模糊配置(默认 null = 关闭)。归一化后的形状见 `normalizeMotionBlur`;
|
|
191
|
+
* pass 延迟到首帧才建(构造期 renderer 都还没有)。
|
|
192
|
+
*/
|
|
193
|
+
private _motionBlurCfg;
|
|
194
|
+
private _motionBlur;
|
|
187
195
|
/** 宿主请求重画(MapLibre 传 triggerRepaint,纯 three 宿主传自己的渲染循环) */
|
|
188
196
|
private _requestRepaint;
|
|
189
197
|
triggerRepaint(): void;
|
|
@@ -536,6 +544,16 @@ export declare class S3MViewer {
|
|
|
536
544
|
setMaterialQuality(q: MaterialQuality): void;
|
|
537
545
|
/** 当前材质质感档位(本图层指定了就用本图层的,否则是模块级默认) */
|
|
538
546
|
get materialQuality(): MaterialQuality;
|
|
547
|
+
/**
|
|
548
|
+
* 运行时开关运动模糊后处理;`null` / 非法入参 = 关闭并立即释放 RT 显存。
|
|
549
|
+
*
|
|
550
|
+
* 这是纯视觉补偿(见 `motionBlur` 选项),对渲染管线唯一的结构性影响是开启期间
|
|
551
|
+
* 「场景 → 屏幕」改走 RT 中转(合成 quad 会补回色调映射 / sRGB / 深度)。
|
|
552
|
+
* WebGL1 上开了也自动回退直渲。`damp: 'auto'` 每帧按实时 FPS 重新解析。
|
|
553
|
+
*/
|
|
554
|
+
setMotionBlur(cfg: MotionBlurOptions | null | undefined): void;
|
|
555
|
+
/** 当前运动模糊配置(归一化后的副本);null = 关闭 */
|
|
556
|
+
get motionBlur(): MotionBlurOptions | null;
|
|
539
557
|
/**
|
|
540
558
|
* 运行时切换**本图层**的颜色管线(`'linear'` | `'direct'`)。
|
|
541
559
|
*
|
|
@@ -848,6 +866,15 @@ export declare class S3MViewer {
|
|
|
848
866
|
*/
|
|
849
867
|
/** @internal 泼溅按视深重排,见 viewer/SplatLayer.ts */
|
|
850
868
|
_sortSplats(): void;
|
|
869
|
+
/**
|
|
870
|
+
* 运动模糊路径(`_motionBlurCfg` 非空时接管「场景 → 屏幕」)。
|
|
871
|
+
*
|
|
872
|
+
* 返回 false = 不能用(WebGL1 / 尺寸非法),调用方回退直渲 —— 配置保留不丢,
|
|
873
|
+
* 上下文恢复成 WebGL2 后下一帧自动生效。
|
|
874
|
+
* `damp: 'auto'` 在这里按实时 FPS 解析(fps 为 0 的启动阶段按 60fps 保守取值),
|
|
875
|
+
* `maxOffset` 已在 `normalizeMotionBlur` 里归一化(默认 0.05,屏宽百分比)。
|
|
876
|
+
*/
|
|
877
|
+
private _renderMotionBlur;
|
|
851
878
|
/**
|
|
852
879
|
* 渲染一帧。所有宿主相关量都由调用方喂进来,viewer 不碰任何地图 API:
|
|
853
880
|
*
|