体渲染全景
Volume Rendering · 入门全景

不画表面,
直接看见体内部。

体渲染把 CT、MRI、地震、气象这类三维标量场,不抽成一张“皮”,而是让光线穿过整个数据体,沿途不断采样、着色、累积透明度,最终合成一幅能同时看到外壳、内部结构与密度变化的图像。这一页把概念、光学模型、算法与术语一次讲清。

输入 · 三维标量场 核心 · 传递函数 + 体渲染积分 输出 · 半透明合成图像

先用一张图建立直觉

把数据想成一团有颜色的雾:每个位置都有密度。光线穿过雾时,前面的雾会遮挡后面、也会被后面透过来的光点亮 —— 体渲染算的就是这件事。

视线 / 光线 沿光线采样 → 分类 → 着色 → 合成 成像面

与面渲染最大的区别:面渲染只保留等值面,体渲染保留整条光线上的信息,所以能做半透明分层、密度渐变与内部透视。

5 步标准流水线:采样到合成
4 类投影模式:DVR / MIP / MinIP / 等值面
24 条核心术语,支持搜索筛选
1 个积分统一所有 DVR 的光学模型
显示全部术语与算法卡片 · 清空搜索可恢复
01 — CORE CONCEPTS

核心概念:先分清“体”是什么

体渲染处理的对象不是三角形,而是一个定义在三维空间上的函数。

基础

体数据 = 标量场 + 规则网格

最常见的体数据是把空间切成小立方体,每个小格存一个数值 —— 这就是体素(Voxel),类比像素的 3D 版本。所有体素连起来构成标量场 f(x,y,z):CT 里是 Hounsfield 单位,MRI 里是信号强度,气象里可以是温度或水汽密度。

  • 分辨率决定细节:如 512×512×300 已是近 8000 万体素
  • 间距(spacing)不一定各向同性,层厚常大于面内像素
  • 标量本身没有颜色,颜色是后面“赋予”的
基础

体渲染 vs 面渲染

面渲染先提取一个阈值对应的表面(如骨骼表面),再用光照画这张皮 —— 快、边界锐利,但阈值之内/之外的信息全丢了。直接体渲染(DVR)不提取表面,每条视线都穿过全量数据做积分,因此能同时呈现皮肤、肌肉、骨骼的半透明叠加。

  • 要硬边界、要测量:优先等值面 / 面渲染
  • 要看层级关系、密度过渡:优先 DVR
  • 临床里两者常叠加显示,互为补充
易混点

预分类 vs 后分类

采样点往往落在体素之间,需要插值。顺序不同,结果差别很大:

  • 预分类(Pre-classification):先把每个体素映射成颜色/不透明度,再插值颜色 —— 边界容易糊,高频被平滑掉
  • 后分类(Post-classification):先插值标量,再查传递函数 —— 边界更锐利,是现代 DVR 的默认做法,代价是每采样点都要查表
光学

为什么“累积”而不是“覆盖”

体渲染里一个采样点贡献多少,不只看它自己的不透明度 α,还看它前面已经累积了多少遮挡。前面越不透明,后面贡献越小 —— 这就是前向后合成(Front-to-Back Compositing),也是能做早期终止优化的根本原因:累积不透明度接近 1 时,后面再算也是浪费。

02 — PIPELINE & OPTICS

流水线与光学模型

所有 DVR 实现,本质都在数值求解同一个积分。理解积分,算法只是不同的求解策略。

STEP 01

重采样 Resampling

光线以步长 Δs 前进,在每个采样位置用三线性/高阶插值取标量值。

STEP 02

分类 Classification

传递函数把标量(+梯度)映射为颜色 RGB 与不透明度 α。

STEP 03

着色 Shading

用梯度当法线,做漫反射/镜面反射,可选环境光遮蔽与阴影。

STEP 04

合成 Compositing

沿光线按前→后或后→前累积颜色与透明度,得到像素值。

STEP 05

终止 Termination

离开数据体、或累积 α≈1 时停止,避免无效采样。

体渲染积分 · EMISSION–ABSORPTION MODEL
C = ∫₀ᴸ C(s) · α(s) · exp( − ∫₀ˢ α(t) dt ) ds C(s) 该点发射的颜色(经传递函数 + 着色) α(s) 该点的不透明度 / 消光系数 exp(−∫α) 从该点到眼睛还剩多少透过率 L 光线在体内的总长度

