渲染学习链
Rendering · 一条学习链 · 五大章 · 十一小节

从一束光,
到看见体内部。

渲染的知识看着散,是因为缺一条主线。这套内容按一条链排:大章一先立主线——渲染方程与光传输;大章二走网格渲染;大章三、四换介质情形走体渲染;大章五回到场景做应用与选型。顺序就是总览页目录的顺序:顺读是课程,跳读是手册;每节都有公式、算例与动画。诊断场景始终一条原则:先保真,再好看。

一条链 · 方程 → 表面 → 介质 → 应用 每节 · 定位 / 公式 / 算例 / 伪代码 / 演示 40 个 · 可交互的算法动画演示 共享 · 术语表与搜索跨节通用

先用一张图建立直觉

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

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

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

5 大章章内分小节,沿一条学习链
1 个方程渲染方程,全书主线
40 个算法动画演示,可调可暂停
69 条共享术语,支持搜索筛选
显示全部术语与算法卡片 · 清空搜索可恢复
导读 — TWO IDEAS FIRST

先行概念:进入链条前先分清两件事

这是导读的压缩版,只为让你读1.1不卡壳:① 渲染的对象可以是表面,也可以是整团介质(体);② 体里的像素不是“覆盖”出来的,是沿光线累积出来的。完整定义在3.1与3.2,术语以附篇术语表为准。

基础

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

