想象你面前有一块巨大的半透明果冻,里面嵌着草莓粒、薄荷叶和细小的气泡。从外面看,你只能看到表面模糊的轮廓——那些诱人的内容物被“埋”在深处。这时你掏出一支手电筒,从侧面照进去。光线穿过果冻,沿途的每一颗果粒都会吸收一部分光、散射一部分颜色,最终从另一侧出来时,光线已经“记下了”它一路上碰到的所有东西。你的眼睛看到的,是一幅奇妙的“内部透视图”。 体绘制(Volume Rendering)干的就是这件事。它把三维的数值数据看成一块“数字果冻”:数据被切分成无数微小的正方体格子,每个格子叫“体素”(Voxel),格子里存一个数。然后计算机模拟无数支“手电筒”(光线)从你的眼睛出发、穿过果冻,沿途采集体素的颜色和透明度,一层层累积成最终的像素颜色。医生用它透视CT扫描的人体,气象学家用它观察三维云团,地质学家用它寻找地下油气藏。 这篇文章,我们就一起切开这块“数字果冻”,看看体绘制这台“透视相机”的每一个核心部件。

岗位关联

学会体绘制,你就掌握了把任意三维科学数据“变透明”的看家本领——这是医学影像、科学仿真、工业检测等AI应用中最核心的可视化能力之一。

目录
  1. 可视化演示
  2. 体素与数据场
  3. 光线投射原理
  4. 传输函数映射
  5. 颜色透明累积
  6. 医学CT应用
  7. 科学仿真可视化
  8. 体绘制与面绘制
  9. 优化与交互探索
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

体素与数据场

做果冻时,我们会把果汁、糖和食用胶混合,倒进模具,等它凝固。凝固后的整块果冻里,每个微小区域都有确定的“内容”——哪儿是草莓粒、哪儿是纯净的果冻、哪儿是气泡。把这块果冻想象成由无数同样大小的小正方体格子拼成的,每个格子记录一个数值来描述它的内容,这就是体绘制的“原材料”。

在计算机图形学里,这种“每个位置有一个数值”的三维数组叫三维标量场(Scalar Field)。组成它的小格子就叫体素(Voxel,由“体积volume”和“像素pixel”两个词组合而成)。体素是三维空间里的“像素”,它不仅有x、y坐标,还有深度z坐标。

CT扫描仪会输出一个三维数组,每个体素存的是人体组织对X射线的衰减系数;天气模拟器会输出另一个三维数组,每个体素存的是该位置的温度或气压。所有这些数据,本质上都可以表达为一个函数:给它一个坐标,它返回一个数值。

有了果冻,还需要配方和灯光才能开始透视。下一个部件——光线投射——就负责把“手电筒”点亮。

f(x,y,z)=vf(x, y, z) = v
  1. 位置坐标$(x, y, z)$ 是体素在三维网格中的“地址”——第几行、第几列、第几层,就像果冻小格子的三维编号。
    (x,y,z)(x, y, z)
  2. 标量值$v$ 是该位置存储的数值,例如密度、温度或压力,描述这个格子“是什么东西”。
    vv
  3. 数据场映射$f$ 把整个三维坐标空间映射到实数,查询任意体素坐标就能得到对应数值,构成完整的“数字果冻”。
    f:Z3→Rf: \mathbb{Z}^3 \to \mathbb{R}

光线投射原理

在果冻的世界里,手电筒的光线是直线前进的。从光源出发,穿过果冻,沿途碰到每一颗果粒都“尝一口”,记录下它的味道和颜色。光线投射法(Ray Casting)干的就是这件事:对屏幕上每个像素,发射一条虚拟视线,让它穿入体数据,沿路采样。

这条光线在数学上很简单:一个起点 $O$ 加上一个方向 $D$,再乘以一个参数 $t$,就得到了光线上的任意位置。$t$ 就像“走了多远”的里程表。

