64 lines
2.0 KiB
Markdown
64 lines
2.0 KiB
Markdown
# 虚拟几何(VirtualGeometry)
|
||
|
||
**脚本入口:** `eve.VirtualGeometry()`
|
||
|
||
GPU 驱动的虚拟几何管线:把球面等网格切成簇(cluster),按视点做簇级裁剪与
|
||
LOD 选择,只绘制可见簇——适合大场景/高密度几何。Vulkan 与 WebGPU 均可用
|
||
(先以 `isAvailable()` 检查当前设备初始化状态)。
|
||
|
||
## 基本用法
|
||
|
||
```squirrel
|
||
vg <- eve.VirtualGeometry();
|
||
if (!vg.isAvailable()) { print("virtual geometry unavailable\n"); return; }
|
||
|
||
local r = vg.newRenderer();
|
||
r.buildIcosphere(4); // 细分 4 的 icosphere
|
||
r.setViewport(gfx.getWidth(), gfx.getHeight());
|
||
r.setCameraSimple(eyeX, eyeY, eyeZ, targetX, targetY, targetZ, fovDeg);
|
||
|
||
function eve_update(dt) {
|
||
r.setModelYaw(elapsed * 0.4);
|
||
r.update();
|
||
}
|
||
|
||
function eve_render() {
|
||
gfx.clear();
|
||
// 将 r.resolve() 得到的簇几何上传绘制(配合 Gpgpu/Graphics 管线)
|
||
}
|
||
```
|
||
|
||
## 目标导向指南
|
||
|
||
### 查看 LOD 与可见簇
|
||
|
||
`getLodLevel()` / `getMaxLodLevel()`、`getClusterCount()`、`getVisibleCount()`、
|
||
`getTotalTriangleCount()` 提供每帧统计,用于验证视距与裁剪。
|
||
|
||
### 接入自定义渲染
|
||
|
||
`resolve()` 返回 `ByteData`(簇三角形数据),可经 `gpgpu` 或 `graphics` 管线
|
||
上传绘制;`isReady()` 为 true 时才可 resolve。
|
||
|
||
## API 快查
|
||
|
||
### `VirtualGeometry`(模块)
|
||
|
||
- `getName()`:模块名("VirtualGeometry")。
|
||
- `isAvailable()`、`newRenderer()`。
|
||
|
||
### `VirtualGeometryRenderer`
|
||
|
||
- `buildIcosphere(subdivision)`。
|
||
- `setViewport(w, h)`、`setCameraSimple(ex,ey,ez, tx,ty,tz, fovDeg)`、
|
||
`setModelYaw(radians)`。
|
||
- `update()`、`resolve()` → ByteData、`isReady()`。
|
||
- 统计:`getViewWidth` / `getViewHeight` / `getClusterCount` / `getVisibleCount` /
|
||
`getTotalTriangleCount` / `getLodLevel` / `getMaxLodLevel`。
|
||
|
||
## 生命周期
|
||
|
||
- Vulkan 与 WebGPU 后端均可用;WebGPU 使用 WGSL compute 和 storage buffer。
|
||
- `resolve()` 返回的 ByteData 归调用方;每次相机/模型变化后需重新 `update()`
|
||
再 resolve。
|