geopro/docs/superpowers/specs/2026-06-26-gpr-multibackend...

133 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ⚠️ 本 spec 已被实测推翻,勿照此实现
> **结论(见 `2026-06-26-gpr-3d-render-perf-ANALYSIS-for-review.md` §10ESS/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) 加速架构 — Spec2026-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 加速结构**跳过"在传函里全透明"的块**
对稀疏数据常 550× 提速、**零质量损失**。但 **VTK 库存 GPU mapper 不做自动 ESS**(仅有受限的
`UseDepthPass` 等高线跳过)。→ 真 ESS 必须**换专业体渲染后端**(其底层自带 ESS + 正确合成多重叠体)。
## 3. 关键事实:跨厂商 GPU 加速不存在单一方案
GPU 体光追渲染器全是**厂商锁定**
| 后端 | 硬件 | ESS | 跨厂商 | 角色 |
|---|---|---|---|---|
| OpenGLvtkGPUVolumeRayCastMapper现状| 任意 GPU(N/A/Intel) | ❌ | ✅ | **终极兜底** |
| OSPRayCPUEmbree/ISPC| 任意 x86 CPU免显卡| ✅ | ✅ | **通用基线** |
| OSPRay-GPUSYCL/oneAPI| 仅 Intel Arc/数据中心卡 | ✅ | ❌ | Intel 独显 |
| ANARI + VisRTXOptiX| 仅 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-CPUCPU+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/OpenVKLANARI-SDK/VisRTX。用户已确认工程量无所谓。
- 渲染层抽象一个 `IVolumeRenderBackend`,运行时按 §4 选具体 mapper
`vtkGPUVolumeRayCastMapper`(OpenGL) / `vtkOSPRayPass`+volume / `vtkAnariPass`+volume。
- **数据不变**逐线密体含通道插值spec 前一份)原样喂各后端;多体合成由后端负责(无 K=7 分包)。
- 硬件探测GL_VENDOR / 平台 APIDXGI 枚举适配器)判 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-GPUIntel较新、不如 CPU 路成熟ANARI/VisRTX 需 NVIDIA 驱动 + VisRTX 库。
- 各后端传函/外观与 OpenGL 有差异,需重新调一致。
- 本环境能否编出带光追/ANARI 的 VTKvcpkg/手动依赖)待 POC-1 验证。
- CPU+ESS 在低核机上的实际帧率待实测。
## 9. 验收
1. 客户机无论有无显卡/何种显卡自动选到可跑的后端并出图OSPRay-CPU 永远兜底)。
2. 20 条密体总览:逐线分开、不造假、**ESS 后端下不卡**(目标交互 ≥ 可用帧率,质量不降)。
3. 手动选项只列兼容项;集显默认 CPU。
4. 数据层(通道插值密体)零改动复用。