实际代码中,光线不会走无限远,而是设定一个 $t$ 的范围,从进入数据场到离开数据场。在这个范围内,每隔一小段距离取一个采样点,查询该点所在的体素值(或做插值),交给后面的“染色配方”处理。光线有了,采样也有了,但每个采样点应该显示成什么颜色、多透明,还需要一张“配方表”来决定——这就是下一节的传输函数。

R(t)=O+t×DR(t) = O + t \times D
  1. 起点$O$ 是光线出发的位置坐标,通常对应虚拟相机所在的点。
    OO
  2. 方向$D$ 是光线前进的方向,通常用单位向量表示,指明光线朝哪里走。
    DD
  3. 里程参数$t$ 是非负实数,表示沿光线方向前进的距离,$t$ 越大位置越远。
    t≥0t \geq 0
  4. 光线位置$R(t)$ 把起点坐标和方向位移相加,得到光线上任意一点的坐标。
    R(t)=O+t×DR(t) = O + t \times D

传输函数映射

同样一颗草莓粒,你可以把它染成鲜红色引人注目,也可以把它调成透明让它“隐身”。在体绘制里,决定这一切的是“染色配方”——传输函数(Transfer Function)。它读入一个体素值,输出一个颜色和一个透明度。

传输函数的设计是体绘制最核心的手艺。CT数据中,骨骼的密度值远高于软组织,血液又介于两者之间。一张好的传输函数可以做到:骨骼显示为白色不透明,软组织显示为半透明的红色,空气显示为完全透明——不同的物质一目了然。

一个典型的传输函数是多段线性函数:低值区设为全透明(对应空气),中值区设为半透明彩色(对应软组织),高值区设为不透明(对应骨骼)。这样,光线穿过人体时,遇到骨骼就会阻挡,遇到软组织就会叠加一层淡淡的红色。染色配方调制好后,光线每遇到一个采样点都“刷”上一层颜色,无数层颜色叠加起来,最终变成屏幕上的像素——这就是下一节要讲的颜色累积。

C=T(v)C = T(v)
  1. 标量值输入$v$ 是采样点从数据场中读到的标量值,比如CT密度,它是染色配方的作用对象。
    vv
  2. 映射函数$T$ 是传输函数,把标量值作为输入,通过查表或计算得到对应的颜色与透明度。
    T:R→RGBAT: \mathbb{R} \to \text{RGBA}
  3. 颜色输出$C$ 是一个RGBA四元组,R/G/B是红绿蓝分量,A是不透明度,合起来定义了这一层“果粒”的外观。
    C=(r,g,b,a)C = (r, g, b, a)

颜色透明累积

当手电筒的光线穿过果冻时,它并不是“看到”某个单独的果粒,而是把沿途所有果粒的颜色和透明度一层层叠在视网膜上。如果前面有一颗完全透明的果粒,光线直接穿过,后面的颜色照样能补上来;如果前面有一颗完全不透明的草莓粒,后面的就会被完全遮住。

计算机里实现这种“叠色”叫从前到后合成(front-to-back compositing):从距离视点最近的地方开始,逐个采样点把颜色“叠”到累积结果上。累积不透明度越接近1,说明光线越“走不动”,后面的体素贡献就越小。

如果累积不透明度接近1,说明光已经“走不动”了,后面的体素不会再贡献颜色,可以提前结束循环——这就是代码中的“早停”优化。如果累积不透明度仍接近0,说明这一路都是透明物质,最后的像素就是背景色。当千万条光线都完成各自的“叠色之旅”,屏幕上就出现了一幅能看穿内部的完整图像。光源和配方都准备好了,真正的大显身手时刻到了——我们先去医学影像科看看。

