133 lines
8.7 KiB
Markdown
133 lines
8.7 KiB
Markdown
# ⚠️ 本 spec 已被实测推翻,勿照此实现
|
||
|
||
> **结论(见 `2026-06-26-gpr-3d-render-perf-ANALYSIS-for-review.md` §10):ESS/OSPRay/多后端【不做】。**
|
||
> 实测:ESS 对本数据 ~2× 且不解决重叠;passcost 确诊"多线卡"的真因是【没用视野 LOD、渲整卷大贴图】,
|
||
> 不是固定开销。**正解 = LOD 中心(各线独立 mapper + 视野 LOD + 停手重建),见下方实现计划。**
|
||
> 本文余下"多后端/ESS"内容仅作历史记录。
|
||
|
||
---
|
||
|
||
## 实现计划(LOD 中心多线总览 — 已确诊、可执行)
|
||
|
||
**目标**:把 `cmdViewAll` 从"multi-volume 单遍 + 固定整卷大贴图"改为"各线独立 mapper + 视野 LOD +
|
||
停手才重建",使单帧渲染量随视野走、与 20 条总量解耦。
|
||
|
||
**改动步骤(`tools/gpr_poc/main.cpp::cmdViewAll`)**:
|
||
1. `PlacedSource` 加回**每线自己的 `vtkSmartVolumeMapper`**(GPU 模式);删 multi-volume 用法
|
||
(multiMapper/multiVol/port 不再需要,但可暂留不碍)。
|
||
2. **装配**:删 `buildBundles` + 退避(无 multi-volume 即无纹理单元上限);改为逐线
|
||
`mapper->SetInputData(baseImage)` → `volume->SetMapper(mapper)` → `ren->AddVolume(volume)`,
|
||
各线 mapper 收进 `mappers` 向量(供质量控制)。
|
||
3. **开 LOD**:`gViewAllBaseOnly = false`(启用引擎选区换图);引擎换的是"改包围盒的子区域",
|
||
各线独立 mapper 下**安全**(无 multi-volume 可破坏)。
|
||
4. **关 channel LOD**:`gChanLod = false`——引擎金字塔已逐级降 Y,无需单独抽 Y 平面。
|
||
5. `viewAllPickOneLine`:`ps.mapper->SetInputData(ps.currentImg); ps.mapper->Update();`(非 multiMapper 端口)。
|
||
6. **停手才重建(已有,确认接线)**:拖动中(`viewAllOnInteracting`)只降质+重置裁剪、**不提交引擎目标**;
|
||
松手(`viewAllOnInteract`)/定时器 idle 才 `viewAllSubmitTargets`(提交 LOD 目标)+ `viewAllPickOneLine`
|
||
(拉就绪区域换上)。避免 P11/P12"每帧 20 条重建上传"thrash。
|
||
7. **质量旋钮保留**:`--sampleDist`/`--maxImgSample`/`--dragSampleMul` 作 LOD 框架内的交互降质兜底。
|
||
8. **总览级别**:引擎 `selectLod` 按屏幕像素选层——拉远时全路映射到少量像素 → 自动选粗层(小贴图)→
|
||
20 条小贴图即可用;拉近 → 小区域细层。**确认 selectLod 多线下确实选到粗层**(若没有,调
|
||
selectLod 的屏幕像素阈值——这是 §7.5 嫌疑①的修复点)。
|
||
|
||
**验收**:离屏看各线底图 level 随相机距离变(远→粗/小、近→细/小区);真窗口测 20 条总览交互级 fps、
|
||
拖动跟手、松手清晰、过档位无明显卡顿(外部专家提示重点盯"停手重建过渡手感")。
|
||
|
||
---
|
||
|
||
# GPR 三维体渲染:多后端 + 空体素跳过(ESS) 加速架构 — Spec(2026-06-26,已废)
|
||
|
||
> 解决"20 个重叠密体在 VTK 库存 OpenGL mapper 上又卡又只能降质"的根本性方案。
|
||
> 关联:`docs/superpowers/specs/2026-06-25-gpr-line-channel-interpolation-and-multivolume.md`(数据/插值口径)。
|
||
|
||
---
|
||
|
||
## 0. 一句话目标
|
||
用**空体素跳过(ESS)** 这一不损可见质量的业界技术,把"逐线分开的多个密体合并渲染"做到**不卡**;
|
||
并以**多渲染后端 + 自动适配**覆盖客户侧未知/多厂商硬件(含无显卡)。
|
||
|
||
---
|
||
|
||
## 1. 问题与根因
|
||
- 现状渲染 = VTK `vtkGPUVolumeRayCastMapper`(OpenGL)。**任意 GPU 可跑(最通用),但无 ESS**。
|
||
- 20 个重叠半透明密体:每条光线每步在 20 体各采一次、光线又长 → 几十亿次纹理查找/帧 → 1.7fps、交互更卡。
|
||
- 通道插值后 Y 加密到 2.5cm,使自动沿光线步长更细 → 更卡。
|
||
- **已尝试的"交互降质"(屏幕降采样 + 沿光线步长加粗)是治标**,损可见质量。
|
||
|
||
## 2. 根本方案:ESS(不损质量)
|
||
GPR 体 ~90% 是近零背景(反射层之间空)。ESS 用 min/max 加速结构**跳过"在传函里全透明"的块**,
|
||
对稀疏数据常 5–50× 提速、**零质量损失**。但 **VTK 库存 GPU mapper 不做自动 ESS**(仅有受限的
|
||
`UseDepthPass` 等高线跳过)。→ 真 ESS 必须**换专业体渲染后端**(其底层自带 ESS + 正确合成多重叠体)。
|
||
|
||
## 3. 关键事实:跨厂商 GPU 加速不存在单一方案
|
||
GPU 体光追渲染器全是**厂商锁定**:
|
||
|
||
| 后端 | 硬件 | ESS | 跨厂商 | 角色 |
|
||
|---|---|---|---|---|
|
||
| OpenGL(vtkGPUVolumeRayCastMapper,现状)| 任意 GPU(N/A/Intel) | ❌ | ✅ | **终极兜底** |
|
||
| OSPRay(CPU,Embree/ISPC)| 任意 x86 CPU(免显卡)| ✅ | ✅ | **通用基线** |
|
||
| OSPRay-GPU(SYCL/oneAPI)| 仅 Intel Arc/数据中心卡 | ✅ | ❌ | Intel 独显 |
|
||
| ANARI + VisRTX(OptiX)| 仅 NVIDIA | ✅ | ❌ | N 卡 |
|
||
| AMD GPU 体渲染+ESS | — | — | ❌ 无成熟方案 | — |
|
||
|
||
**结论**:没有"同时 N/A 卡的 GPU-ESS"。**面向未知客户机,OSPRay-CPU 是最稳通用选择**(免显卡、ESS、质量不降)。
|
||
|
||
## 4. 渲染后端架构(多后端 + 自动适配 + 手动覆盖 + 兼容灰掉)
|
||
|
||
### 4.1 用户可见选项(按硬件/结果命名,不暴露库名)
|
||
| 用户看到 | 背后实现 | 适配硬件 |
|
||
|---|---|---|
|
||
| **自动(推荐)** | 探测后选下面之一 | — |
|
||
| GPU 加速(N卡)| ANARI + VisRTX | NVIDIA 独显 |
|
||
| GPU 加速(Intel)| OSPRay-GPU | Intel Arc 独显 |
|
||
| CPU(通用,免显卡)| OSPRay-CPU | 任意 CPU |
|
||
| 通用 GPU(兼容)| OpenGL(现状 mapper)| 任意 GPU(兜底)|
|
||
|
||
### 4.2 自动探测逻辑
|
||
```
|
||
if NVIDIA 独显: → VisRTX(GPU)
|
||
elif Intel Arc 独显: → OSPRay-GPU
|
||
elif AMD(独显/核显) 或 Intel 核显 或 无显卡 或 探测失败:
|
||
→ OSPRay-CPU(默认) // 核显一律走 CPU:弱+共享内存+多不被GPU后端支持
|
||
// 强力 A 卡可手动选"通用 OpenGL"用其 GPU(无 ESS),但不作默认
|
||
```
|
||
- **手动覆盖**:用户可自选,但**只列出与当前硬件兼容的项**(不兼容灰掉,如 A 卡上禁 VisRTX)。
|
||
- **集显建议**:一律 OSPRay-CPU(CPU+ESS 比让弱核显硬渲更稳更快)。
|
||
|
||
### 4.3 部署策略(一句话)
|
||
**OSPRay-CPU 保底通用;探测到 N卡/Intel Arc 时升对应 GPU 后端;A 卡/核显吃 CPU 基线;OpenGL 终极兜底。**
|
||
|
||
## 5. 上 ESS 后端后,废弃哪些
|
||
- ❌ **装箱单体(binning)**:当初为绕 OpenGL 无 ESS 才提(代价=丢"逐线分开")。ESS 后端让**逐线分开
|
||
的多体也快** → 不需要装箱。**逐线分开 + 不造假 + 不卡,三者兼得。**
|
||
- ❌ **交互降质权宜**(屏幕/沿光线步长加粗):ESS 后端有自带的自适应/渐进式细化,基本不用;保留作任何后端的兜底。
|
||
- ❌ 自写 ESS shader / 预积分 / UseDepthPass:后端自带,无需自行实现。
|
||
- ✅ **保留**:"选几条 ds(≤7)" 是使用方式(非技术),永远有效。
|
||
|
||
## 6. 实现要点(工程)
|
||
- VTK 需**重编**带:`RenderingRayTracing`(OSPRay)、`RenderingAnari`(ANARI/VisRTX) 模块 + 依赖
|
||
(OSPRay/Embree/ISPC/OpenVKL;ANARI-SDK/VisRTX)。用户已确认工程量无所谓。
|
||
- 渲染层抽象一个 `IVolumeRenderBackend`,运行时按 §4 选具体 mapper:
|
||
`vtkGPUVolumeRayCastMapper`(OpenGL) / `vtkOSPRayPass`+volume / `vtkAnariPass`+volume。
|
||
- **数据不变**:逐线密体(含通道插值,spec 前一份)原样喂各后端;多体合成由后端负责(无 K=7 分包)。
|
||
- 硬件探测:GL_VENDOR / 平台 API(DXGI 枚举适配器)判 N/A/Intel + 独显/核显。
|
||
|
||
## 7. POC 计划(先验"CPU+ESS 够不够快"——最通用、风险最低)
|
||
1. **POC-1(先做)**:最小程序,用 **OSPRay-CPU** 渲一个 GPR 密体(tmp/lines_all_dense 里一条/几条),
|
||
**实测普通 CPU 上对多体/密体的 fps + ESS 提速比**,对照现状 OpenGL。先确认 OSPRay 在本环境
|
||
可编可跑、CPU+ESS 实际够快——这是整套方案值不值得上的关键闸门。
|
||
2. **POC-2**:若有 N 卡,ANARI+VisRTX 渲同一体,对照 GPU 提速。
|
||
3. POC 通过 → 才动手重编 VTK + 接后端抽象层。
|
||
|
||
## 8. 风险 / 待定
|
||
- OSPRay-GPU(Intel)较新、不如 CPU 路成熟;ANARI/VisRTX 需 NVIDIA 驱动 + VisRTX 库。
|
||
- 各后端传函/外观与 OpenGL 有差异,需重新调一致。
|
||
- 本环境能否编出带光追/ANARI 的 VTK(vcpkg/手动依赖)待 POC-1 验证。
|
||
- CPU+ESS 在低核机上的实际帧率待实测。
|
||
|
||
## 9. 验收
|
||
1. 客户机无论有无显卡/何种显卡,自动选到可跑的后端并出图(OSPRay-CPU 永远兜底)。
|
||
2. 20 条密体总览:逐线分开、不造假、**ESS 后端下不卡**(目标交互 ≥ 可用帧率,质量不降)。
|
||
3. 手动选项只列兼容项;集显默认 CPU。
|
||
4. 数据层(通道插值密体)零改动复用。
|