@d5techs/3dgs-lib 1.0.0
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/README.md +236 -0
- package/dist/3dgs-lib.cjs +12012 -0
- package/dist/3dgs-lib.cjs.map +1 -0
- package/dist/3dgs-lib.js +12012 -0
- package/dist/3dgs-lib.js.map +1 -0
- package/dist/App.d.ts +142 -0
- package/dist/core/BoundingBoxRenderer.d.ts +70 -0
- package/dist/core/Camera.d.ts +38 -0
- package/dist/core/OrbitControls.d.ts +101 -0
- package/dist/core/Renderer.d.ts +69 -0
- package/dist/core/ViewportGizmo.d.ts +83 -0
- package/dist/core/gizmo/ArcShape.d.ts +90 -0
- package/dist/core/gizmo/ArrowShape.d.ts +51 -0
- package/dist/core/gizmo/BoxLineShape.d.ts +47 -0
- package/dist/core/gizmo/PlaneShape.d.ts +48 -0
- package/dist/core/gizmo/Shape.d.ts +117 -0
- package/dist/core/gizmo/SphereShape.d.ts +29 -0
- package/dist/core/gizmo/TransformGizmoV2.d.ts +203 -0
- package/dist/core/gizmo/index.d.ts +14 -0
- package/dist/core/math/Mat4.d.ts +38 -0
- package/dist/core/math/Quat.d.ts +52 -0
- package/dist/core/math/Ray.d.ts +65 -0
- package/dist/core/math/Vec3.d.ts +39 -0
- package/dist/gs/GSSplatRenderer.d.ts +217 -0
- package/dist/gs/GSSplatRendererMobile.d.ts +147 -0
- package/dist/gs/GSSplatSorter.d.ts +105 -0
- package/dist/gs/GSSplatSorterMobile.d.ts +86 -0
- package/dist/gs/IGSSplatRenderer.d.ts +123 -0
- package/dist/gs/PLYLoader.d.ts +22 -0
- package/dist/gs/PLYLoaderMobile.d.ts +62 -0
- package/dist/gs/SplatLoader.d.ts +25 -0
- package/dist/gs/TextureCompressor.d.ts +57 -0
- package/dist/index.d.ts +44 -0
- package/dist/interaction/GizmoManager.d.ts +132 -0
- package/dist/loaders/GLBLoader.d.ts +67 -0
- package/dist/loaders/MTLParser.d.ts +65 -0
- package/dist/loaders/OBJLoader.d.ts +68 -0
- package/dist/loaders/OBJParser.d.ts +115 -0
- package/dist/mesh/Mesh.d.ts +52 -0
- package/dist/mesh/MeshRenderer.d.ts +74 -0
- package/dist/scene/SceneManager.d.ts +136 -0
- package/package.json +62 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Renderer } from "../core/Renderer";
|
|
2
|
+
import { Camera } from "../core/Camera";
|
|
3
|
+
import { SplatCPU } from "./PLYLoader";
|
|
4
|
+
import { CompactSplatData } from "./PLYLoaderMobile";
|
|
5
|
+
import { BoundingBox as IBoundingBox, SHMode as ISHMode, RendererCapabilities, IGSSplatRendererWithCapabilities } from "./IGSSplatRenderer";
|
|
6
|
+
/**
|
|
7
|
+
* 性能等级
|
|
8
|
+
*/
|
|
9
|
+
export declare enum PerformanceTier {
|
|
10
|
+
HIGH = "high",// 桌面高端 GPU
|
|
11
|
+
MEDIUM = "medium",// 桌面中端
|
|
12
|
+
LOW = "low"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 移动端优化配置
|
|
16
|
+
*/
|
|
17
|
+
export interface MobileOptimizationConfig {
|
|
18
|
+
maxVisibleSplats: number;
|
|
19
|
+
enableSorting: boolean;
|
|
20
|
+
sortEveryNFrames: number;
|
|
21
|
+
useCompactFormat: boolean;
|
|
22
|
+
pixelCullThreshold: number;
|
|
23
|
+
defaultSHMode: SHMode;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* SH 模式枚举
|
|
27
|
+
* @deprecated 使用 IGSSplatRenderer 中的 SHMode
|
|
28
|
+
*/
|
|
29
|
+
export declare enum SHMode {
|
|
30
|
+
L0 = 0,// 仅 DC 颜色 (高性能)
|
|
31
|
+
L1 = 1,// DC + L1 SH
|
|
32
|
+
L2 = 2,// DC + L1 + L2 SH
|
|
33
|
+
L3 = 3
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Bounding Box 结构
|
|
37
|
+
* @deprecated 使用 IGSSplatRenderer 中的 BoundingBox
|
|
38
|
+
*/
|
|
39
|
+
export interface BoundingBox {
|
|
40
|
+
min: [number, number, number];
|
|
41
|
+
max: [number, number, number];
|
|
42
|
+
center: [number, number, number];
|
|
43
|
+
radius: number;
|
|
44
|
+
}
|
|
45
|
+
export type { IBoundingBox as GSBoundingBox };
|
|
46
|
+
/**
|
|
47
|
+
* GSSplatRenderer - 3D Gaussian Splatting 渲染器
|
|
48
|
+
* 使用 instanced quad 方式渲染 splats
|
|
49
|
+
* 实现 IGSSplatRenderer 接口
|
|
50
|
+
*
|
|
51
|
+
* 优化功能:
|
|
52
|
+
* - GPU 可见性剔除 (视锥/近平面/屏幕尺寸)
|
|
53
|
+
* - DrawIndirect 避免 CPU submit 开销
|
|
54
|
+
* - 仅对可见 splat 排序
|
|
55
|
+
* - 移动端自动优化(降低排序频率、使用紧凑格式)
|
|
56
|
+
*/
|
|
57
|
+
export declare class GSSplatRenderer implements IGSSplatRendererWithCapabilities {
|
|
58
|
+
private renderer;
|
|
59
|
+
private camera;
|
|
60
|
+
private pipelineL0;
|
|
61
|
+
private pipelineL1;
|
|
62
|
+
private pipelineL2;
|
|
63
|
+
private pipelineL3;
|
|
64
|
+
private pipelineL0Compact;
|
|
65
|
+
private bindGroupLayout;
|
|
66
|
+
private bindGroupLayoutCompact;
|
|
67
|
+
private uniformBuffer;
|
|
68
|
+
private splatBuffer;
|
|
69
|
+
private splatCount;
|
|
70
|
+
private bindGroup;
|
|
71
|
+
private sorter;
|
|
72
|
+
private useDrawIndirect;
|
|
73
|
+
private isMobile;
|
|
74
|
+
private pixelCullThreshold;
|
|
75
|
+
private shMode;
|
|
76
|
+
private boundingBox;
|
|
77
|
+
private position;
|
|
78
|
+
private rotation;
|
|
79
|
+
private scale;
|
|
80
|
+
private pivot;
|
|
81
|
+
private modelMatrix;
|
|
82
|
+
private performanceTier;
|
|
83
|
+
private optimizationConfig;
|
|
84
|
+
private frameCount;
|
|
85
|
+
private useCompactFormat;
|
|
86
|
+
constructor(renderer: Renderer, camera: Camera);
|
|
87
|
+
/**
|
|
88
|
+
* 设置位置
|
|
89
|
+
*/
|
|
90
|
+
setPosition(x: number, y: number, z: number): void;
|
|
91
|
+
/**
|
|
92
|
+
* 获取位置
|
|
93
|
+
*/
|
|
94
|
+
getPosition(): [number, number, number];
|
|
95
|
+
/**
|
|
96
|
+
* 设置旋转 (欧拉角, 弧度)
|
|
97
|
+
*/
|
|
98
|
+
setRotation(x: number, y: number, z: number): void;
|
|
99
|
+
/**
|
|
100
|
+
* 获取旋转
|
|
101
|
+
*/
|
|
102
|
+
getRotation(): [number, number, number];
|
|
103
|
+
/**
|
|
104
|
+
* 设置缩放
|
|
105
|
+
*/
|
|
106
|
+
setScale(x: number, y: number, z: number): void;
|
|
107
|
+
/**
|
|
108
|
+
* 获取缩放
|
|
109
|
+
*/
|
|
110
|
+
getScale(): [number, number, number];
|
|
111
|
+
/**
|
|
112
|
+
* 设置旋转/缩放中心点 (pivot)
|
|
113
|
+
*/
|
|
114
|
+
setPivot(x: number, y: number, z: number): void;
|
|
115
|
+
/**
|
|
116
|
+
* 获取旋转/缩放中心点 (pivot)
|
|
117
|
+
*/
|
|
118
|
+
getPivot(): [number, number, number];
|
|
119
|
+
/**
|
|
120
|
+
* 更新模型矩阵
|
|
121
|
+
* 变换顺序: T * Tp * R * S * Tp^-1
|
|
122
|
+
* 即: 先移到原点,缩放,旋转,再移回pivot,最后应用用户平移
|
|
123
|
+
*/
|
|
124
|
+
private updateModelMatrix;
|
|
125
|
+
/**
|
|
126
|
+
* 获取当前模型矩阵
|
|
127
|
+
*/
|
|
128
|
+
getModelMatrix(): Float32Array;
|
|
129
|
+
/**
|
|
130
|
+
* 获取当前性能等级
|
|
131
|
+
*/
|
|
132
|
+
getPerformanceTier(): PerformanceTier;
|
|
133
|
+
/**
|
|
134
|
+
* 手动设置优化配置
|
|
135
|
+
*/
|
|
136
|
+
setOptimizationConfig(config: Partial<MobileOptimizationConfig>): void;
|
|
137
|
+
/**
|
|
138
|
+
* 获取当前优化配置
|
|
139
|
+
*/
|
|
140
|
+
getOptimizationConfig(): MobileOptimizationConfig;
|
|
141
|
+
/**
|
|
142
|
+
* 设置 SH 模式
|
|
143
|
+
* @param mode L0/L1/L2/L3
|
|
144
|
+
*/
|
|
145
|
+
setSHMode(mode: SHMode): void;
|
|
146
|
+
/**
|
|
147
|
+
* 获取当前 SH 模式
|
|
148
|
+
*/
|
|
149
|
+
getSHMode(): SHMode;
|
|
150
|
+
/**
|
|
151
|
+
* 设置是否启用 DrawIndirect (剔除优化)
|
|
152
|
+
* 启用后会在 GPU 上进行可见性剔除,仅绘制可见 splat
|
|
153
|
+
*/
|
|
154
|
+
setUseDrawIndirect(enabled: boolean): void;
|
|
155
|
+
/**
|
|
156
|
+
* 设置像素剔除阈值
|
|
157
|
+
* 屏幕上小于此像素数的 splat 会被剔除
|
|
158
|
+
* @param threshold 像素阈值,默认 1.0
|
|
159
|
+
*/
|
|
160
|
+
setPixelCullThreshold(threshold: number): void;
|
|
161
|
+
/**
|
|
162
|
+
* 创建渲染管线 (L0/L1/L2/L3 四个版本)
|
|
163
|
+
*/
|
|
164
|
+
private createPipelines;
|
|
165
|
+
/**
|
|
166
|
+
* 创建 uniform buffer
|
|
167
|
+
* 布局: view (64 bytes) + proj (64 bytes) + model (64 bytes) + cameraPos (12 bytes) + padding (4 bytes) + screenSize (8 bytes) + padding (8 bytes) = 224 bytes
|
|
168
|
+
*/
|
|
169
|
+
private createUniformBuffer;
|
|
170
|
+
/**
|
|
171
|
+
* 设置 splat 数据
|
|
172
|
+
* @param splats CPU 端的 splat 数组
|
|
173
|
+
*/
|
|
174
|
+
setData(splats: SplatCPU[]): void;
|
|
175
|
+
/**
|
|
176
|
+
* 设置紧凑格式的 splat 数据(移动端优化)
|
|
177
|
+
* 直接接受 CompactSplatData,避免创建中间对象
|
|
178
|
+
* @param compactData 紧凑格式的 splat 数据
|
|
179
|
+
*/
|
|
180
|
+
setCompactData(compactData: CompactSplatData): void;
|
|
181
|
+
/**
|
|
182
|
+
* 从紧凑数据计算 bounding box
|
|
183
|
+
*/
|
|
184
|
+
private computeBoundingBoxFromCompact;
|
|
185
|
+
/**
|
|
186
|
+
* 渲染 splats
|
|
187
|
+
* @param pass 渲染通道编码器
|
|
188
|
+
*/
|
|
189
|
+
render(pass: GPURenderPassEncoder): void;
|
|
190
|
+
/**
|
|
191
|
+
* 获取 splat 数量
|
|
192
|
+
*/
|
|
193
|
+
getSplatCount(): number;
|
|
194
|
+
/**
|
|
195
|
+
* 获取点云的 bounding box
|
|
196
|
+
* @returns BoundingBox 或 null(如果没有点云数据)
|
|
197
|
+
*/
|
|
198
|
+
getBoundingBox(): BoundingBox | null;
|
|
199
|
+
/**
|
|
200
|
+
* 计算点云的 bounding box
|
|
201
|
+
* @param splats splat 数组
|
|
202
|
+
* @returns BoundingBox
|
|
203
|
+
*/
|
|
204
|
+
private computeBoundingBox;
|
|
205
|
+
/**
|
|
206
|
+
* 是否支持指定的 SH 模式
|
|
207
|
+
*/
|
|
208
|
+
supportsSHMode(mode: ISHMode): boolean;
|
|
209
|
+
/**
|
|
210
|
+
* 获取渲染器能力
|
|
211
|
+
*/
|
|
212
|
+
getCapabilities(): RendererCapabilities;
|
|
213
|
+
/**
|
|
214
|
+
* 销毁资源
|
|
215
|
+
*/
|
|
216
|
+
destroy(): void;
|
|
217
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSSplatRendererMobile - 移动端优化的 3D Gaussian Splatting 渲染器
|
|
3
|
+
*
|
|
4
|
+
* 优化特点:
|
|
5
|
+
* 1. 使用纹理存储 splat 数据,减少 GPU 内存占用 (~52 bytes/splat vs 256 bytes)
|
|
6
|
+
* 2. 仅支持 L0 模式(无 SH 计算)
|
|
7
|
+
* 3. 从纹理采样获取 splat 属性(使用 RGBA32Float 保证精度)
|
|
8
|
+
* 4. 使用简化的排序器
|
|
9
|
+
*/
|
|
10
|
+
import { Renderer } from "../core/Renderer";
|
|
11
|
+
import { Camera } from "../core/Camera";
|
|
12
|
+
import { CompactSplatData } from "./PLYLoaderMobile";
|
|
13
|
+
import { BoundingBox, SHMode, RendererCapabilities, IGSSplatRendererWithCapabilities } from "./IGSSplatRenderer";
|
|
14
|
+
export type { BoundingBox } from "./IGSSplatRenderer";
|
|
15
|
+
/**
|
|
16
|
+
* GSSplatRendererMobile - 移动端优化渲染器
|
|
17
|
+
* 实现 IGSSplatRenderer 接口
|
|
18
|
+
*/
|
|
19
|
+
export declare class GSSplatRendererMobile implements IGSSplatRendererWithCapabilities {
|
|
20
|
+
private renderer;
|
|
21
|
+
private camera;
|
|
22
|
+
private pipeline;
|
|
23
|
+
private uniformBindGroupLayout;
|
|
24
|
+
private textureBindGroupLayout;
|
|
25
|
+
private uniformBuffer;
|
|
26
|
+
private uniformBindGroup;
|
|
27
|
+
private textureBindGroup;
|
|
28
|
+
private compressedTextures;
|
|
29
|
+
private splatCount;
|
|
30
|
+
private sorter;
|
|
31
|
+
private positionsBuffer;
|
|
32
|
+
private boundingBox;
|
|
33
|
+
private frameCount;
|
|
34
|
+
private sortEveryNFrames;
|
|
35
|
+
private position;
|
|
36
|
+
private rotation;
|
|
37
|
+
private scaleValue;
|
|
38
|
+
private pivot;
|
|
39
|
+
private modelMatrix;
|
|
40
|
+
constructor(renderer: Renderer, camera: Camera);
|
|
41
|
+
/**
|
|
42
|
+
* 设置位置
|
|
43
|
+
*/
|
|
44
|
+
setPosition(x: number, y: number, z: number): void;
|
|
45
|
+
/**
|
|
46
|
+
* 获取位置
|
|
47
|
+
*/
|
|
48
|
+
getPosition(): [number, number, number];
|
|
49
|
+
/**
|
|
50
|
+
* 设置旋转 (欧拉角, 弧度)
|
|
51
|
+
*/
|
|
52
|
+
setRotation(x: number, y: number, z: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* 获取旋转
|
|
55
|
+
*/
|
|
56
|
+
getRotation(): [number, number, number];
|
|
57
|
+
/**
|
|
58
|
+
* 设置缩放
|
|
59
|
+
*/
|
|
60
|
+
setScale(x: number, y: number, z: number): void;
|
|
61
|
+
/**
|
|
62
|
+
* 获取缩放
|
|
63
|
+
*/
|
|
64
|
+
getScale(): [number, number, number];
|
|
65
|
+
/**
|
|
66
|
+
* 设置旋转/缩放中心点 (pivot)
|
|
67
|
+
*/
|
|
68
|
+
setPivot(x: number, y: number, z: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* 获取旋转/缩放中心点 (pivot)
|
|
71
|
+
*/
|
|
72
|
+
getPivot(): [number, number, number];
|
|
73
|
+
/**
|
|
74
|
+
* 更新模型矩阵
|
|
75
|
+
* 变换顺序: T * Tp * R * S * Tp^-1
|
|
76
|
+
* 即: 先移到原点,缩放,旋转,再移回pivot,最后应用用户平移
|
|
77
|
+
*/
|
|
78
|
+
private updateModelMatrix;
|
|
79
|
+
/**
|
|
80
|
+
* 获取当前模型矩阵
|
|
81
|
+
*/
|
|
82
|
+
getModelMatrix(): Float32Array;
|
|
83
|
+
/**
|
|
84
|
+
* 创建渲染管线
|
|
85
|
+
*/
|
|
86
|
+
private createPipeline;
|
|
87
|
+
/**
|
|
88
|
+
* 创建 uniform buffer
|
|
89
|
+
* 布局: view (64) + proj (64) + model (64) + cameraPos (12) + pad (4) + screenSize (8) + pad (8) + textureSize (8) + pad (8) = 240 bytes
|
|
90
|
+
*/
|
|
91
|
+
private createUniformBuffer;
|
|
92
|
+
/**
|
|
93
|
+
* 设置紧凑格式的 splat 数据
|
|
94
|
+
* @param data 紧凑格式的 splat 数据
|
|
95
|
+
*/
|
|
96
|
+
setCompactData(data: CompactSplatData): void;
|
|
97
|
+
/**
|
|
98
|
+
* 创建 bind groups
|
|
99
|
+
*/
|
|
100
|
+
private createBindGroups;
|
|
101
|
+
/**
|
|
102
|
+
* 计算 bounding box
|
|
103
|
+
*/
|
|
104
|
+
private computeBoundingBox;
|
|
105
|
+
/**
|
|
106
|
+
* 渲染
|
|
107
|
+
* @param pass 渲染通道编码器
|
|
108
|
+
*/
|
|
109
|
+
render(pass: GPURenderPassEncoder): void;
|
|
110
|
+
/**
|
|
111
|
+
* 获取 splat 数量
|
|
112
|
+
*/
|
|
113
|
+
getSplatCount(): number;
|
|
114
|
+
/**
|
|
115
|
+
* 获取 bounding box
|
|
116
|
+
*/
|
|
117
|
+
getBoundingBox(): BoundingBox | null;
|
|
118
|
+
/**
|
|
119
|
+
* 设置排序频率
|
|
120
|
+
* @param n 每 n 帧排序一次
|
|
121
|
+
*/
|
|
122
|
+
setSortFrequency(n: number): void;
|
|
123
|
+
/**
|
|
124
|
+
* 设置 SH 模式(移动端仅支持 L0)
|
|
125
|
+
*/
|
|
126
|
+
setSHMode(mode: SHMode): void;
|
|
127
|
+
/**
|
|
128
|
+
* 获取当前 SH 模式
|
|
129
|
+
*/
|
|
130
|
+
getSHMode(): SHMode;
|
|
131
|
+
/**
|
|
132
|
+
* 是否支持指定的 SH 模式
|
|
133
|
+
*/
|
|
134
|
+
supportsSHMode(mode: SHMode): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* 获取渲染器能力
|
|
137
|
+
*/
|
|
138
|
+
getCapabilities(): RendererCapabilities;
|
|
139
|
+
/**
|
|
140
|
+
* 内部销毁资源(不销毁管线)
|
|
141
|
+
*/
|
|
142
|
+
private destroyInternal;
|
|
143
|
+
/**
|
|
144
|
+
* 销毁资源
|
|
145
|
+
*/
|
|
146
|
+
destroy(): void;
|
|
147
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSSplatSorter - GPU Counting Sort 深度排序器
|
|
3
|
+
*
|
|
4
|
+
* 基于 PlayCanvas 的排序算法实现,使用 Counting Sort
|
|
5
|
+
* 时间复杂度 O(n),远比 Bitonic Sort O(n log²n) 更快
|
|
6
|
+
*
|
|
7
|
+
* 流程:
|
|
8
|
+
* 1. 剔除 + 计算深度 + 统计计数
|
|
9
|
+
* 2. 前缀和计算偏移
|
|
10
|
+
* 3. 散射到最终位置
|
|
11
|
+
*
|
|
12
|
+
* iOS 兼容性:
|
|
13
|
+
* - iOS WebGPU 对大型原子数组支持有限
|
|
14
|
+
* - 默认使用 65536 个桶(桌面/Android)
|
|
15
|
+
* - iOS 使用 4096 个桶(减少原子操作压力)
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* 屏幕尺寸信息
|
|
19
|
+
*/
|
|
20
|
+
export interface ScreenInfo {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 剔除参数
|
|
26
|
+
*/
|
|
27
|
+
export interface CullingOptions {
|
|
28
|
+
nearPlane: number;
|
|
29
|
+
farPlane: number;
|
|
30
|
+
pixelThreshold: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 排序器配置选项
|
|
34
|
+
*/
|
|
35
|
+
export interface SorterOptions {
|
|
36
|
+
/** 深度桶数量(必须是 2 的幂次),默认根据平台自动选择 */
|
|
37
|
+
numBuckets?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* GSSplatSorter - GPU Counting Sort 排序器
|
|
41
|
+
*/
|
|
42
|
+
export declare class GSSplatSorter {
|
|
43
|
+
private device;
|
|
44
|
+
private splatCount;
|
|
45
|
+
private cullingParamsBuffer;
|
|
46
|
+
private countersBuffer;
|
|
47
|
+
private visibleIndicesBuffer;
|
|
48
|
+
private depthKeysBuffer;
|
|
49
|
+
private bucketCountsBuffer;
|
|
50
|
+
private bucketOffsetsBuffer;
|
|
51
|
+
private bucketPositionsBuffer;
|
|
52
|
+
private sortedIndicesBuffer;
|
|
53
|
+
private drawIndirectBuffer;
|
|
54
|
+
private resetCountersPipeline;
|
|
55
|
+
private resetBucketCountsPipeline;
|
|
56
|
+
private cullAndCountPipeline;
|
|
57
|
+
private updateDrawIndirectPipeline;
|
|
58
|
+
private prefixSumPipeline;
|
|
59
|
+
private resetBucketPositionsPipeline;
|
|
60
|
+
private scatterPipeline;
|
|
61
|
+
private cullingBindGroupLayout;
|
|
62
|
+
private cullingBindGroup;
|
|
63
|
+
private prefixSumBindGroupLayout;
|
|
64
|
+
private prefixSumBindGroup;
|
|
65
|
+
private scatterBindGroupLayout;
|
|
66
|
+
private scatterBindGroup;
|
|
67
|
+
private readonly WORKGROUP_SIZE;
|
|
68
|
+
private readonly numBuckets;
|
|
69
|
+
private screenWidth;
|
|
70
|
+
private screenHeight;
|
|
71
|
+
private cullingOptions;
|
|
72
|
+
constructor(device: GPUDevice, splatCount: number, splatBuffer: GPUBuffer, cameraBuffer: GPUBuffer, options?: SorterOptions);
|
|
73
|
+
/**
|
|
74
|
+
* 设置屏幕尺寸
|
|
75
|
+
*/
|
|
76
|
+
setScreenSize(width: number, height: number): void;
|
|
77
|
+
/**
|
|
78
|
+
* 设置剔除参数
|
|
79
|
+
*/
|
|
80
|
+
setCullingOptions(options: Partial<CullingOptions>): void;
|
|
81
|
+
/**
|
|
82
|
+
* 执行剔除和排序
|
|
83
|
+
* 每帧调用
|
|
84
|
+
*
|
|
85
|
+
* 优化:合并所有 compute pass 到单次 GPU 提交
|
|
86
|
+
* WebGPU 保证同一 command buffer 中的命令按顺序执行
|
|
87
|
+
*/
|
|
88
|
+
sort(): void;
|
|
89
|
+
/**
|
|
90
|
+
* 获取排序后的索引 buffer(用于渲染)
|
|
91
|
+
*/
|
|
92
|
+
getIndicesBuffer(): GPUBuffer;
|
|
93
|
+
/**
|
|
94
|
+
* 获取 DrawIndirect buffer
|
|
95
|
+
*/
|
|
96
|
+
getDrawIndirectBuffer(): GPUBuffer;
|
|
97
|
+
/**
|
|
98
|
+
* 获取 splat 总数量
|
|
99
|
+
*/
|
|
100
|
+
getSplatCount(): number;
|
|
101
|
+
/**
|
|
102
|
+
* 销毁资源
|
|
103
|
+
*/
|
|
104
|
+
destroy(): void;
|
|
105
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSSplatSorterMobile - 移动端优化的 GPU 排序器
|
|
3
|
+
*
|
|
4
|
+
* 与主排序器的区别:
|
|
5
|
+
* 1. 使用紧凑的位置数据(仅 xyz,无 scale/rotation)
|
|
6
|
+
* 2. 简化的剔除逻辑(移除屏幕尺寸剔除)
|
|
7
|
+
* 3. 针对 iOS 优化的桶数量
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 排序器配置
|
|
11
|
+
*/
|
|
12
|
+
export interface SorterOptions {
|
|
13
|
+
numBuckets?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 剔除选项
|
|
17
|
+
*/
|
|
18
|
+
export interface CullingOptions {
|
|
19
|
+
nearPlane: number;
|
|
20
|
+
farPlane: number;
|
|
21
|
+
pixelThreshold: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* GSSplatSorterMobile - 移动端排序器
|
|
25
|
+
*/
|
|
26
|
+
export declare class GSSplatSorterMobile {
|
|
27
|
+
private device;
|
|
28
|
+
private splatCount;
|
|
29
|
+
private cullingParamsBuffer;
|
|
30
|
+
private countersBuffer;
|
|
31
|
+
private visibleIndicesBuffer;
|
|
32
|
+
private depthKeysBuffer;
|
|
33
|
+
private bucketCountsBuffer;
|
|
34
|
+
private bucketOffsetsBuffer;
|
|
35
|
+
private bucketPositionsBuffer;
|
|
36
|
+
private sortedIndicesBuffer;
|
|
37
|
+
private drawIndirectBuffer;
|
|
38
|
+
private resetCountersPipeline;
|
|
39
|
+
private resetBucketCountsPipeline;
|
|
40
|
+
private cullAndCountPipeline;
|
|
41
|
+
private updateDrawIndirectPipeline;
|
|
42
|
+
private prefixSumPipeline;
|
|
43
|
+
private resetBucketPositionsPipeline;
|
|
44
|
+
private scatterPipeline;
|
|
45
|
+
private cullingBindGroupLayout;
|
|
46
|
+
private cullingBindGroup;
|
|
47
|
+
private prefixSumBindGroupLayout;
|
|
48
|
+
private prefixSumBindGroup;
|
|
49
|
+
private scatterBindGroupLayout;
|
|
50
|
+
private scatterBindGroup;
|
|
51
|
+
private readonly WORKGROUP_SIZE;
|
|
52
|
+
private readonly numBuckets;
|
|
53
|
+
private screenWidth;
|
|
54
|
+
private screenHeight;
|
|
55
|
+
private cullingOptions;
|
|
56
|
+
constructor(device: GPUDevice, splatCount: number, positionsBuffer: GPUBuffer, // 紧凑位置数据
|
|
57
|
+
cameraBuffer: GPUBuffer, options?: SorterOptions);
|
|
58
|
+
/**
|
|
59
|
+
* 设置屏幕尺寸
|
|
60
|
+
*/
|
|
61
|
+
setScreenSize(width: number, height: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* 设置剔除选项
|
|
64
|
+
*/
|
|
65
|
+
setCullingOptions(options: Partial<CullingOptions>): void;
|
|
66
|
+
/**
|
|
67
|
+
* 执行排序
|
|
68
|
+
*/
|
|
69
|
+
sort(): void;
|
|
70
|
+
/**
|
|
71
|
+
* 获取排序后的索引 buffer
|
|
72
|
+
*/
|
|
73
|
+
getIndicesBuffer(): GPUBuffer;
|
|
74
|
+
/**
|
|
75
|
+
* 获取 DrawIndirect buffer
|
|
76
|
+
*/
|
|
77
|
+
getDrawIndirectBuffer(): GPUBuffer;
|
|
78
|
+
/**
|
|
79
|
+
* 获取 splat 数量
|
|
80
|
+
*/
|
|
81
|
+
getSplatCount(): number;
|
|
82
|
+
/**
|
|
83
|
+
* 销毁资源
|
|
84
|
+
*/
|
|
85
|
+
destroy(): void;
|
|
86
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IGSSplatRenderer - 3D Gaussian Splatting 渲染器统一接口
|
|
3
|
+
*
|
|
4
|
+
* 桌面端和移动端渲染器都实现此接口,消除平台判断代码
|
|
5
|
+
*/
|
|
6
|
+
import { CompactSplatData } from "./PLYLoaderMobile";
|
|
7
|
+
import { SplatCPU } from "./PLYLoader";
|
|
8
|
+
/**
|
|
9
|
+
* Bounding Box 结构
|
|
10
|
+
*/
|
|
11
|
+
export interface BoundingBox {
|
|
12
|
+
min: [number, number, number];
|
|
13
|
+
max: [number, number, number];
|
|
14
|
+
center: [number, number, number];
|
|
15
|
+
radius: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* SH 模式枚举
|
|
19
|
+
*/
|
|
20
|
+
export declare enum SHMode {
|
|
21
|
+
L0 = 0,// 仅 DC 颜色(最快)
|
|
22
|
+
L1 = 1,// DC + L1 SH
|
|
23
|
+
L2 = 2,// DC + L1 + L2 SH
|
|
24
|
+
L3 = 3
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 3D Gaussian Splatting 渲染器接口
|
|
28
|
+
*/
|
|
29
|
+
export interface IGSSplatRenderer {
|
|
30
|
+
/**
|
|
31
|
+
* 设置紧凑格式的 splat 数据(推荐)
|
|
32
|
+
*/
|
|
33
|
+
setCompactData(data: CompactSplatData): void;
|
|
34
|
+
/**
|
|
35
|
+
* 设置原始 splat 数据(仅桌面端支持)
|
|
36
|
+
* 移动端实现可以抛出错误或转换为紧凑格式
|
|
37
|
+
*/
|
|
38
|
+
setData?(splats: SplatCPU[]): void;
|
|
39
|
+
/**
|
|
40
|
+
* 渲染 splats
|
|
41
|
+
*/
|
|
42
|
+
render(pass: GPURenderPassEncoder): void;
|
|
43
|
+
/**
|
|
44
|
+
* 设置位置
|
|
45
|
+
*/
|
|
46
|
+
setPosition(x: number, y: number, z: number): void;
|
|
47
|
+
/**
|
|
48
|
+
* 获取位置
|
|
49
|
+
*/
|
|
50
|
+
getPosition(): [number, number, number];
|
|
51
|
+
/**
|
|
52
|
+
* 设置旋转(欧拉角,弧度)
|
|
53
|
+
*/
|
|
54
|
+
setRotation(x: number, y: number, z: number): void;
|
|
55
|
+
/**
|
|
56
|
+
* 获取旋转
|
|
57
|
+
*/
|
|
58
|
+
getRotation(): [number, number, number];
|
|
59
|
+
/**
|
|
60
|
+
* 设置缩放
|
|
61
|
+
*/
|
|
62
|
+
setScale(x: number, y: number, z: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* 获取缩放
|
|
65
|
+
*/
|
|
66
|
+
getScale(): [number, number, number];
|
|
67
|
+
/**
|
|
68
|
+
* 设置旋转/缩放中心点(pivot)
|
|
69
|
+
*/
|
|
70
|
+
setPivot(x: number, y: number, z: number): void;
|
|
71
|
+
/**
|
|
72
|
+
* 获取旋转/缩放中心点(pivot)
|
|
73
|
+
*/
|
|
74
|
+
getPivot(): [number, number, number];
|
|
75
|
+
/**
|
|
76
|
+
* 获取模型矩阵
|
|
77
|
+
*/
|
|
78
|
+
getModelMatrix(): Float32Array;
|
|
79
|
+
/**
|
|
80
|
+
* 获取 splat 数量
|
|
81
|
+
*/
|
|
82
|
+
getSplatCount(): number;
|
|
83
|
+
/**
|
|
84
|
+
* 获取 bounding box
|
|
85
|
+
*/
|
|
86
|
+
getBoundingBox(): BoundingBox | null;
|
|
87
|
+
/**
|
|
88
|
+
* 设置 SH 模式
|
|
89
|
+
* 移动端可能只支持 L0
|
|
90
|
+
*/
|
|
91
|
+
setSHMode?(mode: SHMode): void;
|
|
92
|
+
/**
|
|
93
|
+
* 获取当前 SH 模式
|
|
94
|
+
*/
|
|
95
|
+
getSHMode?(): SHMode;
|
|
96
|
+
/**
|
|
97
|
+
* 是否支持指定的 SH 模式
|
|
98
|
+
*/
|
|
99
|
+
supportsSHMode?(mode: SHMode): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* 销毁资源
|
|
102
|
+
*/
|
|
103
|
+
destroy(): void;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 渲染器能力描述
|
|
107
|
+
*/
|
|
108
|
+
export interface RendererCapabilities {
|
|
109
|
+
/** 支持的最高 SH 模式 */
|
|
110
|
+
maxSHMode: SHMode;
|
|
111
|
+
/** 是否支持原始 SplatCPU 数据 */
|
|
112
|
+
supportsRawData: boolean;
|
|
113
|
+
/** 是否为移动端优化版本 */
|
|
114
|
+
isMobileOptimized: boolean;
|
|
115
|
+
/** 最大支持的 splat 数量(0 表示无限制) */
|
|
116
|
+
maxSplatCount: number;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 获取渲染器能力(可选方法)
|
|
120
|
+
*/
|
|
121
|
+
export interface IGSSplatRendererWithCapabilities extends IGSSplatRenderer {
|
|
122
|
+
getCapabilities(): RendererCapabilities;
|
|
123
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PLYLoader - 加载 3D Gaussian Splatting 的 PLY 文件
|
|
3
|
+
* 支持 binary_little_endian 和 binary_big_endian 格式
|
|
4
|
+
* 支持多种数据类型: float, double, int, uint, char, uchar, short, ushort
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* CPU 端 Splat 数据结构
|
|
8
|
+
*/
|
|
9
|
+
export type SplatCPU = {
|
|
10
|
+
mean: [number, number, number];
|
|
11
|
+
scale: [number, number, number];
|
|
12
|
+
rotation: [number, number, number, number];
|
|
13
|
+
colorDC: [number, number, number];
|
|
14
|
+
opacity: number;
|
|
15
|
+
shRest?: Float32Array;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* 加载并解析 PLY 文件
|
|
19
|
+
* @param url PLY 文件的 URL
|
|
20
|
+
* @returns SplatCPU 数组
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadPLY(url: string): Promise<SplatCPU[]>;
|