Cacc=Cacc+(1−αacc)×Ci×αiC_{acc} = C_{acc} + (1 - \alpha_{acc}) \times C_i \times \alpha_i
αacc=αacc+(1−αacc)×αi\alpha_{acc} = \alpha_{acc} + (1 - \alpha_{acc}) \times \alpha_i
  1. 累积颜色$C_{acc}$ 是目前所有已处理采样点混合后的结果,随光线推进不断更新。
    CaccC_{acc}
  2. 累积不透明度$\alpha_{acc}$ 表示目前已经遮挡了多少光线,0 表示完全透明,1 表示完全遮住。
    αacc\alpha_{acc}
  3. 当前采样点$C_i$ 和 $\alpha_i$ 是当前这层“果粒”的颜色与不透明度,来自传输函数的输出。
    Ci,αiC_i, \alpha_i
  4. 剩余透光比例$(1 - \alpha_{acc})$ 表示还没被遮住的光线比例,新颜色只能作用在这部分上。
    (1−αacc)(1 - \alpha_{acc})

医学CT应用

医院里的CT扫描仪,本质上就是一台给人体拍“三维果冻照片”的机器。病人躺进扫描仪,X射线从各个角度穿透身体,探测器记录衰减数据,计算机重建出一个三维体数据。每个体素存的值,是人体组织对X射线的衰减能力。

为了让不同组织一目了然,医学上用Hounsfield单位(HU)来标定CT值:水的HU值定为0,空气约为-1000,骨骼通常几百到上千。不同组织之间的HU值差异,成为传输函数“染色”的依据。

有了HU值,再搭配传输函数:骨骼设成白色不透明,皮肤肌肉设成半透明,血管注入造影剂后设成亮红色。医生旋转体绘制的三维人体模型,可以像把玩一个透明果冻人偶一样,从任意角度观察内脏、骨骼和病灶。在手术规划中,医生可以实时调节传输函数,把骨骼“隐身”,专门聚焦血管或肿瘤,观察它与周围组织的位置关系。这就是体绘制在医学领域最经典的“透视果冻”应用。

HU=μ−μwaterμwater×1000HU = \frac{\mu - \mu_{water}}{\mu_{water}} \times 1000
  1. 衰减系数$\mu$ 表示某种组织对X射线的衰减程度,数值越大,射线越难穿透。
    μ\mu
  2. 水的基准值$\mu_{water}$ 是水对X射线的衰减系数,作为所有组织对比的“标尺”。
    μwater\mu_{water}
  3. 相对差值$\frac{\mu - \mu_{water}}{\mu_{water}}$ 计算该组织与水相比衰减差异的比例,负值表示比水透光、正值表示比水挡光。
    μ−μwaterμwater\frac{\mu - \mu_{water}}{\mu_{water}}
  4. 标准化放大乘以1000得到易读的整数HU值,方便医生和算法统一处理。
    ×1000\times 1000

科学仿真可视化

气象学家用超级计算机模拟台风时,产生的不只是你能在电视上看到的二维卫星云图,而是一个覆盖整个三维大气层的数据场:温度、气压、风速、水汽浓度,每个格子一个值,层层叠叠像一个巨大的分层果冻。

体绘制把这种模拟数据变成可以“钻进内部”看的可视化。流体力学工程师可以透视飞机机翼周围的三维流场,观察漩涡如何生成;地震勘探人员可以透视地下岩层的地震波反射数据,寻找油气藏的结构。光线每采样一个位置,就从数据场中读取该处的物理量。

科学数据的体绘制往往比医学数据更难,因为物理量通常没有天然的“颜色语义”——温度高该用红色还是蓝色?气压该半透明还是不透明?这时传输函数的设计就需要结合物理意义和视觉心理,把关键结构凸显出来。从医学CT到气象仿真,体绘制在许多领域都担当“透视眼”。但你可能好奇:传统三维图形学不是早就用网格建模了吗?体绘制和它们的区别,下一节揭晓。

vk=f(O+tk×D)v_k = f(O + t_k \times D)
  1. 采样点位置$O + t_k \times D$ 是第 $k$ 个采样点的坐标,由光线起点和前进参数共同决定。
    O+tk×DO + t_k \times D
  2. 数据场查询$f$ 对三维标量场进行读取,若采样点落在体素之间,还需插值获得平滑数值。
    f(⋅)f(\cdot)
  3. 采样值$v_k$ 是该采样点上读取到的标量值,例如风速、压力或反射振幅,供传输函数染色。
    vkv_k