最常见的体数据是把空间切成小立方体,每个小格存一个数值 —— 这就是体素(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 时,后面再算也是浪费。

学习链目录 — TABLE OF CONTENTS

学习链目录(全站唯一一份)

全站只有这一份目录,顺序就是阅读顺序:每节只用前面已经定义过的概念。大章页只列本章小节,术语与动画的完整清单在附篇,这里不重复。

读法:第一次按 1.1 → 5.1 顺读;之后按问题跳读,拿不准的术语回附篇查定义。每节末尾的上一节 / 下一节与顶部导航都按这份目录的顺序走。
1.1 — RENDERING & LIGHT TRANSPORT

渲染总论:先回答“渲染到底在算什么”

后面十节看起来方法各异,其实都在解同一个方程。这一节先把主线立住:图像是什么、光在路上会遭遇什么、渲染方程的每个符号是什么意思。读完再进具体算法,每一节的开头都会回到这里对表。

本章位置

全书地基与主线。2.1–2.3解方程的表面情形(网格渲染),3.1–4.3解介质情形(体渲染),5.1是应用与选型。

前置知识

只需要两样:光沿直线传播的直觉;会看指数函数 e−x(x 越大衰减越快)。向量点积在用到时随文解释。

学完能回答

渲染方程每个符号的含义?为什么光栅化、光追、体渲染是“三条路一个方程”?一盏灯照亮一个点,出射光能手算出来吗?

基础

成像:一张图 = 每个方向上的光能采样

相机和眼睛都不“看物体”,它们只在成像面上记录:沿某个方向到达传感器的光有多少、是什么颜色。这个量叫辐亮度(Radiance)L,单位 W/(m²·sr)——同时编码了能量强度与传播方向,是渲染里唯一被反复搬运的核心物理量。

  • 一个像素 ↔ 一条从传感器出发、穿过像素中心进入场景的视线;像素值就是沿这条视线收集到的辐亮度
  • 所以“渲染”可以精确定义为:对每个像素,估算沿其视线方向到达的辐亮度。所有算法的差别,只在估算方法
  • 人眼/传感器只对辐亮度做对数式响应,这就是后面 tone mapping 与 sRGB 编码存在的原因(数值在 2.1纹理一节细说)
光学

光传输:光在路上只会遭遇四件事

  • 发射(Emission):光源、火焰、荧光组织自己产生光——方程里的 Le 项
  • 吸收(Absorption):光被物质吞掉变成热,能量减少。穿过介质时按 Beer–Lambert 定律指数衰减:透过率 T = e−σL(σ 是消光系数、L 是路程),推导与数值例在3.2
  • 散射(Scattering):光被偏转改向。发生在表面上叫反射/折射(网格渲染的地盘),发生在介质内部叫体散射(体渲染与4.2的地盘)
  • 几何传播:两次作用之间光沿直线走,能量按距离与角度摊薄(cosθ 与 1/r² 都出自这里)

把四件事排进时间顺序——发射 → 传播 → 在表面或介质里散射/被吸收 → 再传播 → …… → 到达传感器——就是光传输。渲染方程是这条链的数学总账。

渲染方程 · THE RENDERING EQUATION(Kajiya, 1986)
Lo(x, ωo) = Le(x, ωo) + ∫Ω fr(x, ωi, ωo) · Li(x, ωi) · cosθi dωi

逐符号读:
· Lo(x, ωo) — 点 x 沿方向 ωo 离开的辐亮度,这正是要算的答案
· Le — 点 x 自身发射的辐亮度(非光源处为 0)
· ∫Ω … dωi — 对点 x 上方半球 Ω 的所有入射方向积分求和
· fr — BRDF:入射方向 ωi 的光有多大比例被反射到 ωo,由材质决定
· Li(x, ωi) — 从 ωi 方向打到 x 的辐亮度——它本身又是别处的 Lo,方程因此递归:这正是多次弹射(全局光照)的来源
· cosθi — 入射方向与法线的夹角余弦:光越斜,摊在单位面积上越薄

算例:手算一个点的出射光

设墙面一点 x 不是光源(Le=0),漫反射材质反射率 ρ=0.8,其 BRDF 为常数 fr = ρ/π ≈ 0.255。一盏灯从 θi=37°(cosθi=0.8)方向照来,在它张的立体角 Δω=0.5 sr 内辐亮度 Li=6,其余方向无光。积分退化为一次乘法:

  • 积分项 ≈ fr · Li · cosθi · Δω = 0.255 × 6 × 0.8 × 0.5 ≈ 0.61
  • 再加一盏弱补光贡献 0.20,则 Lo ≈ 0.61 + 0.20 = 0.81
读法:渲染方程不神秘——就是把“每个方向来的光 × 材质反射比例 × 角度衰减”逐项加起来。光栅化只算光源直达的那几项(近似);路径追踪用随机采样估整个积分(2.3);体渲染则把这笔账沿光线在介质里逐段记(3.2)。

路一 · 光栅化:在三角形上近似解

把场景表面离散成三角形,逐个投影到屏幕;积分只保留光源直达项,间接光靠阴影图、探针等技巧补。解得最粗,但快到能每秒算 60 张以上——2.1。

近似点:Li 只取光源方向,半球积分被砍成有限几项。

路二 · 光线追踪:沿光线认真解

从像素反着追光的来路,在交点处真的去收集其他方向的光:确定性递归是 Whitted 光追(2.2),随机采样估全积分是路径追踪与全局光照(2.3)。

完整度递增:Whitted 只追镜面弹射 → 路径追踪连漫反射多次弹射一起估。

路三 · 体渲染:介质版的方程

当“表面”不复存在、空间里处处是半透明介质时,方程变形成沿光线的体渲染积分:每一点既吸收又发射(还可散射)。3.1–4.3整组都在解它,方程在3.2写全。

对应关系:表面 BRDF ↔ 介质的相函数;表面交点 ↔ 介质采样点;阴影光线 ↔ 透过率积分。
路线遍历顺序反射 / 阴影 / 透明速度特征最适合
光栅化对象序:逐三角形投影到屏幕靠阴影图、反射探针、排序等技巧模拟最快,硬件管线专为它设计游戏、交互应用、面渲染
光线追踪图像序:逐像素发主光线 + 次级光线原生支持,物理自然中—慢,靠 BVH 与硬件 RT 核心加速高质量实时、建筑与产品可视化
路径追踪图像序 + 随机弹射积分完整 GI、焦散、多次散射最慢,以小时计或重度降噪影视离线、科学参考解
体积分(DVR)图像序:逐像素沿线积分连续介质透明是原生语义;阴影/散射需额外积分取决于步数与跳跃效率CT/MRI、流体、气象等体数据
伪代码 · 一切渲染算法的共同骨架
for 每个像素 p: 构造 p 的视线(原点 = 相机, 方向 = 穿过 p) L ← 沿视线估算到达相机的辐亮度 # ← 所有算法只在这里不同 像素值 ← tonemap(L) 并量化到 0–255 估算 L 的三种实现 = 本书三条路: 光栅化: 枚举三角形, 谁覆盖 p 就算谁的直接光 光线追踪: 求最近交点, 递归/随机收集 L_i 体渲染: 沿线步进, 逐段累积发射并扣减透过率
常见坑

进正文前先避开三个误解

  • “渲染 = 把模型画出来”:渲染是估算光能,模型只是输入之一;没有光源与材质参数,方程无从算起
  • “全局光照是一种特效”:GI 就是方程里 Li 的递归部分,不是可有可无的滤镜——关掉它等于假设世界只有一跳光
  • “体渲染是光栅化的高级版”:两者解的是方程的不同情形(表面 vs 介质),不是版本关系;医学 CT 数据根本没有表面可光栅化
本节小结:图像 = 逐像素估算辐亮度;光路上只有发射、吸收、散射、传播四件事;渲染方程是总账,Li 的递归性产生全局光照。三条路的差别只在“怎么估算积分”。
下一节预告:2.1 · 光栅化——最快的近似怎么工作:三角形如何变成像素、深度如何判遮挡、BRDF 如何在着色器里落地为 PBR。
2.1 — MESH RENDERING I · RASTERIZATION

光栅化:把渲染方程在三角形上近似解掉

1.1立了主线:逐像素估算辐亮度。光栅化选的估法是对象序——不逐像素找光,而是枚举每个三角形、问它盖住哪些像素,并在覆盖处只算光源直达的那部分积分。少算的部分(间接光)用技巧补,所以它快;也所以它只是近似。

本章位置

大章二第 1 节(2.1)。下一节光线追踪把“估法”换成图像序,2.3再补完整的多次弹射。

前置知识

1.1的渲染方程与 BRDF 概念;知道三角形有三个顶点、顶点可带法线/UV 属性即可。

学完能回答

三角形怎么变成像素?重心坐标为什么必须做透视校正(能手算)?深度缓冲为什么让绘制顺序无关?前向与延迟管线差在哪?

RASTER · 01

顶点处理

模型变换、视图变换、投影变换,把 3D 顶点送到裁剪空间,计算光照或传递插值属性。

RASTER · 02

图元装配与裁剪

顶点组装成三角形,裁掉视锥外部分,做背面剔除与视口变换。

RASTER · 03

光栅化

三角形覆盖哪些像素就生成哪些片段(fragment),深度、法线、UV 在三角形内插值。

RASTER · 04

片段着色

每个片段查纹理、算光照、写颜色与深度。现代 GPU 的可编程着色器主要工作在这里。

RASTER · 05

输出合并

深度测试、模板测试、透明混合、抗锯齿解析,最终写入帧缓冲显示。

光栅化管线一句话:以对象为序枚举三角形,再问“它盖住哪些像素”——快、硬件友好,所以游戏与实时系统默认用它;阴影、反射等全局效果需要额外技巧补。

通用

着色模型演进:从经验公式到 BRDF

着色回答“一个点在给定光照下多亮、什么颜色”。演进路线是一条从“像”到“准”的线:

  • Flat / Gouraud:面或顶点算光、内部插值——便宜,但高光会糊、马赫带明显
  • Phong / Blinn-Phong:逐像素用法线算漫反射 + 镜面高光,Blinn 用半程向量更稳、更省,统治实时渲染数十年
  • BRDF 框架:把表面对“入射方向 → 出射方向”的反射规律抽象为函数 fr(ωi, ωo),一切现代材质模型都写成 BRDF
  • 体渲染的梯度着色借用的正是 Phong 思想:梯度当法线,套同一套公式
通用

PBR:基于物理的渲染

PBR 不是某个单独算法,而是一套约束:能量守恒、菲涅尔效应、微平面理论。工业标准是金属度–粗糙度工作流:

  • 基础色 Albedo:非金属存固有色,金属存反射色——一张图同时编码两种语义
  • 金属度 Metallic:0 或 1 为主,中间值多为过渡/脏污,不要当连续物理量乱拉
  • 粗糙度 Roughness:控制微平面分布,决定高光是锐点还是大片光泽;粗糙度贴图比单一数值重要得多
  • IBL 图像基光照:用环境贴图预卷积提供全局环境反射,是 PBR 看起来“贵”的关键一半

边界:PBR 管的是表面材质。把它套到体数据上要小心——体素没有表面微结构,医学 DVR 的颜色来自传递函数的人为赋值,不服从 PBR 的物理语义。

通用

阴影:深度感最便宜的来源

  • 阴影映射 Shadow Mapping:从光源视角先渲一张深度图,着色时比深度判遮挡。实时主流,但分辨率不足会锯齿、自遮挡会 acne,需 bias + PCF 滤波
  • 级联阴影 CSM:按距离把视锥切几段、各用一张阴影图,大场景必备
  • PCSS:按遮挡距离调滤波半径,得到近硬远软的接触硬化阴影
  • 光追阴影:发一条到光源的射线判遮挡,质量干净,成本随光源面积采样上升
  • 体渲染里阴影最贵:介质处处半透明,要沿光源方向再做一次体积分,多数实时系统用体 AO 近似代替
通用

抗锯齿:锯齿是采样不足,不是画错了

锯齿、闪烁、摩尔纹本质都是采样率低于信号频率。解法只有两类:渲前滤波,或提高采样再解析:

  • SSAA 超采样:高分辨率渲完再降采样,质量最好、成本最高,基准线
  • MSAA:只在几何边缘多采样深度/覆盖,着色仍单采样——对透明物体和着色高频无效,体渲染帮不上忙
  • FXAA / SMAA:后处理找边平滑,便宜但会糊细节与文字
  • TAA 时域抗锯齿:抖动采样点 + 累积历史帧,当今主流;代价是运动拖影与重投影错误。体渲染的渐进细化是同一思想
  • DLSS / FSR 类超分:低分辨率渲染 + 学习/算法重建,已与 TAA 融合成现代管线的默认后段
2.1(续) — PIPELINE IN DEPTH

管线全流程:从顶点缓冲到帧缓冲

网格(Mesh)是面渲染的数据结构:用顶点与三角形逼近表面。顶点带位置、法线、UV、切线、颜色、骨骼权重,经顶点/索引缓冲(VBO/IBO)送入 GPU;索引复用顶点、条带化与缓存友好的排布直接决定带宽。下面六步与上面的五步管线一一对应,逐步展开。

通用

网格表示与顶点数据

  • 为什么是三角形:三点共面、内部可线性插值、光栅化硬件原生支持;四边形最终也被切成三角形
  • 拓扑:封闭流形网格才有明确内外;破洞、自交、法线翻转会在光照与剔除阶段集中爆雷
  • 细节层级 LOD:远处用简化网格 + 法线贴图补细节,是开放世界控面数的根基;Marching Cubes 产出的网格(4.1)同样要先减面与重算法线才能高效光栅化
顶点变换:模型→世界→相机→裁剪→屏幕,立方体线框在变换链中逐步被投影压扁
通用

顶点处理与变换链

  • 变换链:模型矩阵(摆放)→ 视图矩阵(相机)→ 投影矩阵(透视/正交,产生裁剪空间齐次坐标)→ 透视除法得 NDC → 视口映射到像素
  • 法线要用逆转置矩阵变换,非均匀缩放下直接套模型矩阵会把光照方向算歪
  • 顶点着色器还负责蒙皮、形态键、实例化偏移;曲面细分(Tessellation)与几何着色器在装配前增删图元
通用

裁剪、剔除与图元装配

  • 视锥剔除在物体级先扔掉画面外网格;齐次裁剪在图元级把跨越近/远/侧平面的三角形切出新顶点,保证 w 安全
  • 背面剔除:按屏幕绕序(顺/逆时针)丢弃背向三角形,封闭网格可省约一半光栅化——绕序设反会看到“剥了皮”的模型
  • 遮挡剔除(遮挡查询/层级深度)进一步跳过被完全挡住的物体,是大场景的标配
通用

光栅化与重心插值

  • 边函数判定像素中心是否在三角形内;现代 GPU 按 2×2 像素块(quad)成组执行片段着色器,以便用差分算纹理导数选 mip 层级
  • 重心坐标 (u,v,w) 按面积权重插值法线/UV/颜色;插值必须做透视校正(先除以 w 再插值),否则斜面上的纹理会扭曲——这是早期 3D 游戏的标志性画面错误
三角形光栅化:像素逐行被覆盖,颜色按重心坐标在红/绿/蓝三顶点间插值
通用

深度测试与模板测试

  • 深度缓冲逐片段比深度决定可见性,使绘制顺序与遮挡无关;透视下深度非线性聚集在近处,远处易 Z-fighting(共面闪烁),解法:拉近代平面、反向深度、对数深度、polygon offset
  • Early-Z 在着色前先测深度省算力;半透明物体则关深度写入、按后到前排序混合——顺序错了透明就穿帮
  • 模板缓冲用掩码做轮廓描边、镜面区域、阴影体与 UI 裁切,是“按标记决策”的通用工具
深度测试:两片三角形交叠移动,右侧深度缓冲只保留更近的表面
通用

纹理与采样

  • UV 把二维纹理贴到三维表面,接缝与拉伸由展 UV 的质量决定
  • Mipmap + 三线性/各向异性过滤:远处自动选低分辨率层级抑制闪烁,斜视角靠各向异性保住地面纹理清晰度——本质仍是抗混叠
  • 法线贴图在切线空间扰动法线伪造凹凸;颜色纹理走 sRGB 解码、数据纹理(粗糙度/法线)必须走线性,配反全管线发灰或发亮
管线架构怎么做优势代价 / 适用
前向渲染 Forward每个物体绘制时遍历所有影响它的光源,一次算完着色透明、MSAA、多材质天然友好,实现简单光源一多成本 ∝ 物体×光源;适合光源少的场景与移动端
延迟渲染 Deferred先把位置/法线/材质写入 G-Buffer,再在屏幕空间对可见像素统一算光照光照成本只与像素数和光源覆盖有关,几百盏动态光可行显存带宽大、透明需单独前向补、MSAA 难;主流大世界游戏的选择
Forward+ / Clustered把视锥切成块/簇,预先为每块建光源列表,前向着色时只遍历本块光源兼得前向的透明/MSAA 与近延迟的光源扩展性实现复杂度最高;现代引擎(与延迟并存)的常见答案

算例:重心坐标与透视校正,手算一遍

三角形屏幕坐标 A(0,0)、B(10,0)、C(0,10),取内部点 P(2,2)。重心坐标 = 对顶子三角形面积占比:总面积 50,子面积 PBC=30、PCA=10、PAB=10,得权重 (u,v,w) = (0.6, 0.2, 0.2)(和为 1 ✓)。

设三顶点某属性(如纹理 U)为 0、1、0。屏幕空间直接插值:0.6×0 + 0.2×1 + 0.2×0 = 0.20。但透视下这是错的:属性定义在三维表面上,必须先除以齐次 w 再插值、最后除回来。设三顶点裁剪 w 为 1、2、1(B 更远):

  • 插值 (属性/w):0.6×(0/1) + 0.2×(1/2) + 0.2×(0/1) = 0.10
  • 插值 (1/w):0.6×1 + 0.2×0.5 + 0.2×1 = 0.90
  • 透视校正值 = 0.10 / 0.90 ≈ 0.111,与朴素插值的 0.20 差了近一倍
结论:越斜的表面、深度差越大,朴素插值错得越离谱——纹理会像橡皮一样滑动扭曲。现代 GPU 在硬件里自动做这个校正(属性按 1/w 加权插值),着色器里声明 noperspective 时才关掉。
伪代码 · 光栅化一个三角形
输入: 三顶点(已变换到裁剪空间, 带属性 attr 与齐次 w) 1. 透视除法 → NDC → 视口映射到屏幕坐标 2. 按绕序判正/背面, 背面直接丢弃 (culling) 3. 求屏幕包围盒, 逐像素用边函数测覆盖: 像素在内 → 得重心坐标 (u, v, w_b) 4. 深度 z 用重心线性插值; 与深度缓冲比较: 更远 → 丢弃; 更近 → 更新深度缓冲 5. 属性做透视校正插值: attr = (u·a₁/w₁ + v·a₂/w₂ + w_b·a₃/w₃) / (u/w₁ + v/w₂ + w_b/w₃) 6. 片段着色: 纹理采样 + BRDF 直接光 → 写颜色
本节小结:光栅化 = 对象序枚举三角形 → 边函数覆盖测试 → 重心插值(必须透视校正)→ 深度测试决胜负 → 片段着色算直接光 + PBR 材质。间接光不在管线内,靠阴影图、探针、屏幕空间技巧外挂。
常见坑:绕序设反模型像被剥皮;法线用模型矩阵直变换在非均匀缩放下歪掉;颜色纹理忘了 sRGB 解码画面发灰;半透明不排序就穿帮。下一节:2.2 · 光线追踪——换图像序重新估算同一方程,反射、折射、真阴影成为原生能力。
2.2 — MESH RENDERING II · RAY TRACING

光线追踪:换个顺序,把方程算得更真

2.1的对象序有个天生短板:一个像素最终被谁盖住、光从哪弹来,都要等所有三角形过完才知道,间接效应只能外挂。光线追踪反过来走图像序:每个像素主动发光线去问场景——最近交点是谁、光源看不看得见、镜面方向有什么。光线用参数式 r(t) = o + t·d 表示(o 原点、d 单位方向、t 距离),求交核心是射线–三角形求交(如 Möller–Trumbore 公式);一切性能问题最后都归结为“少测无关三角形”。介质版的对应物是4.2 · 体光追。

本章位置

大章二第 2 节(2.2):估算方法从“枚举三角形”升级为“逐像素追光路”,但只追确定性弹射;随机弹射(完整积分)留给2.3。

前置知识

2.1的三角形/网格概念;1.1渲染方程中 Li 的递归含义。

学完能回答

Whitted 递归追哪几类光线、为什么管不了漫反射弹射?BVH 的 SAH 代价怎么算(能手算)?一条光线实际遍历多少个盒?

通用

光线追踪与路径追踪:以像素为序

与光栅化相反,光线追踪以图像为序:每个像素发射主光线,求与场景的最近交点,再发阴影光线、反射/折射光线递归求解。路径追踪进一步用蒙特卡洛采样随机弹射光线,数值求解渲染方程,物理最完整。

  • 加速结构 BVH / KD-Tree:没有它,每条光线遍历全部三角形不可行;BVH 是现代光追的标配
  • 俄罗斯轮盘赌 + 多重重要性采样:决定光线何时停、在哪采样,直接决定噪声与收敛速度
  • 降噪(Denoiser):低采样路径追踪 + 时域/空域降噪,已是实时光追的实际形态
  • 与体渲染的关系:光线行进(Ray Marching)就是光追思想在连续介质里的版本
通用

光线投射与 Whitted 式追踪

  • 主光线定最近交点;阴影光线向光源求“有没有遮挡”;镜面处生反射光线,透明处按斯涅尔定律生折射光线,递归深度与菲涅尔权重决定何时停
  • 全反射(TIR):光从光密到光疏介质且入射角过大时折射消失、只剩反射——钻石火彩与光纤都靠它
  • Whitted 只追镜面式的确定性次级光线,漫反射的多次弹射它管不了——那是路径追踪(2.3)的地盘
Whitted 追踪:主光线命中后分出阴影光线(向光源)、反射光线与折射光线
通用

加速结构:BVH 如何剪枝

  • 构建:按表面积启发式(SAH)递归切分,把三角形装进层级包围盒;构建质量决定遍历时相交测试的次数
  • 遍历:光线先测大盒,命中才下钻子盒,最近命中距离持续剪掉更远的分支——数百万三角形只需测几十个盒
  • 动态场景:引擎分 BLAS(单物体)与 TLAS(场景实例)两层,物体动了只重构 TLAS 或做 refit,避免整树重建
  • KD-Tree 空间切分更细但更新贵,八叉树适合体数据(见 4.3 的 SVO),规则网格适合均匀介质
BVH 遍历:光线依次测包围盒,未命中的整棵子树被直接剪掉(灰色)
通用

实时光追与去噪:混合管线才是现状

  • 分工:光栅化画主可见性,光追只补阴影、反射、GI 等光栅化做不好的部分,各取所长
  • 预算:每像素 1–4 条光线是实时常态,画面靠时空降噪(历史重投影 + 方差引导滤波)撑住;静止画面干净、快速运动时拖影与噪点就是它的指纹
  • 硬件 RT Core 加速的是求交与 BVH 遍历,不是着色——光线条数预算仍要精打细算
阴影映射:左侧从光源看的深度图,右侧着色时比深度——落在遮挡区的像素变暗
通用

抗锯齿对比(动画)

左:单采样下斜边呈阶梯并随亚像素移动而爬行;右:多采样按覆盖率混合后边缘平稳。把动画暂停在任意时刻对比像素格,差别最直观。

抗锯齿对比:左侧单采样锯齿爬行,右侧覆盖率混合后边缘平滑稳定
BVH 构建代价 · SAH(表面积启发式)
Cost(切分) = Ctrav + (SAL/SAP)·NL·Chit + (SAR/SAP)·NR·Chit

符号:Ctrav 多测一个节点的固定开销;SAP/SAL/SAR 父/左/右包围盒表面积——一条随机光线命中父盒后落进子盒的概率 ≈ 子盒表面积占比;NL/NR 子盒内三角形数;Chit 一次射线–三角形求交的开销。构建时枚举候选切分面,取代价最小的;两个子盒都比不切分还贵时就停(成为叶子)。

算例:SAH 选切分 + 一次遍历计数

选切分:父盒 SAP=100、含 12 个三角形,Ctrav=Chit=1。候选 A:左 SA=40 装 3 个、右 SA=70 装 9 个 → 代价 = 1 + 0.4×3 + 0.7×9 = 8.5。候选 B:左右 SA 各 55、各装 6 个 → 代价 = 1 + 0.55×6 + 0.55×6 = 7.6。B 胜出:SAH 惩罚的不是“盒大”,而是“光线大概率落进去却还要测很多三角形”。不切分的代价是 12,两者都值得切。

走遍历:场景 12,000 个三角形建成 BVH。一条光线:测根盒(命中,1 次)→ 测两个子盒(左中、右不中,右子树 5,800 个三角形整棵剪掉)→ 沿左路继续下钻……全程约 11 次盒测试 + 3 次三角形求交就找到最近交点,对比暴力遍历的 12,000 次求交——这就是光追可行的全部原因。

与体渲染对照:空空间跳过(4.3)是同一思想在体素网格上的版本——用预存的 min–max 证明“这一段不值得采”。
本节小结:图像序 + 三类次级光线(阴影/反射/折射)= Whitted 光追;BVH 用 SAH 构建、用最近命中剪枝,把求交从 O(N) 压到近似 O(log N);实时光追是光栅化打底、光追补关键效果的混合管线。
常见坑:阴影光线起点不沿法线偏移会自遮挡出 acne;递归不设深度/权重截断会指数爆炸;BVH 对全动态场景每帧重建,成本可能吃掉光追收益。下一节:2.3 · 全局光照——把 Li 的递归真正估完:蒙特卡洛、路径追踪与另外四种解法。
2.3 — MESH RENDERING III · GLOBAL ILLUMINATION

全局光照:把渲染方程的递归估完

链条递进到这里:2.1只算直接光(近似),2.2补上镜面弹射(更精确),本节面对完整的 渲染方程——Lo(x,ωo) = Le + ∫ fr·Li·cosθ dωi,其中 Li 本身又是别处的 Lo,无限递归。直接光是弹射 0 次到达的光,间接光是弹射 ≥1 次的——它让阴影里不死黑、白墙给邻物染色(color bleeding)。下面五种方法解的是同一个积分,差别只在“在哪算、算多准、结果存哪”。

本章位置

大章二收官节(2.3)。读完它,网格线闭环;下一节起换介质情形——但请注意,体光追(4.2)会把本节整套方法搬进介质。

前置知识

1.1渲染方程逐符号解释;2.2的光线与交点概念。

学完能回答

蒙特卡洛估计量为什么要除以 pdf?路径追踪一次弹射的数值怎么估?五种 GI 方法各自把计算花在哪、误差长什么样?

通用

全局光照:直接光只是第一跳

渲染方程把出射光写成自发光 + 半球上所有入射光经 BRDF 的积分——全局光照(GI)就是求这个积分里“光弹射多次”的部分:

  • 离线:路径追踪、辐射度(Radiosity)、光子映射,质量优先
  • 预计算:光照贴图、光照探针(Light Probe)、辐照度体积——把 GI 烤进数据,运行时查表
  • 屏幕空间:SSAO / SSGI / SSR 只用已渲染画面推断,成本低但视锥外信息缺失会露馅
  • 体渲染对应物:体环境光遮蔽、单次/多次散射,就是 GI 思想在介质中的版本,成本梯度完全对应
通用

路径追踪:随机弹射求积分

  • 每像素撒多条路径,按 BRDF 与光源分布做多重重要性采样,用俄罗斯轮盘赌概率终止长路径保持无偏
  • 收敛律:噪声标准差 ∝ 1/√N——采样翻 4 倍,噪声才减半;火花点(fireflies)来自极小概率采到极亮路径,是焦散场景的顽疾
  • 双向路径追踪、Metropolis 等变体专攻“光要拐几个弯才到相机”的难采样场景
路径追踪:光线在房间里多次弹射,采样越积越多,画面从满屏噪声逐渐收敛干净
通用

光子映射:从光源出发存光子

  • 第一遍从光源发射光子,在漫反射面存入光子图(KD-Tree);第二遍正常光追,交点邻域内用光子密度估计间接光
  • 强项是焦散(水面/玻璃把光聚焦出的亮纹),路径追踪很难采到、光子映射天然擅长
  • 代价:密度估计带来系统性模糊(有偏),光子数与估计半径是画质旋钮
光子映射:光子从光源射出、弹射后落在地面存入光子图,亮斑汇成焦散
通用

辐射度:把场景切成面片换能量

  • 只处理漫反射:每面片的出射 = 自发光 + 反射率 × Σ(其他面片出射 × 形状因子),形状因子由几何可见性与夹角决定
  • 迭代求解像热量扩散:最亮的面片先把能量分给邻居,几轮后全场亮度分布稳定——与视角无关,可烘焙复用
  • 局限:镜面/高光完全缺席,面片粒度决定软阴影质量;今天多活在建筑光环境模拟与烘焙管线里
辐射度:面片按形状因子逐轮交换能量,暗角一轮轮被邻居照亮直至稳定
通用

辐照度缓存、探针、AO 与 IBL 的分工

  • 辐照度缓存:间接光变化慢,就在稀疏采样点精确算、其余位置按距离/法线加权插值——路径追踪时代仍是降本利器
  • 光照探针 / DDGI:空间中撒探针存入射辐照度,物体查最近探针得环境间接光,可动态更新
  • AO 不是 GI:环境光遮蔽只答“这点有多被挡”,不答“挡它的东西是什么颜色、光从哪来”——它是 GI 的廉价近似而非子集
  • IBL 是环境尺度的 GI:把远处环境当无限大光源预卷积,补的是“世界反射进物体”的那部分,与局部 GI 叠加使用
  • 与体渲染对照:体 AO、单次/多次散射(4.2)就是这套家族在介质里的版本
直接光 vs 间接光:左半只有直达光、角落死黑;右半加入一次弹射后角落被墙面染亮
蒙特卡洛估计量 · MONTE CARLO ESTIMATOR
⟨F⟩ = (1/N) · Σi=1..N f(xi) / p(xi), xi ~ p

符号:F 是要求值的积分(如渲染方程的半球积分);f(xi) 是第 i 个采样点处的被积函数值;p(xi) 是抽到这个样本的概率密度(pdf)——除以它是为了纠偏:容易抽到的方向样本多,就要按概率打折,否则高估;N 样本数。估计无偏(期望等于真值),误差(标准差)∝ 1/√N:降一半噪声要 4 倍样本,这是所有路径追踪成本曲线的根。

算例:路径追踪的一次弹射

漫反射点 ρ=0.8(fr=ρ/π),用余弦加权采样方向:pdf p(ω)=cosθ/π。代入估计量,单样本贡献 = fr·Li·cosθ / p(ω) = (ρ/π)·Li·cosθ / (cosθ/π) = ρ·Li——cosθ 与 π 恰好抵消,这正是余弦加权被称为“为漫反射量身定做”的原因。

  • 样本 1:方向打到灯,Li=5 → 贡献 0.8×5 = 4.00
  • 样本 2:打到暗墙,Li=0.2 → 贡献 0.16
  • 样本 3、4:再打到灯与暗墙 → 4.00、0.16
  • 4 个样本平均 = (4.00+0.16+4.00+0.16)/4 = 2.08
单样本时画面在 4.00 与 0.16 之间乱跳(这就是路径追踪的噪声本体);样本越多,平均越贴近真值,且弹射不止一次时每跳都乘一段这样的贡献——路径吞吐量(throughput)就是这串乘积。
选型速记:要参考解/影视质量 → 路径追踪;要焦散 → 光子映射补强;静态漫反射场景要烘焙 → 辐射度思想的光照贴图/探针;实时 → 光栅化 + 屏幕空间近似 + 探针/DDGI + 少量光追。所有 GI 方法都在同一个渲染方程下,只是把“积分在哪算、算多少次、结果存哪”做了不同取舍。
本节小结:GI = 估渲染方程的递归部分。路径追踪用蒙特卡洛硬估(无偏、高方差);光子映射从光源存密度(有偏、擅焦散);辐射度在面片间迭代能量(只漫反射、可烘焙);缓存/探针/AO/IBL 是把间接光预计算或近似化的实时家族。
常见坑:拿 AO 当 GI(它只答“挡多少”不答“什么颜色”);样本少还怪去噪糊——方差是采样问题,先加样本再谈滤波;把烘焙好的光照贴图用在动态物体上。下一节:3.1 · 体数据与采样——换介质情形:先搞清体数据长什么样、连续场怎么从格点重构。
3.2 — PIPELINE & OPTICS

流水线与光学模型:一个积分,五步算完

3.1备好了数据与采样,本节回答核心问题:一条光线穿过介质,像素值到底怎么算出来。所有 DVR 实现,本质都在数值求解同一个体渲染积分;理解积分,后面4.1的算法只是不同的求解策略。

本章位置

大章三第 2 节(3.2)、全书公式密度最高的一节:积分、Beer–Lambert、传递函数都在这里定义,后文只引用不再重述。

前置知识

3.1的采样与 α 校正;1.1的渲染方程(本节的积分是它的介质版)。

学完能回答

体渲染积分每个符号的含义?给定 HU 值和传递函数,α 能手算吗?五个采样点的累积像素能逐步算出来吗?

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 绝大多数仍在发射–吸收框架内做权衡
3.2(续) — TRANSFER FUNCTION

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

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

核心

1D 与 2D 传递函数

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

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

实践

调 TF 的三条经验

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

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

Beer–Lambert 定律 · 透过率从哪来
T(s) = exp( − ∫₀ˢ σt(t) dt ) αi = 1 − exp( −σt,i · Δs )

符号:σt 消光系数(1/长度),介质“有多挡光”;T(s) 光走过路程 s 后剩余的比例;αi 第 i 个步段(长 Δs)的不透明度。第二式就是3.1 α 校正公式的来源:α 随步长指数变化,把它展开成 (1−α)Δs/Δs₀ 正是同一件事。均匀介质时积分退化为 T = e−σt·s:σt=0.5/mm 的组织,2mm 厚只剩 e−1≈37% 的光能穿过。

算例:从 HU 值查到 α,再走完五个采样点

第一步,查传递函数:设 1D TF 的不透明度控制点为:空气 −1000 HU→0、脂肪 −100 HU→0.05、软组织 40 HU→0.15、骨 400 HU→0.85,控制点间线性插值。某采样点 HU=200,落在软组织与骨之间:比例 (200−40)/(400−40)=0.44,α₀ = 0.15 + 0.44×(0.85−0.15) = 0.46(对应参考步长 1mm)。当前步长 2mm,校正:α = 1 − (1−0.46)² = 0.71。

第二步,逐步合成:一条光线依次遇到 5 个采样点(α 已校正,C 为该点经 TF 得到的亮度),按下表迭代 C ← C + (1−A)·α·Ci,A ← A + (1−A)·α:

采样点αiCi本步贡献 (1−A)αC累积 A累积 C
10.100.200.0200.1000.020
20.450.600.2430.5050.263
30.801.000.3960.9010.659
40.300.500.0150.9310.674
50.050.300.0010.9340.675
最终像素 C≈0.675、A≈0.934。注意第 3 点(骨)之后 A 已 0.90,第 4、5 点加起来只贡献 0.016——这就是4.3提前终止的数值依据:A 过 0.98 后继续采样,人眼已分辨不出差别。
伪代码 · 光线行进主循环(DVR 的全部核心)
输入: 光线 (原点 o, 方向 d), 步长 Δs, 传递函数 TF 1. 求光线与数据体包围盒的交段 [t_near, t_far] 2. C ← 0; A ← 0; t ← t_near (+ 随机抖动, 见3.1) 3. 当 t < t_far 且 A < 0.98: s ← 三线性采样标量(o + t·d) # 重采样 (rgb, α₀) ← TF(s, 梯度幅值) # 分类 α ← 1 − (1−α₀)^(Δs/Δs₀) # 步长校正 rgb ← 着色(rgb, 梯度, 光源) # 3.3 C ← C + (1−A)·α·rgb; A ← A + (1−A)·α # 合成 t ← t + Δs 4. 像素 ← C 与背景按 A 混合输出
3.2 · 演示 — DVR & MIP

两种合成,两种动画

DVR 与 MIP 走同一条光线、用同一批采样,差别只在合成规则——并排看最清楚。

DVR 累积合成

采样点从前到后依次贡献颜色,前方累积的不透明度 A 不断吃掉后方的权重 (1−A)·α。

DVR 累积:色块自左向右逐个并入,下方 A 曲线爬升,后段贡献被 (1−A) 压小

MIP 取最大

不累积、不混合,只维护一个“至今最大密度”;最终像素等于全程峰值,与峰值出现的位置无关。

MIP:扫描线沿密度曲线前进,下方阶梯线只升不降,锁定全程最大值
本节小结:介质版渲染方程 = 沿线对“发射 × 透过率”积分;离散化就是五步流水线与合成迭代;透过率服从 Beer–Lambert,α 必须随步长指数校正;传递函数是标量→(颜色, α) 的映射,1D 看数值、2D 再加梯度维分边界。
常见坑:预分类把边界糊掉还怪数据差;α 拉满使 DVR 退化成面渲染;TF 每次手调不存预设、结果不可复述;忘了合成顺序与数据走向一致(前向合成才能提前终止)。下一节:3.3 · 光照与着色——积分给出的是“雾”,梯度着色把它变成有立体感的结构。
4.1 — CLASSIC ALGORITHMS

经典算法:同一积分的五种走法

到这里零件齐了:数据与采样(3.1)、积分与传递函数(3.2)、着色(3.3)。把它们组装成完整算法时,按遍历顺序分类最清晰:以图像为序(逐像素发光线)、以对象为序(逐体素投影)、混合方法。实时系统今天几乎全是 GPU 光线投射,但其余路线各有不可替代的场景。

本章位置

大章四第 1 节(4.1):把前三节的零件组装成可比较的完整算法,并分清 DVR / MIP / MPR 三个最常混淆的名字。

前置知识

3.2的主循环伪代码(光线投射就是它的直译);2.1的对象序/图像序概念。

学完能回答

五种算法各自遍历什么、贵在哪?MIP、DVR、MPR 分别回答什么问题、临床上如何分工?

方法原理一句话优势代价 / 局限典型场景
光线投射
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 是空间关系辅助。把三者关系理清,比纠结单个算法更重要。
4.1 · 演示 — ALGORITHM ANIMATIONS

经典算法动画演示

光线投射与步进采样的可调演示在 3.1模拟器(可切换 DVR / MIP / 等值面并调步长);下面是其余四种算法各自的过程动画。

纹理切片 Slicing

一叠平行于视面的切片从前到后依次采样 3D 纹理并硬件混合,视点一动整叠切片跟着重排。

切片:平行切片自前向后逐张亮起并混合成最终图像

抛雪球 Splatting

对象序:每个体素投成带高斯足迹的圆盘 splat,按深度排序后依次泼溅混合,重叠处密度自然叠加。

Splatting:体素逐个投成半透明圆盘,足迹重叠处颜色加深

Shear-Warp 错切变形

先把体数据按视线错切成易逐片扫描的形状,合成中间图后,再 warp 拉回正确视角。

Shear-Warp:网格先被错切倾斜、逐片扫描,再反向 warp 校正回正

Marching Cubes 等值面提取

逐个体元看 8 个角点的标量与阈值关系,查表在边上插值出交点、连成三角片;动画以二维等值轮廓类比三维过程。

Marching Cubes(二维类比):阈值面移动,格子逐个判定内外并连出等值线段
本节小结:遍历顺序决定算法性格:图像序(光线投射)画质与灵活性最好、是现代默认;对象序(Splatting)只碰非空体素;混合(Shear-Warp)是 CPU 时代的最优解;切片法借硬件混合换简单。MIP 取最大、DVR 做积分、MPR 换向重切——不是三种“渲染风格”,是三个不同问题。
常见坑:拿 MIP 图谈深度关系(它根本没有深度);用 DVR 替代断层下诊断结论(见5.1);等值面阈值随手一拉就当测量依据。下一节:4.2 · 体光追——给介质积分加上散射:光开始在雾里弹跳,方程升级为辐射传输方程。
3.1 — VOLUME DATA & SAMPLING

体数据与采样:介质情形从“数据长什么样”开始

链条在这里换轨:前面四节的场景是表面(三角形),从本节起场景是处处有值的三维介质——一个离散采样的标量场。渲染质量的上限在采样之前就定了一半:数据怎么存、间距怎么标、离散格点之间怎么重构出连续场,本节一次讲清;怎么沿光线积分是3.2的事。

本章位置

大章三第 1 节(3.1)。后面五节(传递函数、着色、算法、体光追、加速)全部建立在本节的数据与采样约定上。

前置知识

总览的核心概念(体素、标量场、面渲染 vs 体渲染的区别);1.1的吸收与 Beer–Lambert 直觉。

学完能回答

spacing 错了会发生什么?重构核怎么选?步长为什么必须配 α 校正(能手算)?三种采样伪影各自成因是什么?

基础

体数据的四件套:值、距、位、向

  • 值:每体素一个标量,CT 常用 16-bit 存 HU(含负值偏移),用 8-bit 截断会直接丢诊断信息
  • 间距 spacing:面内像素距与层厚常不同(各向异性),渲染与测量都必须按真实间距换算,否则结构被拉长、距离测错
  • 原点与方向:体数据在世界/病人坐标系中的位置与朝向,多体融合(4.3)与手术导航全靠它对齐
  • 规模感:512×512×800 的薄层 CT 已约 2 亿体素、16-bit 即 400MB——这就是4.3砖块调度的由来
采样

重建滤波:格点之间靠“猜”,猜法有讲究

采样点几乎总落在体素之间,把离散格点恢复成连续函数的过程叫重构,用的权重模板叫重构核:

  • 最近邻:最快,阶梯与块状伪影明显,只适合掩膜类标签数据
  • 三线性:默认选择,连续但偏糊,高频被平滑——多数场景够用
  • 三次 B-spline / Catmull-Rom:更锐利、梯度更连续,代价是计算量与可能的过冲(ringing),过冲在阈值附近会造出假边界
  • 与 CT 重建核分清:扫描端的重建核决定原始数据的锐度,渲染端的重构核只决定采样时的插值,两者不互相替代
伪影

采样不足的三种典型伪影

  • 漏采:步长跨过薄壁与细血管,结构直接消失——模拟器里把步长调大切等值面模式就能复现
  • 木纹 / 阶梯:采样点在等值附近周期性对齐,出现年轮状条纹,预积分(4.3)是正解
  • 混叠闪烁:旋转交互时高频结构逐帧跳变,本质与面渲染的锯齿同源,靠抖动采样 + 时域累积压制

经验起点:步长取体素尺寸的 0.5–1 倍;先保证不漏,再谈提速。

采样

抖动采样:把规则伪影打散成噪声

固定步长让误差呈规则图案,人眼对规则图案极其敏感。给每条光线的采样起点加一个随机偏移(jitter),伪影被打散为均匀噪声,再靠多帧累积平均掉——这是交互 DVR 与体路径追踪(4.2)共用的基本招式:宁要可平均的噪声,不要成图案的错误。

3.1 · 实验 — INTERACTIVE

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

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

光线行进模拟器

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

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

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

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

A = 0.00 · 透过率 100%

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

算例:步长改了,α 必须跟着改

传递函数给出的 α 永远对应一个参考步长 Δs₀。设某组织在 Δs₀=1mm 时 α₀=0.55。步长减半到 0.5mm 时若直接用 0.55,每毫米走两步、等效遮挡翻倍,图会整体变“厚”。正确校正来自 Beer–Lambert(3.2):

  • α′ = 1 − (1−α₀)Δs/Δs₀ = 1 − (0.45)0.5 = 1 − 0.671 = 0.329
  • 验证:两步合成 1 − (1−0.329)² = 1 − 0.450 = 0.550 ✓ 与原步长一致
  • 步长放大到 2mm:α′ = 1 − (0.45)² = 0.798,同理自洽
在右侧模拟器里拖步长滑杆:实现内部正是按这条公式换算的。忘了校正是 DVR 最常见的 bug,症状是“改步长 = 改亮度”,常被误诊为传递函数没调好。
导航

本节只讲采样,细节各有归属

为避免重复定义,这里只立采样约定,展开在对应节:

  • 重构核(三线性 / B-spline / Catmull-Rom 的取舍)→ 本节前半已讲全
  • 预积分(用区间积分替代单点采样)→ 4.3,与自适应采样一起讲
  • 提前终止 / 空间跳跃 / 砖块调度 → 4.3,按“先正确、再加速”的顺序排
  • 抖动采样的另一半(时域累积去噪)→ 4.2与路径追踪一起讲
本节小结:体数据 = 值 + 间距 + 原点 + 方向四件套;采样点靠重构核从格点“猜”出连续值;步长决定漏采与伪影形态,且必须与 α 校正成对出现;抖动把规则误差打散成可平均的噪声。
常见坑:用 8-bit 截断存 HU 直接丢诊断信息;忽略各向异性 spacing 把结构拉长、距离测错;标签掩膜用了三线性插值造出不存在的中间类。下一节:3.2 · 传递函数——数据有了,怎么决定“看见什么”:体渲染积分写全并逐步算一遍。
3.3 — SHADING & QUALITY

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

3.2的积分只给出一团带颜色的雾——每个采样点的颜色是平的。立体感主要来自着色:把表面的那套光照(2.1的 Phong/BRDF)借到介质采样点上,而介质里恰好有一样表面没有的东西:标量场的梯度。

本章位置

大章三第 3 节(3.3):给3.2的合成迭代补上伪代码里“着色”那一行的全部内容。

前置知识

3.2的主循环;2.1的 Phong 与法线概念(本节会把同一公式在介质里再用一遍)。

学完能回答

梯度为什么能当法线(能手算一个采样点的梯度与漫反射)?AO、单次散射阴影、多次散射的成本各差几个量级?

梯度 = 免费的法线

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

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

进阶光照(按成本排序)

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

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

采样点着色 · BLINN–PHONG(介质版)
I = ka + kd·max(0, N·L) + ks·max(0, N·H)n, N = −∇f/|∇f|

符号:∇f 采样点处标量场梯度,取负并归一化得“法线” N(指向密度下降方向,即朝向观察者一侧的表面朝向);L 指向光源的单位向量;H 光源与视线方向的半角向量(Blinn 形式,比 Phong 的反射向量更稳);ka/kd/ks 环境/漫反射/镜面系数;n 高光指数,越大光斑越锐。点积 N·L 就是渲染方程里的 cosθ 在采样点的落地。

算例:一个采样点的梯度与着色

采样点沿 x 的邻居标量为 f(x−1)=80、f(x+1)=120,中心差分 ∂f/∂x = (120−80)/2 = 20;同理 ∂f/∂y=−6、∂f/∂z=10。梯度 ∇f=(20, −6, 10),幅值 √(400+36+100)=√536≈23.2,法线 N = −∇f/23.2 ≈ (−0.86, 0.26, −0.43)——指向密度降低的一侧。

  • 设光源在观察者正前方:L 恰与 −N 同向时 N·L 取到最大;取本例数值 N·L = 0.86,漫反射项 kd·0.86 = 0.7×0.86 ≈ 0.60
  • 镜面项:H 与 N 夹角若使 N·H=0.43,取 n=32:0.4332 ≈ e−27 ≈ 0——高光只在法线接近半角方向时才出现,偏一点就归零,这就是高光锐利的原因
  • 梯度幅值 23.2 还可同时喂 2D 传递函数(3.2):幅值大 = 处于组织边界,正是着色与分类共用一份计算的由来
读法:介质没有表面,梯度是唯一能提供“朝向”的量。梯度估计一噪(锐重建核、金属伪影),法线就乱跳,着色会满屏闪点——先平滑梯度,再谈光照档次。
本节小结:梯度即法线,Phong/Blinn–Phong 直接搬进采样点;画质阶梯是梯度着色(几乎免费)→ 体 AO(预计算)→ 单次散射阴影(再积分一遍)→ 多次散射(4.2路径追踪),每上一级成本涨一个量级。
常见坑:梯度不平滑就开高光,得到满屏噪点;AO 强度拉满把腔体压成死黑、丢层次;给 DVR 套 PBR 材质语义——体素颜色是 TF 人为赋值,不服从金属度/粗糙度的物理约束。下一节:4.1 · 经典算法——把积分、采样、着色组装成完整算法时,有哪几条路线可选。
4.2 — VOLUME RAY TRACING & PATH TRACING

体光追:当光线开始在介质里“弹跳”

前面几节的 DVR 只算吸收与发射:光沿直线进、直线出——等价于把1.1渲染方程里的散射项设为零。体光追把散射请回来:光在介质中被粒子偏转、被遮挡、多次弹跳后再到达眼睛,方程升级为辐射传输方程(RTE)。这正是2.3的全局光照方法族在介质中的对应版。画质上限打开了,成本与可控性是另一笔账。

本章位置

大章四第 2 节(4.2):把2.3(路径追踪、蒙特卡洛、去噪)与2.2(次级光线、阴影光线)的方法搬进连续介质。

前置知识

3.2的发射–吸收积分与 Beer–Lambert;2.3的蒙特卡洛估计量(公式在那一节,本节直接用)。

学完能回答

σa、σs、σt、反照率各是什么?HG 相函数的 g 怎么影响散射方向(能手算)?Delta Tracking 为什么需要“空碰撞”?

光追

体光线追踪:在 DVR 之上加“次级光线”

结构仍是以像素为序发主光线沿线积分,但每个采样点不再假设“光源直达”,而是再向光源发一条阴影光线、在介质中积分出这段路的透过率,得到真实的体积阴影;需要反射/折射感时还可按散射方向继续追踪。这就是把面光追的次级光线思想搬进连续介质:

  • 主光线管“看见什么”,阴影光线管“被挡了多少”——后者本身又是一次体积分,成本近乎翻倍起步
  • 确定性、无随机噪声、同输入必同输出,这是它与体路径追踪的根本分野,也是它在交互与临床预览中仍在用的原因
  • 散射通常只算单次散射:光源→介质中一点→眼睛,只弹一次;多次弹跳交给路径追踪
光学

参与介质:三个系数说清一团雾

光学上把能与光相互作用的介质叫参与介质(Participating Media)。其行为由辐射传输方程(RTE)描述,工程上抓三个量就够:

  • 吸收系数 σa:光被介质吞掉变热的比例
  • 散射系数 σs:光被偏转改向的比例;σa+σs = 消光系数 σt,决定平均自由程(光平均走多远发生一次作用)
  • 单散射反照率 Λ = σs/σt:一次作用是散射还是吸收的概率。Λ≈0 是烟尘(吸光发黑),Λ≈1 是云雾(散射发白)
  • DVR 的 α 本质就是把 σt 沿步长积分后的不透明度——发射–吸收模型相当于令 σs=0 的特例
光学

相函数:散射往哪个方向偏

散射不是均匀改向。相函数 p(θ) 给出光被散射到与原方向夹角 θ 的概率分布,是介质的“方向指纹”:

  • 各向同性:各方向等概率,p 恒定,最简单、也最少见于真实介质
  • Henyey–Greenstein(HG)相函数:业界标准近似,只用一个参数 g ∈ (−1, 1):g>0 前向散射为主,g<0 后向为主,g=0 退化各向同性
  • 生物组织强前向:软组织 g 常在 0.8–0.95,光在组织里像在浓雾中打手电——大多继续向前、少量扩散,这决定了光学成像在组织中的穿透与模糊形态
  • 采样时按相函数的重要性采样决定下一弹方向,g 估错,亮度分布与“通透感”都会整体偏移——它是个物理参数,不是美术滑杆
光追

体路径追踪:蒙特卡洛解辐射传输方程

路径追踪不在固定步长上积分,而是随机采样光的命运:按消光分布抽一个自由程长度,前进到作用点,按反照率决定被吸收终止还是按相函数抽新方向继续弹,直到命中光源或被俄罗斯轮盘赌终止。每像素重复成百上千条路径取平均,统计上收敛到 RTE 的解:

  • Delta Tracking(木材追踪):非均匀介质里自由程不好直接抽样——先假设一个偏大的均匀 σmax 抽候选作用点,再按真实 σ 与 σmax 之比概率接受,拒绝则视为“空碰撞”继续前进。是体路径追踪的支柱算法
  • Ratio / Null-collision 透过率估计:阴影光线的透过率也能用同样的空碰撞技巧无偏估计,不必再步进积分
  • 收益:多次散射、焦散、介质内全局光照全部自然出现,无步长伪影
  • 代价:方差即噪声,收敛速度 ∝ 1/√N——降一半噪声要四倍采样
光追

蒙特卡洛采样与去噪:与噪声共处

  • 重要性采样:自由程、相函数、光源方向都按其贡献概率多采,把样本花在刀刃上,直接降方差
  • 多重重要性采样(MIS):同一束光可由“采光源”或“采相函数”两条路到达,按权重合并两者估计,避免任一路在特定几何下爆方差
  • 去噪(Denoising):低 spp 渲染 + 时域累积(历史帧重投影)+ 空域/学习型滤波,已是实时路径追踪的实际形态;引导采样则用粗估计先学出“哪里值得多采”再正式渲
  • 去噪的边界:滤波器会平滑真实高频、也可能在欠采样区“补”出不存在的结构——娱乐画面无所谓,测量画面这是红线(见本节末)
光学

散射次数决定“质感家族”

  • 零散射:即 DVR 发射–吸收,介质像自发光的彩色玻璃——医学 DVR 所在家族
  • 单次散射:出现真实体积阴影与光束(丁达尔效应),云层边缘、探照灯光柱属此类,体光线追踪的典型档位
  • 多次散射:光在介质内弹跳弥散,云变白变软、烟变厚、皮肤与牛奶的次表面散射(SSS)本质是致密介质中的多次散射——只能路径追踪或专用近似
  • 判断口诀:介质越“白、厚、软”,多次散射占比越高,越不能用 DVR 的直线模型糊弄
HG 相函数 · HENYEY–GREENSTEIN
p(θ) = (1/4π) · (1 − g²) / (1 + g² − 2g·cosθ)3/2

符号:θ 散射方向与原方向的夹角;g 各向异性参数,等于散射角余弦的平均值 ⟨cosθ⟩,范围 (−1, 1):g→1 几乎全向前散射,g=0 各向同性,g<0 偏后向。它是介质的物理参数(由粒子大小与折射率决定),不是调“通透感”的美术滑杆。

算例:g=0.9 的组织,光往哪散

  • 正前方 θ=0:cosθ=1,分母 (1+0.81−1.8)3/2 = (0.01)1.5 = 0.001 → p(0) = (1/4π)×0.19/0.001 ≈ 15.1
  • 正后方 θ=π:cosθ=−1,分母 (1+0.81+1.8)3/2 = (3.61)1.5 ≈ 6.86 → p(π) ≈ (1/4π)×0.19/6.86 ≈ 0.0022
  • 前向概率密度是后向的约 6900 倍
这就是“光在组织里像浓雾中的手电”:绝大多数光子继续向前、只略微扩散。路径追踪采样下一弹方向时必须按这个分布抽——把 g 从 0.9 误设为 0,亮度分布与穿透形态会整体错误,而且错得不像噪声、像“另一种组织”。
维度光线投射 DVR(第三、五节)体光线追踪体路径追踪
光照模型发射–吸收,σs=0,可选梯度着色与 AO 近似吸收 + 单次散射,阴影光线积分透过率完整 RTE:多次散射、介质 GI、焦散
确定性确定性,同参数同结果确定性,同参数同结果随机性,结果含噪声,随种子与 spp 变化
误差形态步长与插值误差,成图案、来源可分析同左,另加阴影光线步长误差无偏但高方差:误差是噪声,去噪可能引入偏差
成本最低,实时交互标配中—高,采样点×光源数倍增最高,离线或低 spp + 去噪的实时近似
典型场景医学 DVR、科学可视化交互需要真实体积阴影的高质量预览、光学仿真影视云雾烟火、光学/辐射传输科学计算的参考解
诊断场景的保真边界(体光追版):① CT/MRI 体素存的是 X 线衰减与磁共振信号,不是光学散射系数——把 σs、g 参数套上去,是给数据披一件物理外衣,参数来自假设而非测量,渲染再“真实”也不增加一分诊断信息;② 路径追踪的随机噪声与去噪平滑会改变小结构的可见性,且同参数两次结果未必逐像素一致,与诊断要求的可复现性冲突;③ 因此临床链路仍是确定性的 DVR + 断层联读(5.1),体光追的正当用途是光学成像仿真(如 OCT、光学分子成像的前向模拟)、教学演示与影视科学画面——在那里介质的光学参数本身就是被研究、被标定的对象。

体光线追踪:阴影光线积分

主光线每到一个采样点,就向光源发阴影光线,在雾中积分出透过率——被浓雾挡住的点贡献被压暗。

体光追:采样点向光源发阴影光线,穿雾越浓、透过率越低、该点越暗

体路径追踪:散射随机游走

光子在介质中按自由程前进、按相函数改向(随机游走);叉号是 Delta Tracking 的空碰撞——被拒绝、不改方向、继续前进。

体路径追踪:粒子在雾中多次散射改向,空碰撞(×)不终止路径,最终逃出或被吸收
本节小结:参与介质三系数 σa/σs/σt + 相函数 p(θ) 完整描述介质;体光线追踪 = DVR + 阴影光线积分(确定性、单次散射);体路径追踪 = 蒙特卡洛采样自由程与散射方向(无偏、高方差、多次散射),Delta Tracking 是它在非均匀介质里的支柱。
常见坑:把 CT 的 HU 当光学系数套 σ 与 g——参数来自假设而非测量;低 spp 不去噪就下结论,或去噪过头把真实小结构抹平;两次路径追踪结果逐像素对不上就以为程序坏了(随机性是本性,要比就固定种子与 spp)。下一节:4.3 · 加速与工程——回到确定性 DVR,把速度与规模做到工程可用。
4.3 — ACCELERATION & ENGINEERING

加速与工程:先正确,再快,最后大

前五节讲的是“算什么”,本节讲“怎么算得起”。顺序是刻意的:正确性(积分与校正)→ 单帧加速(提前终止、空间跳跃、预积分)→ 规模(砖块调度、多体与 4D)。顺序反过来,先做的加速会把正确性 bug 藏进结构里,极难定位。

本章位置

大章四收官节(4.3)。所有技巧都建立在3.2主循环之上,只是让它少采、采准、或喂得进显存。

前置知识

3.2的主循环与提前终止的数值依据(累积表);2.2 BVH 的剪枝思想(空间跳跃是它的体素版)。

学完能回答

提前终止阈值为什么取 0.98 而不是 1?TF 一改哪些加速结构要重算?数据大过显存时砖块如何调度?

进阶

预积分:用区间代替单点

单点采样默认一个步长内密度恒定,步长稍大就出木纹、阶梯与薄壁漏采。预积分离线把“从标量 sf 到 sb、长度 Δs 这段介质积多少分量”算进查找表:2D 表存颜色与 α 的区间积分,渲染时用步段前后两个标量查表。

  • 收益:同一步长下可分辨的 TF 高频大幅提升,峰越尖锐收益越大
  • 代价:表需随 TF 变化重算(可 GPU 增量更新);假设段内标量线性变化,强非线性仍会漏
  • 与自适应采样互补:预积分管“段内准不准”,自适应管“段划多长”
  • 延伸:多维预积分可把梯度也纳入,但表维度爆炸,实际系统多止步于 2D
进阶

空空间跳过:不采样的采样最快

造影血管、分割掩膜这类数据,90% 以上体积对当前 TF 是全透明的。空间跳跃预先为每个空间块记录标量 min–max,经 TF 得到该块的最大可能 α;若为 0,光线整段跳过。

  • 宏单元 / 砖块 min-max:实现最简单,块大小是粒度与内存的权衡,常用 8³–32³
  • 八叉树 / SVO:层级跳跃,大片空区一次跳过,适合极稀疏数据;构建与遍历成本更高
  • 距离场跳跃:存到最近非空体素的距离,球内安全步进,对细管状结构尤其有效
  • 注意:TF 一改,min-max 的有效性就要重算——把 TF 相关的跳跃结构与 TF 无关的标量结构分开存,才能交互改 TF 不卡顿
进阶

提前终止的细节:阈值不是 1.0

前向合成才有提前终止:累积 A 越过阈值后,后方贡献低于人眼/量化可分辨范围,继续采样纯浪费。工程上阈值常取 0.98–0.995(对应 8-bit 输出的半个到一个量化级),比等到 1.0 省得多、画质无可感差异。

  • 后向(Back-to-Front)合成不能提前终止——这是选前向顺序的决定性理由
  • GPU 上按 warp/wavefront 批量终止:单条光线停了不省钱,整组都停才真正释放算力,需配合光线重排或分批
  • 与跳跃叠加顺序:先跳空、再早停,两者收益相乘,是大数据的标准组合
进阶

多体与时变体数据

多体融合:CT + PET、双能量 CT、术前 MRI + 术中数据叠加显示,前提是空间配准对齐到同一坐标系。融合策略分两层——采样层每条光线在每个体里各采一次、各自查 TF;合成层按优先级或混合权重合并。难点不是渲染,是配准误差会直接变成重影,融合图必须能随时切回单体核对。

时变(4D)体数据:心脏周期、呼吸门控、造影剂流入过程,多出一维时间。做法包括关键帧插值、按相位预加载砖块、时间维也做 min-max 跳跃。交互原则:播放时降分辨率保流畅,暂停定格时渐进渲满——与静态大数据的渐进策略同构。

进阶

梯度与光照细节

  • 梯度估计算子:中心差分最便宜但最噪;Sobel / 高斯导数模板用邻域平滑换稳定法线,边界法线抖动明显减少。梯度可在预处理时算好存盘(省运行时算力、费显存),或采样点现算(反之)
  • 梯度幅值调制不透明度:均匀区梯度低,适当压低其 α 能去雾感、突出界面,是 2D TF 之外的常用小技巧
  • 方向性环境遮蔽:不止存一个 AO 值,而是按方向存遮蔽,旋转视角时腔体明暗随之变化,立体感远胜标量 AO
  • 半角切片光照(Half-Angle Slicing):切片法里按光源与视线半角方向切分体积做阴影近似,是切片路线获得体积阴影的经典解
  • 阴影的取舍:单次散射阴影需沿光线再积分一遍到光源,成本近乎翻倍——临床 DVR 多用 AO 代替,影视级科学渲染才上全阴影
进阶

GPU / WebGPU 加速全景

  • 3D 纹理 + 硬件三线性:体数据存 3D 纹理,采样与插值由硬件免费完成,是所有 GPU DVR 的地基;注意纹理尺寸上限与格式精度(HU 值需 16-bit 或归一化映射,别丢精度)
  • 片段着色器光线行进:经典 WebGL 路线:渲代理盒的背面位置作光线起点,片段内步进。简单、兼容好,但步进循环与早停受限于图形管线
  • 计算着色器(WebGPU / Vulkan / CUDA):脱离光栅管线,可做光线排序、工作队列、砖块按需加载与复杂跳跃结构,现代高性能实现的主场;WebGPU 让这套能力第一次完整进入浏览器
  • 超显存数据:砖块(brick)分页 + LRU 调度 + 视点预测预取,缺砖时先用低分辨率父节点顶替再渐进替换
  • 压缩:运行时用块压缩或量化 + 熵编码降带宽,但诊断数据压缩必须可验证无损或误差有界,不能为流畅牺牲数值
  • 渐进/时域累积:交互时低采样 + 抖动,静止时逐帧累积收敛——把 TAA 的思想搬到体积积分上
进阶优化的先后顺序:先保证积分与 α 校正正确 → 再开提前终止 → 再做 min-max 空间跳跃 → 然后才是预积分提画质与砖块调度扩规模。顺序反过来(先跳跃后查对错)会把正确性 bug 藏进加速结构里,极难定位。
本节小结:提前终止省“看不见的后半程”,空间跳跃省“全透明的整段路”,预积分让同样的步数算得更准,砖块 + LRU + 渐进细化让超显存数据可交互——四者收益相乘,但前提是主循环本身先正确。
常见坑:TF 改了不重算 min-max,跳过本应可见的组织;整组光线里单条早停却不见提速(GPU 按 warp 执行,要整组停);诊断数据用有损压缩换流畅,数值边界被悄悄搬动。下一节:5.1 · 应用与对照——把全书方法放回真实场景:医学读图链路、新方法分工与选型总表。
5.1 — APPLICATIONS & METHOD SELECTION

应用与对照:方法回到场景里选

全书收官节(5.1)。前面十节把方法讲透,本节只做两件事:把方法放回医学读图这条真实链路里看位置与红线;再给一张选型总表,让“什么问题用什么方法”有据可查。先把临床工作流摆正,再谈新方法:渲染图是读图的辅助层,不是诊断的证据层。

本章位置

全书终点。前十节的每个方法都会在本节的选型表里找到自己的位置;术语拿不准随时回术语表。

前置知识

4.1的 DVR / MIP / MPR 分工;4.2的保真边界讨论。

学完能回答

一例术前规划该按什么顺序用断层、MIP、DVR?NeRF/3DGS 为什么进不了诊断链路?给一个新问题,你能独立完成选型吗?

实践

一条规范的读图顺序

  • 断层定性质:在原始轴位与 MPR 断层上找病灶、测大小、读 HU 值——这一步的数值直接进入报告
  • DVR/MIP 看关系:切到体渲染与投影图确认病灶与血管、器官、骨骼的空间关系,服务于术前规划与沟通
  • 窗宽窗位先行:肺窗、纵隔窗、骨窗是标量到灰阶的线性映射(3.2传递函数的特例),窗选错,再好的渲染也看不见目标组织
  • 参数可复述:TF 预设、投影厚度、视角都应能写进记录——换个人用同样参数要能复现同一画面
实践

临床使用中的四个陷阱

  • 半透明稀释:DVR 叠加会摊薄小病灶对比度,渲染图上“没有”不等于断层上没有
  • 阈值造影:等值面与 MIP 的阈值/窗位选择能凭空造出或抹掉一段血管狭窄,结论必须回原始数据核对
  • 伪影入画:金属、运动、束硬化伪影在体渲染里常被渲染得像真实结构,越立体越容易误信
  • 美化滤波:平滑、去噪、超分让图更“干净”的同时也可能搬动边界——诊断链路只用可验证的处理
5.1(续) — TRADITIONAL vs NEURAL

新方法对照:传统体渲染与神经渲染

NeRF 与 3D Gaussian Splatting 改变了新视角合成,但它们和 DVR 解决的不是同一个问题。分清“拟合外观”与“呈现测量数据”,就不会用错工具。

维度传统体渲染(DVR)NeRF 类神经辐射场3D Gaussian Splatting
输入已标定的体数据:CT/MRI 体素值本身就是测量结果多视角照片 + 相机位姿,体密度与颜色由网络拟合同为多视角照片,显式高斯基元的位置/协方差/颜色由优化拟合
“密度”的语义α 由传递函数从真实标量映射,可回溯到 HU 等物理量网络输出的 σ 只为重现照片,无物理单位、不可标定高斯的不透明度同为拟合参数,优化目标只有图像重建误差
能做什么任意视角、任意切面、任意 TF 重映射,随时回到原始数值核对训练视角分布内的新视角合成出色;分布外与无观测区域会编造内容实时新视角合成,速度远胜 NeRF;同样只在观测覆盖内可信
误差形态误差可分析:采样、插值、TF 选择,来源明确、可复现误差是数据驱动的:欠观测处平滑或幻觉出结构,外观合理但未必真实,且难以给出误差界
适用医学诊断辅助、科学测量、工业 CT 检测——一切要对数值负责的场景实景三维重建、文博数字化、影视预演等外观优先场景实景漫游、电商与空间展示等实时外观场景
诊断红线

诊断场景:原始数据保真压倒一切

诊断判读的对象是测量值本身:一个结节的有无、一个 HU 值的高低,直接对应后续处置。任何“看起来更清晰”的生成式增强,只要改动了数值或补出了未观测结构,就破坏了证据链。因此:

  • 神经方法可以做导航与展示(如自动找最佳观察角度),不能替代原始体数据的呈现与测量
  • 超分、去噪类学习方法用于诊断前,必须有任务级验证与误差说明,并保留一键回看原始数据的路径
  • DVR 的半透明合成同样会稀释小病灶对比度——所以临床规范是 DVR 看关系、断层定性质,两者联读而非二选一
对照

不是替代,是分工与互补

  • 学习做加速:用网络预测重要性采样位置、跳跃图或降噪——数值仍由传统积分算出,保真边界不变,这类结合在诊断场景也可接受
  • 学习做重建前端:稀疏视角 CT 重建等任务中,学习先验参与从投影到体数据的重建——此时它属于重建算法,要按重建的标准验证,而非按渲染的标准放行
  • 外观场景放心用神经:照片重建的实景没有“原始体素”要保,NeRF/3DGS 的自由视角与真实感正是 DVR 给不了的
  • 判断口诀:数据是测出来的 → 传统积分;场景是拍出来的 → 神经拟合。
5.1(续二) — METHOD SELECTION

方法选型总表:按问题选,不按新旧选

全书方法的最终对照。先问数据从哪来、结论要不要对数值负责,再对号入座。

你的问题选这个为什么出处
实时交互的表面场景(游戏、漫游)光栅化(+ 探针/屏幕空间 GI,关键效果补光追)唯一能稳定每秒 60 帧的路线;间接光用预计算与近似补,成本可控2.1、2.3
要真实的反射/折射/阴影质量,又要接近实时混合管线:光栅化打底 + 光线追踪次级光线是光追的原生能力;每像素 1–4 条光线 + 去噪是当前预算甜点2.2
影视级画面或光传输的科学参考解路径追踪(表面)/ 体路径追踪(介质)无偏估计渲染方程/RTE,误差形态只有噪声、可随样本收敛,其余方法以其为标尺2.3、4.2
医学体数据的诊断判读断层/MPR 定性质 + DVR/MIP 看关系判读对象是测量值本身;确定性积分可复现,参数可复述,误差来源可分析4.1、本节前半
造影血管快速筛查看走行薄层 MIP(必要时 MinIP 看气道)最高密度结构最醒目、计算最便宜;深度判断再切 DVR/断层补4.1
要硬边界模型:测量、3D 打印、手术规划Marching Cubes 等值面 + 光栅化输出三角网格才能进测量与制造链路;阈值选择必须回原始数据核对4.1
多视角照片重建实景、自由漫游展示NeRF / 3DGS没有“原始体素”要保真,外观与速度正是它们的强项;观测覆盖外不可信本节前半
数据大过显存还要交互DVR + 砖块分页 + 多分辨率渐进方法不用换,换的是数据调度:缺砖先用父节点顶替、停稳后细化4.3
全书小结:一条方程(1.1)→ 表面三解:光栅化近似、光追精确、GI 完整(2.1–2.3)→ 介质六步:数据、积分与 TF、着色、算法、散射、工程(3.1–4.3)→ 回到场景选型(本节)。所有方法的差别,最终都是“积分在哪算、算多准、误差长什么样”的差别。
常见坑(选型版):按“新”选方法而不是按问题选;拿展示用的神经重建图去量测;渲染图好看就跳过断层核对。回到导读可以按这条链从头再走一遍,或从术语表查任何拿不准的词。
2.1(补齐) — ANIMATION COMPLETION

补齐演示:变换链、裁剪、透视校正、纹理与管线对照

以下四张卡按统一模板(概念 → 公式 → 动画 → 手算 → 坑 → 关系)补齐本节此前只有文字的过程;正文原有定义不重复,以首次出现处为准。

演示补齐 · 统一模板

MVP 变换链:四个矩阵依次左乘

概念顶点从模型空间到屏幕要过四道变换,每道只做一件事:摆位、换观察者、压成视锥、归一化。

公式pclip = P · V · M · plocal;NDC = pclip.xyz / pclip.w。

MVP 变换链:立方体依次左乘 M、V、P 并做透视除法,逐步压扁到 NDC

手算 / 读图点 (1,0,0,1) 经 M 平移 (2,0,0) 得 (3,0,0,1);只看 x:每步都是线性组合,手算时先写齐次坐标再逐乘。

常见坑把乘序写反(M·V·P)是最常见的黑屏原因;透视除法忘了做,深度与插值全错。

与其他算法的关系这条链的输出正是本节正文光栅化的输入;体渲染没有 MVP 链,它直接在世界空间沿光线采样。

演示补齐 · 统一模板

裁剪与背面剔除:先扔掉看不见的

概念投影后、光栅化前:视锥外的图元被裁成与视锥的交集,背向相机的三角形整片剔除,两步都发生在插值之前。

公式裁剪在齐次空间做:−w ≤ x,y,z ≤ w;背面判定看屏幕空间有向面积的符号。

裁剪与背面剔除:三角形滑入视锥被裁,只剩交集;背面三角形被整片剔除

手算 / 读图一个三角形 3 个顶点有 1 个在锥外,裁剪后变成四边形、再切成 2 个三角形——顶点数会变,这是正常的。

常见坑绕序(winding)设置与模型导出不一致时,正面会被当背面剔光,画面像被剥了皮。

与其他算法的关系剔除是“整片扔”,裁剪是“切齐”;两者与4.3的空空间跳过同理:都是先证明无贡献,再跳过。

演示补齐 · 统一模板

透视校正插值:为什么要除以 w

概念屏幕上等距的像素在 3D 里不等距。属性必须先除以 w 插值、再除回去,纹理才不会在斜面上“游泳”。

公式a = ( Σ ai/wi · λi ) / ( Σ 1/wi · λi ),λ 为重心坐标(定义见本节正文算例)。

透视校正对比:上排朴素插值格子越拉越宽,下排 1/w 校正后等距

手算 / 读图中点 λ=0.5、两端 w=1 与 w=3:朴素插值给属性中点 0.5,校正后是 (0/1+1/3)/(1+1/3)=0.25——差一倍。

常见坑早期硬件为省成本省掉校正,斜面纹理扭曲成了时代标志;现代 GPU 在硬件里默认校正,关不掉也不该关。

与其他算法的关系重心坐标负责“权重”,透视校正负责“权重在 3D 里是否公平”;体渲染的三线性插值没有 w,因为它不在投影空间工作。

演示补齐 · 统一模板

纹理采样与 mip 链:远处用糊图不是偷懒

概念纹理被缩小时,一个像素覆盖许多纹素,不预先平均就会闪烁。mip 链把每级缩小一半的版本预存好,按足迹选层。

公式层级 λ = log2(足迹边长);三线性 = 层内双线性 + 相邻两层线性混合。

纹理与 mip:表面变远时高亮层级从 mip 0 滑向 mip 3, texel 逐渐变大块

手算 / 读图纹理 1024² 缩到屏幕上约 32 像素宽:足迹 ≈32,λ≈5,直接选 mip 5(32²)——查表代替 1024 次采样。

常见坑只开双线性不开 mip 切换会出现层间接缝;各向异性关太低,斜着看的地面会糊成一片。

与其他算法的关系mip 是“为采样预平均”,与3.2的预积分同构:都是把一段区间的结果预先算好存表。

演示补齐 · 统一模板

前向 vs 延迟 vs Forward+:光照在哪一步付账

概念三者不改变成像,只改变“逐光源算光照”的付账位置:前向按物体付、延迟按像素付、Forward+ 先按 tile 分拣光源再按像素付。

公式成本:前向 ≈ 物体×光源;延迟 ≈ 像素×光源(与场景复杂度脱钩);Forward+ ≈ 像素×本 tile 光源。

管线对照:前向逐物体点亮、延迟先写 G-Buffer、Forward+ 按 tile 只点亮局部光源

手算 / 读图100 个物体 × 50 盏灯:前向最坏 5000 次光照求值;延迟与物体数无关,改为每像素 50 次;Forward+ 若每 tile 只剩 6 盏灯,就是每像素 6 次。

常见坑延迟渲染带宽吃紧、透明物体要前向补渲、MSAA 难以叠加——没有哪条管线是全赢的。

与其他算法的关系体渲染的 DVR 是天然“延迟”的:先采样后合成;把 Forward+ 的分拣思想搬到体数据,就是4.3的砖块调度。

2.2(补齐) — ANIMATION COMPLETION

补齐演示:SAH 切分、级联阴影与 PCSS、TAA 对比

BVH 遍历动画在本节正文;这里补它缺的另一半——树是怎么按 SAH 建出来的,以及阴影与抗锯齿的进阶形态。

演示补齐 · 统一模板

SAH 构建:BVH 的每一刀都按代价切

概念建树时每个候选切分面都算一笔账:下钻成本 + 左右子盒按面积加权的求交成本,取代价最小的那一刀。

公式C = Ctrav + (SL/S)·NL·Cisect + (SR/S)·NR·Cisect(符号见正文算例)。

SAH 切分:8 个候选面的代价柱状图,最低者(橙)被选为本层切分

手算 / 读图左盒面积比 0.3、含 2 个三角形,右盒 0.7、含 10 个:C≈1+0.3×2+0.7×10=8.6;换一刀 0.5/0.5 与 6/6:C≈7——后者更优,即使左右不均被打破。

常见坑只按三角形数量对半切(中位数切分)会切出面积悬殊的盒,光线大概率全落进大盒,树形同虚设。

与其他算法的关系SAH 决定树的“形”,正文的遍历动画决定树的“用”;体数据的八叉树(4.3)用的是同一思想的体版本。

演示补齐 · 统一模板

阴影映射进阶:CSM 分级 + PCSS 软半影

概念大场景一张阴影图不够分:按距离把视锥切成几级、近处给高分辨率;半影宽度不该是常数,它随遮挡距离变大——PCSS 就按这个关系调滤波半径。

公式半影宽 ∝ (接收点距 − 遮挡距) / 光源距 × 光源尺寸;CSM 每级独立算这组参数。

CSM 与 PCSS:视锥被切成三级级联,地面影斑随遮挡距离变宽变软

手算 / 读图光源角直径约 0.05 rad、遮挡物离地面 2 m:半影宽 ≈ 2×0.05 = 0.1 m——固定半径滤波要么近处太软、要么远处太硬。

常见坑级联切换处会有可见的分辨率跳变,需要级间混合带;bias 太大漏光、太小满脸 acne,仍是阴影映射的老账。

与其他算法的关系体渲染里的阴影更贵:遮挡不是一张深度图,而要沿光源方向再积一次透过率(见4.2)。

演示补齐 · 统一模板

TAA 与抗锯齿谱系:MSAA / FXAA / TAA 各补什么

概念MSAA 只补几何边缘的覆盖率、FXAA 只补已成图的边、TAA 用时间换采样:每帧抖动亚像素位置,再把历史帧重投影回来累积。

公式TAA 输出 ≈ α·本帧 + (1−α)·重投影历史,α 常取 0.05–0.2,并用邻域颜色钳制压拖影。

抗锯齿对比:左侧边缘逐帧跳格闪烁,右侧 TAA 抖动累积后稳定平滑

手算 / 读图静止画面下 TAA 累积 16 帧 ≈ 16 倍采样,噪声/锯齿按 1/√16 = 1/4 下降;物体一动,历史失效的像素要靠速度缓冲剔除重来。

常见坑把 TAA 当万能药会糊 UI 与细文字;透明与粒子没有可靠深度,历史重投影最容易在这些地方穿帮。

与其他算法的关系正文的 AA 动画讲覆盖率(空间),这张讲时间维;体渲染的渐进细化是 TAA 思想在积分上的版本。

2.3(补齐) — ANIMATION COMPLETION

补齐演示:IBL 与探针、俄罗斯轮盘赌

路径追踪、光子映射、辐射度的动画在正文;这里补环境光照的工程落地与路径终止的无偏技巧。

演示补齐 · 统一模板

IBL 与辐照度探针:把环境光预先烘好

概念环境光来自所有方向,没法逐方向追。IBL 把环境图按粗糙度预滤波成一摞 mip,运行时按反射方向与粗糙度查一次;探针则把这件事在场景多点离线做好、运行时插值。

公式漫反射项用辐照度图(环境图与 cos 的卷积);镜面项查预滤波图,粗糙度越高查的 mip 越深。

IBL 与探针:环境球提供全方向来光,粗糙度升高时反射瓣变宽、查的预滤波层越糊

手算 / 读图粗糙度 0 的镜面查 mip 0(原图),0.5 约查中间层,1.0 查最糊层——一张环境图因此同时服务镜子与雾面。

常见坑探针放进墙里或漏光(light leaking)会让室内染上室外色;探针密度不足时光照出现块状跳变。

与其他算法的关系IBL 是 PBR(2.1)的另一半;探针与体渲染的砖块同理:都是把昂贵积分预先算好、空间换时间。

演示补齐 · 统一模板

俄罗斯轮盘赌:让路径“无偏地”停下来

概念路径不可能无限弹射。轮盘赌按概率 q 终止路径,存活路径的权重除以 (1−q) 放大,期望不变——无偏,但方差上升。

公式存活权重 w ← w / (1−q);q 常按路径吞吐量(throughput)大小自适应:贡献越小越容易被终止。

俄罗斯轮盘赌:路径每次弹射后掷骰,终止则整条作废,存活路径权重被放大补偿

手算 / 读图q=0.25 时每步期望存活 0.75,平均路径长 4 步;存活样本权重 ×1/(0.75)=1.33,连乘后与不终止的期望一致。

常见坑q 固定太大,长路径(焦散、多次散射)被系统性切掉,画面看着“干净”实则偏暗——这是偏差伪装成降噪。

与其他算法的关系它与体渲染的提前终止(4.3)形似神不同:轮盘赌是无偏终止,提前终止是接受小偏差换速度。

3.2(补齐) — ANIMATION COMPLETION

补齐演示:HU 传递函数逐步映射、累积演算逐步动画、预积分

本节的数值演算表(五采样点累积)在这里做成逐步动画:每一步高亮当前采样点,C 与 A 实时更新,与正文表格逐行对应。

演示补齐 · 统一模板

HU → α:传递函数是一条可逐点读的曲线

概念CT 值(HU)本身没有不透明度;传递函数就是一条人为设计的曲线,把每个 HU 映射成 (颜色, α)。读图就是读这条曲线在哪段陡、在哪段平。

公式α(HU) 为分段线性函数;正文算例的锚点:HU=200 落在 (120, 0.10)–(250, 0.46) 段内插值。

HU 传递函数:扫描点沿 HU 轴移动,纵轴 α 随曲线实时读出,组织分段标注在轴上

手算 / 读图HU=200:f=(200−120)/(250−120)=0.615,α=0.10+0.615×(0.46−0.10)=0.32——与动画中扫描点路过 200 时的读数对照。

常见坑曲线在软组织段(−50…100)太平,所有软组织糊成一团;在骨段太陡,过渡带全变硬边。调 TF 先调这两段。

与其他算法的关系窗宽窗位是 2D 读图的标量窗,本质是同一条映射的线性版;2D 传递函数再加梯度维,见正文。

演示补齐 · 统一模板

五采样点累积:把正文的表走成动画

概念前向后合成没有别的魔法:维护两个数——已累积颜色 C 与已累积不透明度 A,每个采样点先按剩余透过率 (1−A) 加权贡献,再更新 A。

公式C ← C + (1−A)·αi·ci;A ← A + (1−A)·αi;等价地 T = ∏(1−αi) ≈ e−ΣσΔs(Beer–Lambert)。

累积逐步动画:五个采样点依次点亮,下方 C、A 数值与透过率条逐步更新,终值与正文表格一致

手算 / 读图走完五点 A≈0.934、C≈0.675(灰度口径)——动画每步的读数应与正文数值表的对应行相等,可暂停逐行核对。

常见坑把合成顺序写成后向前却不翻转权重,是初学者最常见的实现 bug:颜色偏暗且边界发虚,还很难一眼看出。

与其他算法的关系A 接近 1 后继续采样纯属浪费——那就是4.3提前终止的入口;整段一次查表则是下一张卡的预积分。

演示补齐 · 统一模板

预积分:整段查一次表,代替段内猜单点

概念点采样假设一小段内标量不变,段内藏着薄层就漏检。预积分预先把“从 sfront 到 sback 整段的平均颜色与 α”算进一张 2D 表,运行时按段两端标量查一次。

公式段贡献 = Table[sfront][sback];表在传递函数变化时重建,分辨率决定段内结构保真。

预积分:查表点在 (s_front, s_back) 二维表上滑动,一次查表得到整段积分贡献

手算 / 读图一段两端标量 0.2→0.9、中段藏着 0.95 的薄骨层:点采样(取入口 0.2)α≈0.02 全漏;预积分查 (0.2, 0.9) 格,段 α 按真实路径平均 ≈0.4,薄层被保住。

常见坑表分辨率太低等于把薄层又平均掉;3D 传递函数想预积分时表会涨到 3D,内存先爆——工程上常只对 1D TF 用。

与其他算法的关系预积分是 mip(2.1)在体渲染里的亲戚;它让大步长可用,与空空间跳过一起撑起4.3的加速栈。

3.1(补齐) — ANIMATION COMPLETION

补齐演示:MPR 三平面重建

采样、抖动与 α 校正的交互在正文的模拟器里;MPR 此前只有文字对照,这里补上它的动画——它不积分,只切面。

演示补齐 · 统一模板

MPR:不积分的体数据看法

概念MPR(多平面重建)把体数据沿任意平面切开,逐点取切面上的标量值显示。它是测量的工作台:定位、量距离、看切面形态,不做遮挡合成。

公式切面像素值 = f(平面方程上的点),非格点处用三线性插值(定义见本节正文重建滤波一节)。

MPR:轴位与冠状切面在体内滑动,三幅切面图随切面位置实时重采样更新

手算 / 读图切面每移动 1 个体素,三幅图的对应行/列整体换新——这正是临床里滚轮翻层时屏幕在做的事。

常见坑各向异性间距下直接按像素量距离会系统性偏:量之前先确认 spacing,斜切面还要算面内真实尺度。

与其他算法的关系MPR 与 DVR 是同一数据的两种读法:前者精确定位、后者看整体关系;与 MIP 的分工见4.1对照。

3.3(补齐) — ANIMATION COMPLETION

补齐演示:梯度场与 Blinn–Phong 高光

正文有梯度与着色的手算;这里把“梯度即法线”画成场:箭头方向就是每个采样点的法线,光源一动,高光随之走。

演示补齐 · 统一模板

梯度着色:法线是从数据里算出来的

概念体数据没有几何法线,但标量场处处可求梯度:∇f 指向值增长最快的方向,与等值面垂直,取负归一化就是着色用的法线。

公式N = −∇f / |∇f|;Blinn–Phong 高光 = (N·H)shininess,H 为光向与视向的半程向量(公式见正文算例)。

梯度与着色:梯度箭头场指向高值中心,光源绕行时 Blinn–Phong 高光随半程向量移动

手算 / 读图中心差分:某点 x 方向梯度 ≈ (f(x+Δ)−f(x−Δ)) / 2Δ = (120−40)/2 = 40——正文手算同一公式,这里看它在整个场上的样子。

常见坑噪声会被梯度放大成满屏麻点:先轻度平滑再求梯度是常规操作,但平滑半径一大,细结构法线先没。

与其他算法的关系这套着色与2.1的表面着色是同一公式、不同法线来源;梯度幅值还兼职 2D 传递函数的第二维(3.2)。

4.2(补齐) — ANIMATION COMPLETION

补齐演示:Delta Tracking 与 HG 相函数

正文的体光追动画讲阴影光线与随机游走;这里补采样方法本身:非均匀介质怎么采样自由程,相函数长什么样。

演示补齐 · 统一模板

Delta Tracking:用假的碰撞采真的自由程

概念非均匀介质的自由程没有解析解。Woodcock / Delta Tracking 先假设全场都是最大消光 σ̄(可解析采样),到达的碰撞点按 σ/σ̄ 概率判为真碰撞,其余是“空碰撞”——原地穿过、不改向、不终止。

公式步长 Δs = −ln(ξ)/σ̄;接受概率 P = σ(x)/σ̄;可证明该过程与真实介质的碰撞分布一致(无偏)。

Delta Tracking:光线在雾中前进,粉圈是空碰撞(穿过),橙点是真碰撞(改向)

手算 / 读图σ̄=1.0 的场里某点 σ=0.3:到达该点的碰撞只有 30% 被接受——动画中约每 3–4 个粉圈配 1 个橙点,与此吻合。

常见坑σ̄ 取全场最大值时,若场里有一小块极密区域,空碰撞会在稀疏区泛滥、效率崩塌;工程上用分块 σ̄(每砖一个上界)缓解。

与其他算法的关系它是路径追踪(2.3)在介质里的采样器;与俄罗斯轮盘赌同属“用随机决定换无偏”。

演示补齐 · 统一模板

HG 相函数:一个参数 g 决定散射往哪偏

概念真实相函数复杂,相函数族里最常用的是 Henyey–Greenstein:只用一个各向异性参数 g(−1…1)控制散射方向分布的胖瘦与朝向。

公式p(cosθ) = (1−g²) / ( 4π (1+g²−2g·cosθ)3/2 );g=0 各向同性,g→1 强前向。

HG 相函数:极坐标瓣形随 g 摆动,g 接近 0.9 时前瓣尖锐拉长,后向几乎为零

手算 / 读图g=0.9:前向 p(0°) 与后向 p(180°) 之比 ≈ ((1+g)/(1−g))³ = 19³ ≈ 6900——正文算例的结论,在动画 g 滑到 0.9 时看瓣形最直观。

常见坑把 g 当“雾的浓度”调是常见误读:g 管方向不管多少,浓度是 σs 的事,两者混调会越调越不对。

与其他算法的关系表面渲染里 BRDF 管表面散射方向,HG 管介质内部——是渲染方程在两种情形下的同一角色(1.1对照表)。

4.3(补齐) — ANIMATION COMPLETION

补齐演示:空空间跳过与提前终止、砖块调度、多体与时变

4.3此前多为文字清单,这里把三件套补成动画:跳过、早停、分块驻留,外加多体与 4D 的合成方式。

演示补齐 · 统一模板

空空间跳过 + 提前终止:最快的采样是不采

概念两个互补的省法:还没进数据先证明整块为空(min/max 宏格或八叉树节点 α 上限为 0)就一步跨过;已经采够了——累积 A 达阈值(如 0.98)——就停,后面的贡献被压到 2% 以下。

公式跳过条件:节点 max α = 0;终止条件:A ≥ 1−ε,ε 常取 0.02–0.05,误差上界即 ε。

空空间跳过与提前终止:光线虚线跨过空块,进入实体后 A 达阈值即停,后段不再采样

手算 / 读图一条光线 200 步里若 120 步落在空块、末段 30 步在 A 饱和后:实际采样只剩 50 步——4 倍加速,且画面差异在 ε 量级。

常见坑宏格太粗会把“含一丝结构”的块判不空也判不准;ε 取 0.2 省得更多,但半透明层次会肉眼变假——诊断场景 ε 要更保守。

与其他算法的关系跳过靠的是3.2的分类结果(α 场),终止靠的是合成公式;两者与预积分(3.2)叠加使用才是完整的加速栈。

演示补齐 · 统一模板

砖块调度:数据大过显存时怎么摆

概念大数据集装不进显存就分砖(brick):每块独立驻留/淘汰,渲染时只保证当前视线要用的砖在显存里,缺砖先用低清代理顶住。

公式调度 ≈ 按需分页:砖优先级 = 是否被当前光线穿过 × 分辨率层级;淘汰用 LRU 近似。

砖块调度:12 块砖按视线需求轮换驻留,当前需要的砖被高亮优先载入

手算 / 读图512³ 的 float 数据约 512 MB,砖化成 64³ 后单砖 1 MB:视角转动时每帧只需换入少数几块,而不是整集重传。

常见坑砖边界采样要留一圈 halo 体素,否则砖缝处插值断裂成网格状伪影——这是砖化最常见的实现坑。

与其他算法的关系思想与 Forward+ 的 tile 分拣(2.1)、探针的空间分区(2.3)同源:先分块,再只处理相关的那部分。

演示补齐 · 统一模板

多体融合与时变(4D):两个场怎么合、时间怎么放

概念多体渲染先把每个体各自采样、分类,再在采样点或像素级按权重合成,前提是配准对齐;时变数据多一根时间轴,渲染时取当前时刻的帧(或帧间插值),不是把时间平均掉。

公式合成:C = Σ wk·Ck,Σwk=1(权重口径要在实现里写死并注明);4D 帧间插值 f(t) = (1−β)·fi + β·fi+1。

多体与时变:CT 与 PET 两体融合权重摆动,下方 4D 时间帧逐帧推进而非平均

手算 / 读图权重 0.7/0.3 时 PET 的热点以三成强度叠在 CT 结构上——动画滑到两端时能看清每个体单独的样子,融合只发生在中间。

常见坑配准差 1 个体素,融合图上就是双边影;把 4D 平均成静态会把运动幅度抹掉,心脏/呼吸场景尤其致命。

与其他算法的关系(5.1 应用与对照)的 PET/CT 融合读图就是这张卡的临床版;单体 DVR 是它 w 只取一个体的特例。

大章一 — CHAPTER GUIDE

一 · 渲染总论:先立主线,再谈方法

本章只做一件事:把全书的主线立住。读完这一章,后面所有算法都只是“换一种方式估算同一个积分”。本页只列本章小节,全站目录在总览页。

说明:本章不单独放演示;光线行进模拟器在 3.1,本章的方程手算例是后面各节算例的模板。全站目录见总览页目录。
大章二 — CHAPTER GUIDE

二 · 网格渲染:表面情形的三种解法

场景被近似成三角形网格时,方程有三种估法:光栅化最快、光追最自然、全局光照最完整。三节按“近似 → 精确 → 完整”递进。本页只列本章小节,全站目录在总览页。

本章演示共 18 个(含补齐卡),完整清单见附篇动画索引;全站目录见总览页目录。
大章三 — CHAPTER GUIDE

三 · 体渲染基础:数据、分类、着色

换介质情形:先搞清数据与采样,再学人为赋予颜色与不透明度的传递函数,最后给采样点加上光照。三节是后面所有体算法的公共地基。本页只列本章小节,全站目录在总览页。

本章演示共 8 个(含 1 个可调模拟器),完整清单见附篇动画索引;全站目录见总览页目录。
大章四 — CHAPTER GUIDE

四 · 体渲染算法与加速:五种走法与工程栈

同一条体渲染积分,五种经典走法各有取舍;体光追把散射请回来;加速一节讲怎么让这一切跑得动:算法决定“算什么”,体光追决定“算多真”,工程决定“算多快”。本页只列本章小节,全站目录在总览页。

本章演示共 13 个,完整清单见附篇动画索引;全站目录见总览页目录。
大章五 — CHAPTER GUIDE

五 · 应用与对照:回到场景做选择

最后一章不教新算法,教选择:医学读图的顺序与陷阱、诊断保真的红线、NeRF / 3DGS 与传统方法的分工,最后用一张按问题选型的总表收束全书。本页只列本章小节,全站目录在总览页。

本章定位:选型与红线,不新增算法,因此不新增演示;涉及的每个方法都能在前面四章找到它的演示与定义。全站目录见总览页目录。
附篇 — GLOSSARY

术语表:全书的定义以这里为准

正文各节只在术语第一次出现时给出工作定义并链到这里;同一术语在任何一节里的含义都与本表一致。用上方搜索框或分类筛选,每个术语给一句可用的定义,而不是词典式复述。

动画索引在附篇

40 个演示的完整清单按小节列在附篇,与术语表放在一起,学完逐项复查;总览不再另存一份。正文每节内的演示卡可直接播放、暂停与调速。

去附篇看动画索引 →
导读 — HOW TO READ

怎么读:顺读一遍,再按问题查

读法不另立目录:顺序就是上方目录的顺序(1.1 → 5.1),这里只说方法,不再罗列小节。

读法 1

顺读立链

按目录从 1.1 读到 5.1:每节先看开头的定位条,公式逐符号读,算例动手算一遍,最后看小结与常见坑。里程碑:能说清每个方法把积分砍在哪、补在哪。

读法 2

按问题跳读

已有基础时,从目录按大章直达对应小节;跳过的概念不用回头整节重读,用附篇术语表把定义补齐即可。

读法 3

用附篇复查

术语表核对定义,动画索引逐项核对演示覆盖;方法拿不准时回 5.1 的选型表对表,再决定用什么。

四个高频误区: ① 把 DVR 当诊断依据单独用 —— 它是空间关系工具,定性定量仍回断层与 MPR;② 步长改了不做 α 校正,误判为 TF 问题来回拖曲线;③ 一味追求全透明“通透感”,把小病灶的对比度亲手稀释掉;④ 拿 NeRF/3DGS 的“清晰”当体数据的真实——拟合外观不等于测量保真。避开这四点,画面质量与可信度会立刻上一个台阶。

全书速记

一条主线:渲染方程——逐像素估算辐亮度。表面情形三解:光栅化砍积分换速度,光追认真求交,路径追踪用蒙特卡洛估完递归。介质情形:体渲染 = 对标量场沿视线做发射–吸收积分,传递函数决定可见性、梯度决定立体感、步长与预积分决定画质下限、空间跳跃与早期终止决定速度上限;再加散射就是体光追,参数是假设、结果带噪声,诊断仍回 DVR 与断层。MIP 看最亮,DVR 看层级,MPR 看断层,等值面看硬边界。数据是测出来的用传统积分,场景是拍出来的才用神经拟合。

从1.1开始读 →
附篇 — ANIMATION INDEX

动画索引:40 个演示全清单

全站唯一一份动画清单,按小节编号分组,学完逐项复查;总览页只放目录,不再另存一份。

所属大章 / 小节演示位置来源
3.1 体数据与采样光线行进模拟器(可调步长/α/模式)去演示 →3.1 · 正文模拟器
2.1 光栅化顶点变换 vertex去演示 →正文卡
2.1 光栅化MVP 变换链 mvp去演示 →补齐卡
2.1 光栅化裁剪与背面剔除 clip去演示 →补齐卡
2.1 光栅化三角形光栅化与重心插值 raster去演示 →正文卡
2.1 光栅化透视校正插值 persp去演示 →补齐卡
2.1 光栅化深度测试 depth去演示 →正文卡
2.1 光栅化纹理与 mip texture去演示 →补齐卡
2.1 光栅化前向/延迟/Forward+ deferred去演示 →补齐卡
2.2 光线追踪Whitted 追踪 whitted去演示 →正文卡
2.2 光线追踪BVH 遍历 bvh去演示 →正文卡
2.2 光线追踪SAH 切分构建 sah去演示 →补齐卡
2.2 光线追踪阴影映射 shadowmap去演示 →正文卡
2.2 光线追踪CSM 级联 + PCSS csm去演示 →补齐卡
2.2 光线追踪覆盖率抗锯齿 aa去演示 →正文卡
2.2 光线追踪TAA 时域抗锯齿 taa去演示 →补齐卡
2.3 全局光照路径追踪收敛 pathtrace去演示 →正文卡
2.3 全局光照光子映射 photon去演示 →正文卡
2.3 全局光照辐射度 radiosity去演示 →正文卡
2.3 全局光照GI 多次弹射 gi去演示 →正文卡
2.3 全局光照IBL 与辐照度探针 ibl去演示 →补齐卡
2.3 全局光照俄罗斯轮盘赌 roulette去演示 →补齐卡
3.1 体数据与采样MPR 三平面 mpr去演示 →补齐卡
3.2 传递函数与分类HU → α 传递函数 hu去演示 →补齐卡 · 逐步
3.2 传递函数与分类五采样点累积 beer(Beer–Lambert)去演示 →补齐卡 · 逐步动画版数值表
3.2 传递函数与分类预积分 preint去演示 →补齐卡
3.2 传递函数与分类DVR 累积合成 dvr去演示 →正文卡
3.3 光照与着色梯度着色与 Blinn–Phong gradient去演示 →补齐卡
4.1 经典算法MIP 取最大 mip去演示 →正文卡
4.1 经典算法纹理切片 slice去演示 →正文卡
4.1 经典算法Splatting splat去演示 →正文卡
4.1 经典算法Shear-Warp shear去演示 →正文卡
4.1 经典算法Marching Cubes mc去演示 →正文卡
4.2 体光追体光追阴影光线 volray去演示 →正文卡
4.2 体光追体路径追踪 volpath去演示 →正文卡
4.2 体光追Delta Tracking delta去演示 →补齐卡
4.2 体光追HG 相函数 hg去演示 →补齐卡
4.3 加速与工程空空间跳过 + 提前终止 skip去演示 →补齐卡
4.3 加速与工程砖块调度 brick去演示 →补齐卡
4.3 加速与工程多体融合与时变 multivol去演示 →补齐卡