离散化后就是熟悉的迭代:
C ← C + (1 − A) · αᵢ · Cᵢ    A ← A + (1 − A) · αᵢ  其中 A 为已累积不透明度。

光学

发射–吸收模型:够用且可实时

真实光在介质里有吸收、发射、散射、反射四件事。经典 DVR 只保留吸收 + 发射,忽略散射 —— 假设每个体素自己发光、同时吸收穿过它的光。这个简化让积分可沿单条光线独立求解,才有了实时交互。

  • 引入单次散射/阴影:更真实,但需额外光线或预计算
  • 多次散射:路径追踪体渲染,质量最高、成本最高,离线为主
  • 医学 DVR 绝大多数仍在发射–吸收框架内做权衡
03 — TRANSFER FUNCTION

传递函数:决定“看见什么”的开关

同一份数据,换一条传递函数,看到的器官完全不同。它是体渲染里最重要、也最难调的一步。

核心

1D 与 2D 传递函数

1D TF:横轴是标量值,纵轴是不透明度,再配一条颜色曲线。把骨骼标量区间拉高 α、软组织压低,就能“透过皮肤看骨头”。本质是窗宽窗位的彩色、非线性推广。

2D TF:横轴标量、纵轴梯度幅值。均匀组织内部梯度低、组织交界梯度高 —— 用梯度这一维,就能只强化边界、抑制内部噪声,临床上对血管与器官轮廓尤其有效。

实践

调 TF 的三条经验

  • 先看直方图:峰值对应主要组织,先给每个峰一个颜色与低 α,再逐步抬高目标组织
  • α 别拉满:全不透明就退化成面渲染;保留 0.1–0.4 的半透明才有层级感
  • 预设优于手调:成熟系统都存组织预设(骨、血管、软组织),手调只做微调,复现性远好于每次拖曲线

自动 TF 设计(基于直方图、聚类、信息熵)是长期研究方向,但临床落地仍以预设 + 交互微调为主。

04 — ALGORITHMS

主流算法对比

按“遍历顺序”分类最清晰:以图像为序、以对象为序、混合方法。实时系统今天几乎全是 GPU 光线投射。

方法原理一句话优势代价 / 局限典型场景
光线投射
Ray Casting / Marching
图像序:每个像素发一条光线,沿线步进采样并合成。GPU 并行天然契合。画质最高、支持任意 TF 与着色、易做空间跳跃采样数 ∝ 分辨率×步数,大数据需加速结构现代 DVR 事实标准
纹理切片
Texture-based Slicing
用一组平行于视面的多边形切片采样 3D 纹理,靠硬件混合合成。实现简单、老硬件也能跑、混合免费视角切换有 popping、着色与跳跃难做早期 GPU、嵌入式
抛雪球
Splatting
对象序:每个体素投成一个带足迹的雪球 splat, splat 之间混合。只处理非空体素、渐进细化方便排序与足迹计算复杂、易有伪影稀疏数据、历史方案
Shear-Warp把体数据错切到易于逐片扫描的坐标系,先合成中间图再 warp 回正。CPU 时代最快、缓存友好画质与灵活性受限,GPU 时代已淘汰经典教材、历史实现
等值面提取
Marching Cubes
不做体积分,先按阈值抽三角面,再走传统面渲染管线。边界锐利、可测可打印、可与手术规划对接丢内部信息、阈值敏感、拓扑噪声骨骼、植入物、3D 打印

MIP · 最大密度投影

每条光线只取沿途最大标量值,不做透明度累积。高密度结构(造影血管、骨)极醒目,计算最便宜。

局限:没有深度感,前后血管分不清;低密度病灶会被高密度背景吃掉。常与薄层 MIP(Slab MIP)配合缩小投影厚度。

DVR · 直接体渲染

完整的发射–吸收积分 + 传递函数。有深度、有层级、能半透明,是“体渲染”狭义所指的方法。

局限:最依赖 TF 调参;半透明叠加时小病灶对比度会被稀释,诊断时需与 MPR 断层联读,不能替代断层。

MPR · 多平面重建

沿任意平面重切数据体,得到轴/冠/矢或斜位、曲面断层图。不是投影,是“换个方向看切片”。

定位:MPR 是诊断主力,DVR/MIP 是空间关系辅助。把三者关系理清,比纠结单个算法更重要。
05 — INTERACTIVE