体绘制与面绘制

吃果冻有两种方式:第一种是先找到果冻里那颗草莓的边界,用小刀把它完整地削出来,然后只看这颗草莓的形状;第二种是直接把整块果冻放在光下,透过半透明的介质直接看草莓的轮廓和内部纹理。前者是“面绘制”(Surface Rendering),后者是“体绘制”。

面绘制是传统三维图形的思路:先从体数据中提取一个等值面(例如所有密度等于骨骼阈值的点组成的曲面),再把这个曲面用三角形网格渲染。等值面的数学定义是一个集合——所有标量值恰好等于某个阈值 $c$ 的点。

面绘制速度快、表面光滑,但它只保留了“一层皮”的信息——等值面之外的内部结构全部丢失。体绘制则把整个数据场保留下来,一次性渲染所有层次的物质,代价是计算量大得多。现代GPU加速后,体绘制也可以实时交互,成为比面绘制更强大的探索工具。对于“里面藏了什么”比“外壳长什么样”更重要的数据,体绘制是不可替代的选择。不过实时交互对性能要求很高,最后我们来看看体绘制如何跑得更快。

S={x∣f(x)=c}S = \{ \mathbf{x} \mid f(\mathbf{x}) = c \}
  1. 空间点$\mathbf{x}$ 代表三维空间中的任意一点坐标,它可能是数据场里的任何位置。
    x\mathbf{x}
  2. 场上数值$f(\mathbf{x})$ 是该点处从体数据读取到的标量值,对应果冻在该点的“密度”。
    f(x)f(\mathbf{x})
  3. 阈值$c$ 是用户指定的等值面数值,比如骨骼的密度阈值“削果皮”的刀切位置。
    cc
  4. 等值面集合$S$ 是数据场中所有满足 $f(\mathbf{x}) = c$ 的点构成的曲面,即削出来的那层“果皮”。
    S={x∣f(x)=c}S = \{ \mathbf{x} \mid f(\mathbf{x}) = c \}

优化与交互探索

手电筒扫描一整块大果冻是很累的,如果果冻大部分区域都是透明的,光线根本不需要“品尝”每一个格子。体绘制的性能优化,核心思路就是:能跳过的地方绝不浪费光线。

第一种优化是调整采样步长:步长越大,采样点越少,速度越快,但图像可能发虚;步长越小越精细,速度越慢。第二种是空区域跳过:先把数据中值为背景的区域提前标记出来,如果光线经过的区域全是背景,就直接“跳档”到下一个非空区域,不必逐点采样。而判断光线何时进入数据场,依靠的是包围盒相交计算。

现代体绘制系统还在GPU上做并行加速——每个像素的光线是独立计算的,GPU的上千个核心可以同时处理几百万条光线,轻松实现每秒30帧的实时交互。用户拖动滑块调节传输函数、旋转视角,画面立刻响应,像真的在用手电筒照果冻。从体素到光线、从配方到叠色,体绘制的四个核心部件已经全部到齐。现在你已经拥有了一台属于自己的“数字果冻透视仪”,去看清那些藏在三维数据深处的真相吧。

tenter=Bmin−ODt_{enter} = \frac{B_{min} - O}{D}
  1. 包围盒角点$B_{min}$ 是数据场外接包围盒的最小坐标角,相当于“果冻盒”的左下后角。
    BminB_{min}
  2. 光线起点$O$ 是光线从相机出发的位置坐标,光线的“手电筒”出光点。
    OO
  3. 光线方向$D$ 是光线的方向向量,控制光线射向数据场的角度。
    DD
  4. 进入时刻$t_{enter}$ 是光线最早碰到包围盒的时刻,早于它光线完全在数据外面,可以直接跳过。
    tentert_{enter}

AI 应用场景

医学影像辅助诊断

阶段:数据可视化与交互探索

