赞
踩
我们将首先确定体绘制过程中可能出现的伪影源。在改进了对工件来源的理解之后,我们就可以找到在给定时间限制下产生高质量的体积可视化的方法。
The volume-rendering pipeline. Each step in this pipeline is a potential source of artifacts
首先是一个采样阶段,它访问体积数据,以沿穿过体积的直线射线获得体素的值。
第二,过滤阶段,它插值体素值。
第三步,分类步骤,将插值值从体积映射到发射和吸收系数。
如果在计算体积数据的阴影时考虑了外部光源,则需要可选的第四步。
最后,进行体积数据的集成。这是在图形硬件中通过将发射颜色与其关联的alpha值混合到帧缓冲区来实现的。重复此管线,直到沿射线穿过体积的所有采样都已处理完毕。
管道的每个阶段都是人工痕迹(artifacts)的潜在来源。
注意,采样和过滤实际上是在图形硬件的同一阶段执行的;也就是说,在基于切片的体绘制过程中,我们使用切片多边形的纹理坐标定义采样位置。在基于图像顺序的方法中,样本位置在片段程序中显式计算。一旦使用纹理获取操作访问卷,硬件将自动执行过滤。数据值插值的位置和权重因子使用相应的纹理坐标标识,在代理几何体内部插值,或沿光线计算。图形硬件执行的过滤类型是通过设置适当的volume纹理的OpenGL状态来指定的。
目前的图形硬件只支持最近邻滤波和线性滤波,即线性滤波、双线性滤波和三线性滤波。然而,由于图形硬件的可编程性,可以添加额外的过滤方法,如立方过滤器。因此,我们将把采样和滤波视为两个步骤,因为一旦我们实现了自己的过滤方法,它们就变成了两个独立的操作。
本章的目标是在保持实时性能的同时移除或至少抑制体绘制过程中出现的瑕疵。为此,所有建议的优化都将直接在GPU上执行,以避免从GPU内存中读取昂贵的数据。我们将逐步回顾体绘制管道的各个阶段,识别在相应阶段中引入的可能错误源,并解释在确保交互帧速率的同时消除或抑制这些错误的技术。
体绘制过程的第一步是对离散体素数据进行采样。当前基于GPU的技术使用显式代理几何体在体上并行跟踪大量光线(基于切片的体绘制)或沿光线直接采样体积(光线投射)。这些采样点的距离会影响我们表示数据的准确性。采样点之间的较大距离,即低采样率,将导致严重的伪影(见下图)。这种效应通常被称为欠采样,而相关的伪影通常被称为木纹伪影。
低采样率引起的木纹伪影
关键问题是:为了精确地表示体积数据,我们需要从体积中沿射线获得多少个样本?这个问题的答案在于信息论中所谓的奈奎斯特-香农抽样定理。
这个定理是抽样最重要的规则之一[201238]。它指出,在将模拟信号转换为数字信号时,采样频率必须大于输入信号最高频率的两倍,以便以后能够从采样版本完美地重建原始信号。否则,信号将出现混叠;即从离散信号中不正确地重构高频。一个模拟信号可以包含任意的高频,因此通常在对信号进行采样之前应用模拟低通滤波器,以确保输入信号没有那些高频。这种信号被称为带限信号。
例如,对于音频信号,采样定理的结果是,如果我们想以22 kHz作为最高频率采样音频信号,则必须至少以两倍于采样率的采样率对信号进行采样,即至少以44 kHz的频率采样。如前所述,这条规则适用于我们想要离散化连续信号的情况。但是这个规则对已经离散化的信号的采样意味着什么呢?好吧,在体绘制中,我们假设数据代表从一个连续的有限带宽的体积场中采集的样本。在采样过程中,由于采集采样率太低,我们可能已经丢失了一些信息。这当然是我们无法在渲染期间修复的问题。然而,假设为连续的离散信号中的最高频率是数据从一个采样位置到相邻位置的突变。这意味着最高频率除以体积数据相邻体素之间的最小距离。因此,为了从离散数据中准确地重建原始信号,我们需要在每个最小体素间距中至少采集两个样本。
事实上没有简单的方法可以绕过这个定理。我们必须为每个体素采集两个样本以避免伪影。但是,在体积内沿光线进行大量采样会直接影响性能。
我们通过增加切片多边形的数量或减少光线投射过程中的采样距离来实现高采样率。在卷内采集两倍的采样数通常会将帧速率降低两倍。然而,体积数据通常不仅仅包含数据值变化较大的区域。事实上,某些区域的体积数据可能非常均匀,而其他区域包含大量细节,因此频率较高。我们可以通过使用一种称为自适应采样的技术来利用这一事实。
Comparison of a visualization of the inner ear with low (left) and high (right) sampling rate.
自适应采样技术使得在非均匀区域比在均匀区域采集更多的样本。为了在沿射线积分时区分体积的均匀部分和非均匀部分,可以使用包含每个区域采样率的三维纹理。这种纹理,也就是所谓的重要性体,可以在预处理步骤中计算出来,并且可能比我们的体积数据具有更小的空间维度。对于GPU上的体光线投射,由于采样位置是在fragment阶段生成的,因此很容易将采样率调整为从该纹理获得的采样率。然而,基于切片的体绘制更为复杂,因为采样率直接由切片多边形的数量来设置。换言之,在顶点阶段设置采样率,而在碎片阶段从我们的重要体积获得采样率。
但是,对于在切片多边形上插值的体进行采样的纹理坐标可以视为基本采样率的采样。然后,我们可以在碎片程序中沿着射线方向在这些采样位置采集额外的样本,从而在数据集不均匀的区域进行更高的采样。为了通过局部高采样率获得性能改进,这种实现需要在片段程序中动态分支,以使片段程序中的体积样本数适应该位置的期望采样率。这种动态分支在Pixel Shader 3.0兼容硬件上可用。或者,使用早期zor模板剔除的计算掩蔽可以用于加速采样率较低的区域的渲染。切片多边形以不同的采样率使用不同的片段程序进行多次渲染,并通过使用模具或z缓冲区遮罩相应的像素,为不同的过程选择光线(像素)。有关使用早期测试实现动态分支的更详细描述,请参见第8.6.2节。
全局或局部更改采样率需要校正混合到帧缓冲区的片段的不透明度。这可以防止区域在稀疏采样区域变得更亮,在高度采样的区域中变暗。这可以通过改变传递函数中的alpha值来全局实现,也可以通过在片段程序中混合之前对alpha值进行局部调整来实现。校正后的不透明度是为基本样品距离和实际样品距离存储的不透明度α的函数,样品间距比∆x/∆x0:
使用全局或局部高采样率渲染体积数据集可以消除木纹伪影。然而,这样的采样率会显著降低性能。更糟糕的是,在大多数体积渲染中,在分类阶段使用了复杂的传递函数。这样可以在采样数据中引入高频,从而使所需的采样率远远超过体积数据本身的奈奎斯特频率。我们将在后面详细讨论这种影响,并在预处理步骤中使用一种技术将这些高分类频率与标量场中的高频率分离开来,从而解决这些问题。
作为移除木纹文物的替代方法,我们可以试着把它们藏起来。木纹伪影是由于属于同一表面的相邻不透明碎片之间深度的突然变化造成的。去除伪影的高采样率的替代方法称为随机抖动。此技术通过在观察方向上的光线采样位置添加小偏移来隐藏木纹瑕疵。沿每个光线通过像素的采样位置由不同的随机因子偏移。因此,在伪影中变得明显的像素之间的一致性被噪声抑制。
对于实现,我们创建一个包含随机数的单通道GL亮度2D纹理。在输出图像上平铺32×32个随机数的小2D纹理通常提供足够的随机性。在渲染过程中,我们从该二维纹理中为每个像素获取不同的随机数,以偏移光线通过相应像素的采样位置。清单9.1创建了这样一个二维纹理。请注意,GL REPEAT纹理环境允许我们将纹理平铺在输出图像上:由于在使用代理几何体的slicingbased体渲染中,采样位置的隐式计算,必须沿光线向每个采样位置添加相同的偏移量。
为了为每个像素获取不同的随机数,我们将窗口位置WPOS除以随机数纹理的大小。这会产生纹理坐标,用于查找包含随机数的2D纹理;即,纹理平铺在输出图像上。我们将长度等于采样距离和随机数纹理维数的光线方向向量作为统一变量传递给片段着色器(见清单9.2)。通过将每个像素(在范围[0,1])的随机数乘以光线方向向量,并将得到的向量添加到采样位置,我们获得每个光线的不同偏移采样位置;即,为每个像素创建最大偏移量等于采样距离的不同采样图案。
尽管切片中的随机抖动只需要查找非常小的噪声纹理和一些附加的算术指令,但是每个积分步骤都必须获取并添加抖动偏移量。与标准的基于切片的体绘制相比,这会导致渲染性能下降。对于短片段程序,例如简单的后插值分类片段程序,开销是显著的。对于复杂的片段程序,例如动态梯度计算片段程序(见第5.3.1节),开销很小。相反,对于光线投射,偏移只能在光线设置阶段添加一次,如清单9.3中的Cg fragment程序所示;也就是说,与切片相比,对于一条完整的光线,抖动只进行一次。因此,开销可以忽略不计。如前所述,我们将长度等于采样距离和随机数纹理大小的光线方向向量作为片段着色器的输入变量。
这种方法在不需要高采样率的情况下,对隐藏木纹伪影非常有效。得到的图像包含更多的噪声,但是噪声通常比常规模式不那么烦人。即使在非常低的采样率下,随机抖动的体绘制也可以产生可接受的结果。图9.4显示了标准体绘制和体绘制与采样位置随机抖动的比较。
参考文献:NAKAO,Megumi. Real-time Volume Graphics[J]. Medical Imaging Technology, 2007, 25.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。