动手感受:步长、模式与累积

拖动步长、切换合成模式,看同一条光线如何得到完全不同的像素 —— 这是理解采样误差最快的方式。

光线行进模拟器

下方为合成密度截面(两团高密度 + 背景)。中线为当前光线,圆点为采样位置。

● 采样点— 光线路径亮度 = 密度采样数:—

步长越大越快,但越容易跨过薄结构(欠采样 → 断裂、木纹伪影)。步长小于体素尺寸约 0.5–1 倍是常用起点。

实际 α 需按步长做校正:α' = 1 − (1−α)Δs/Δs₀,否则改步长就会改亮度 —— 这是最常见的实现 bug。

A = 0.00 · 透过率 100%

观察:切到等值面模式并调大步长,光线会直接跳过第一团薄壁 —— 这正是临床里“小结构消失”在算法层的成因。
采样

重构与预积分

三线性插值是默认重构核:便宜、连续,但会平滑高频。追求锐利可用高阶 B-spline / Catmull-Rom,代价是过冲与计算量。

预积分(Pre-integration)把一个步长区间内的积分预先算进 2D/3D 查找表,用区间两端标量查表代替单点采样 —— 同步长下画质显著更好,尤其消除木纹与阶梯伪影,是高质量 DVR 的标配。

加速

加速四件套

  • 早期终止:A≈1 即停,省下被完全遮挡的采样
  • 空间跳跃:八叉树 / 砖块(brick)的 min-max 跳过全透明区域,血管造影数据收益最大
  • 自适应采样:均匀区大步、边界区小步,配合预积分
  • 多分辨率 / 流式砖块:先低分辨率交互,停稳后渐进细化;数据大于显存时按需调度砖块
06 — SHADING & QUALITY

着色与画质:立体感从哪来

没有着色,DVR 只是一团彩色烟雾。立体感主要来自梯度着色,而不是颜色本身。

梯度 = 免费的法线

标量场的梯度 ∇f 指向密度增长最快的方向,与等值面垂直,天然可当法线用:中心差分在采样点邻域估梯度,再代入 Phong / Blinn-Phong 做漫反射 + 高光。

  • 梯度幅值还能喂给 2D TF —— 边界增强与着色共用一份计算
  • 梯度估计对噪声敏感,CT 重建核越锐,梯度噪声越大,需平滑权衡

进阶光照(按成本排序)

  • 梯度着色 — 几乎免费,必开
  • 环境光遮蔽(体 AO) — 预计算或邻域采样,显著增强腔体与褶皱的深度感
  • 单次散射阴影 — 沿光源方向再行进一条光线,中等成本
  • 路径追踪多次散射 — 物理最准,离线渲染与电影级科学可视化

与近年的 3D Gaussian Splatting 区分:3DGS 是用显式高斯基元拟合外观做新视角合成,不求解体渲染积分,也不保证密度物理量守恒 —— 两者问题定义不同,不能互相替代来谈“准不准”。

07 — GLOSSARY

术语表

用上方搜索框或分类筛选。每个术语给一句可用的定义,而不是词典式复述。

08 — LEARNING PATH

学习路径与常见误区

按这个顺序学,能避开大多数人卡住的地方。

1

先懂数据

体素、spacing、标量范围、直方图。不会看直方图,就不会调传递函数。

2

再懂积分

手推一遍离散合成迭代,弄清 α 校正与前后合成顺序 —— 这是所有 bug 的源头区。

3

写一个 Ray Marcher

片段着色器里 100 行就能跑通:光线求交、步进、查 TF、合成。跑通后再谈加速。

4

最后做工程

预积分、空间跳跃、砖块调度、渐进渲染。工程优化必须建立在前三步正确之上。

三个高频误区: ① 把 DVR 当诊断依据单独用 —— 它是空间关系工具,定性定量仍回断层与 MPR;② 步长改了不做 α 校正,误判为 TF 问题来回拖曲线;③ 一味追求全透明“通透感”,把小病灶的对比度亲手稀释掉。避开这三点,画面质量会立刻上一个台阶。

一页速记

体渲染 = 对标量场沿视线做发射–吸收积分;传递函数决定可见性,梯度决定立体感,步长与预积分决定画质下限,空间跳跃与早期终止决定速度上限。MIP 看最亮,DVR 看层级,MPR 看断层,等值面看硬边界。

回到概念 ↑