解决的问题:传统诊断依赖医生逐张翻看CT切片,难以快速建立三维空间关系。体绘制将整个CT体数据渲染为可旋转、可剖切的透明三维模型,AI分割出的器官或病灶可以叠加在体绘制画面上,辅助医生直观定位病变与周围血管、骨骼的相邻关系。

具体案例:某三甲医院使用体绘制技术重建肺部CT,将肿瘤、气道、血管分别赋予不同传输函数颜色。医生旋转模型即可看到肿瘤是否侵犯支气管,极大提高术前评估效率。

石油勘探与地质解释

阶段:科学数据探索与展示

解决的问题:地震勘探数据是巨大的三维体数据,传统剖面分析难以发现隐蔽的储层结构。体绘制配合传输函数,可以直接透视地下数千米的反射波数据,配合AI层位追踪结果,直观展示含油气的构造圈闭。

具体案例:某油田工程师利用体绘制技术对三维地震数据进行全视角浏览,通过调整透明度滤除覆盖层,清晰看到“河道砂体”的立体展布,成功定位多个勘探井位。

Python 演示

python61 行
import numpy as np def make_sphere_field(n=32, radius=12):    """生成一个包含球体的三维标量场(体素网格)"""    axis = np.arange(n) - n / 2.0    x, y, z = np.meshgrid(axis, axis, axis, indexing='ij')    d = np.sqrt(x**2 + y**2 + z**2)    field = np.where(d < radius, 1.0 - d / radius, 0.0)    return field.astype(np.float32) def transfer_function(value):    """传输函数: 将标量值映射为 (r, g, b, alpha)"""    return np.array([        0.5 + value * 0.5,        0.2 + value * 0.6,        1.0 - value * 0.3,        value * 0.8    ]) def ray_cast(field, origin, direction):    """沿一条光线采样体素, 并从前到后合成颜色与不透明度"""    n = field.shape[0]    color = np.zeros(3)    alpha = 0.0    t_max = n * 1.5    steps = 48    for i in range(steps):        t = (i + 0.5) * t_max / steps        pos = origin + direction * t        x = int(pos[0])        y = int(pos[1])        z = int(pos[2])        if 0 <= x < n and 0 <= y < n and 0 <= z < n:            v = field[x, y, z]            if v > 0.02:                r, g, b, a = transfer_function(v)                color += np.array([r, g, b]) * a * (1 - alpha)                alpha += a * (1 - alpha)                if alpha > 0.95:                    break    return color def render(field, image_size=48):    """主渲染: 对图像每个像素发射一条光线"""    n = field.shape[0]    img = np.zeros((image_size, image_size, 3))    origin = np.array([0.0, 0.0, -n * 0.8])    direction = np.array([0.0, 0.0, 1.0])    for py in range(image_size):        for px in range(image_size):            ox = ((px + 0.5) / image_size - 0.5) * n * 0.8            oy = ((py + 0.5) / image_size - 0.5) * n * 0.8            o = origin + np.array([ox, oy, 0.0])            img[py, px] = np.clip(ray_cast(field, o, direction), 0, 1)    return img if __name__ == "__main__":    field = make_sphere_field()    img = render(field)    print("体绘制渲染完成, 图像大小:", img.shape)    print("中心像素颜色(RGB):", img[24, 24])
目的:用约60行Python实现一个最简化的光线投射体绘制器,合成一个球体标量场并渲染为二维图像,帮助理解“光线采样+颜色累积”的完整流程。
  1. field = np.where(d < radius, 1.0 - d / radius, 0.0)一次调用生成“果冻球”:越靠近球心,体素值越大,代表密度越高
  2. d = np.sqrt(x**2 + y**2 + z**2)计算每个体素到球心的三维距离,是生成场数据的基础
  3. for py in range(image_size):外层循环遍历图像每一行,内层再遍历每一列,逐个像素发射光线
  4. o = origin + np.array([ox, oy, 0.0])根据像素位置偏移光线起点,让不同像素看到球体的不同部位
  5. v = field[x, y, z]把采样点坐标换算成整数索引,从体素网格中取出该格子的标量值
  6. r, g, b, a = transfer_function(v)用传输函数把标量值变成颜色和透明度,完成“染色”
  7. color += np.array([r, g, b]) * a * (1 - alpha)前到后合成核心:新颜色只能作用在尚未被遮挡的剩余光线上
  8. alpha += a * (1 - alpha)不断累加不透明度,模拟光线被越来越厚的“果冻”挡住
  9. if alpha > 0.95: break光线已被完全挡住,后面采样点不再有贡献,提前终止节省计算
  10. img[py, px] = np.clip(ray_cast(field, o, direction), 0, 1)把像素光线的累积颜色裁剪到[0,1]合法范围后写入图像

常见误区

误区体绘制和X光片一样,光线穿过物体直接成像,看到的就是物体真实的样子,不需要人为控制。

正解体绘制不是真实光学成像,而是“采样+合成”的抽象过程。光线碰到什么颜色、多透明,完全由传输函数决定。同样的CT数据,换一套传输函数,骨骼可以变成透明,肌肉可以变成不透明——这取决于你想展示什么,而不是物体“本来”长什么样。

为何常见:屏幕上看到的效果很直观,画面像真实的透视照片,让人误以为是类似拍照的被动结果。

误区传输函数就是给数据上色,纯粹为了视觉效果好看,对科学结论没有本质影响。

正解传输函数直接决定哪些特征显现、哪些被隐藏。一个误设的传输函数可能把肿瘤调成透明、把骨骼调成半透明,导致误诊;也可能把噪声调到高不透明度,让人把噪声当成真实结构。传输函数的科学性比美观更重要。

为何常见:传输函数的操作界面通常做成彩色滑块,调节起来像“调滤镜”,容易低估它的科学分量。

误区面绘制和体绘制都是把三维数据画出来,区别只是面绘制用网格、体绘制用像素,最终效果差不多。

正解两者有本质区别。面绘制先提取等值面,只保留一个“壳”,然后渲染网格表面;体绘制直接对全部体素采样合成,完整保留内部信息。面绘制适合看外壳,体绘制适合看内部,信息含量和计算开销都不同。

为何常见:在最终屏幕上,两者都能显示三维形状,初学者容易混淆两套完全不同的渲染管线。

误区体绘制要发射几十万条光线,每条光线要采样几百次,只能离线渲染,无法交互操作。

正解现代GPU可以并行计算每一条光线,加上空区域跳过、自适应采样步长等优化,现代笔记本实时渲染512×512的体数据毫无压力。医学影像软件中旋转查看CT体绘制画面就是实时交互的。

为何常见:很多教程展示的是单线程CPU渲染的老式算法,参数调大后逐像素跑几秒钟,给大家留下了“体绘制=慢”的刻板印象。

面试题

Q1. 体绘制中,光线投射法的主要工作方式是?

单选题 · easy

  • A.先提取表面再渲染网格
  • B.沿视线采样并累积颜色← 正确答案
  • C.只渲染数据的外层轮廓
  • D.用三角形网格进行建模

答案:B。光线投射法对每个像素发射一条视线,沿视线方向在体数据中采样,并将采样点的颜色与不透明度从前到后累积,最终得到像素颜色。A和D是面绘制的做法,C只渲染表面轮廓也不是体绘制的思路。

Q2. 什么是体素(Voxel)?

单选题 · easy

  • A.三维图像的最小体积单元← 正确答案
  • B.一种快速体绘制的算法
  • C.控制颜色映射的函数
  • D.二维图像像素的别名

答案:A。体素是三维空间中规则网格上的最小体积单元,就像二维图像中的像素一样,是体数据的基本组成单元。B、C描述的是算法和函数,D把体素等同于二维像素,都不准确。

Q3. 传输函数在体绘制中的作用是?

单选题 · easy

  • A.将标量值映射为颜色与透明度← 正确答案
  • B.沿光线方向加快采样速度
  • C.压缩体数据以节省内存
  • D.自动提取物体的轮廓边界

答案:A。传输函数读取体素标量值,输出RGBA颜色与不透明度,是决定“哪些特征以什么颜色显示”的关键环节。B是优化策略,C是数据压缩,D是边缘检测,均与传输函数无关。

Q4. 在前到后光线合成中,关于累积不透明度的正确描述是?

单选题 · mid

  • A.随采样逐层累加并趋近于1← 正确答案
  • B.始终保持初始值的水平不变
  • C.随着采样进行逐渐减小
  • D.只与采样点的颜色有关

答案:A。前到后合成中,每条新采样都会更新累积不透明度:alpha += (1-alpha_acc)*alpha_i,所以它会单调递增并趋近1。B和C违背了累积性质,D忽略了透明度自身的作用。

Q5. CT数据中的Hounsfield单位(HU)主要用于描述?

单选题 · mid

  • A.组织对X射线衰减的相对程度← 正确答案
  • B.三维体绘制图像的帧率
  • C.图像上每个像素的颜色值
  • D.光线在体素间插值的方式

答案:A。HU值以水为基准,量化某种组织相对水的X射线衰减差异(乘以1000),空气约为-1000,骨骼为正数百到上千。B、C、D分别涉及帧率、颜色和插值,均不属于HU的语义范畴。

Q6. 与面绘制相比,体绘制最大的优势是?

单选题 · mid

  • A.无需提取表面直接保留内部细节← 正确答案
  • B.渲染速度通常远远快于面绘制
  • C.只需要非常少的体素数据量
  • D.只能显示物体的外部轮廓

答案:A。体绘制跳过等值面提取步骤,直接把整体素数据经采样与合成渲染出来,内部结构完整保留。面绘制通常更快、数据量更可控,D描述的恰是面绘制的局限而非体绘制的优势。

Q7. 体绘制中“空区域跳过”优化依赖的前提是?

单选题 · mid

  • A.数据集存在大量背景值或零值体素← 正确答案
  • B.所有体素的数值大小都完全相同
  • C.视线方向始终和坐标轴平行
  • D.传输函数必须是线性函数

答案:A。空区域跳过的基本思路是:当光线路径上连续遇到不重要的背景体素时,直接跳到下一个非空位置。如果数据没有大量背景体素,这种优化收益就很小。B、C、D都不是该优化成立的必要条件。

Q8. 光线经过体素网格时,采样点的标量值通常如何获取?

单选题 · hard

  • A.在周围体素之间插值计算得到← 正确答案
  • B.直接读取最近的单个体素值
  • C.随机抽取任意一个体素的值
  • D.取光线起点的体素值代替

答案:A。采样点通常不恰好落在体素中心,严谨的做法是用周围8个体素做三线性插值,得到平滑的连续采样值。直接取最近体素会产生块状伪影,随机抽样和用起点代替都不合理。

Q9. 下列哪些属于体绘制的有效优化策略?

多选题 · hard

  • A.调整采样步长平衡速度与质量← 正确答案
  • B.跳过空区域避免无效采样← 正确答案
  • C.利用GPU并行加速光线计算← 正确答案
  • D.用面绘制完全替代体绘制

答案:ABC。采样步长控制采样密度,空区域跳过避免背景体素的无效计算,GPU并行让每条光线独立并行执行,三者都是体绘制常用优化。D是抛弃体绘制改用面绘制,不是体绘制的优化策略。

Q10. 关于传输函数对体绘制结果的影响,下列说法正确的有?

多选题 · extreme

  • A.可以区分骨骼与软组织等不同密度← 正确答案
  • B.将不透明度设为零可隐藏无关组织← 正确答案
  • C.传输函数一旦设定就不能再调整
  • D.可以强调高亮特定密度范围的特征← 正确答案

答案:ABD。传输函数把不同标量值映射为不同颜色与透明度,因此可以区分密度、隐藏无关组织、高亮目标特征。C不正确——现代体绘制系统支持实时调整传输函数,交互探索恰恰是其重要优势。