1 译者前言
毕设打算做体素渲染器,导师给了paper(或者是书?),《Real-Time Volume Graphics》
开个坑,监督自己认真看完。
【不是英语专业的,随手写的,不要较真】
Part I 导论
1 体渲染
传统的建模中,使用诸如多边形网格,NURBS(非均匀有理B样条曲面)面片或细分曲面之类的表面表示来创建3D对象。 在传统的建模范式中,表面的视觉属性(例如颜色,粗糙度和反射率)是通过着色算法建模的,该算法可能像Phong模型一样简单,也可能像功能齐全的位移变量各向异性BRDF一样复杂。 由于仅在表面的点上计算光的传播,这些方法通常不能考虑发生在大气中或物体内部的光的相互作用。
与表面渲染相反,体渲染描述了用于从三维标量数据生成图像的多种技术。 这些技术最初是由通过对自然现象的测量或数值仿真来获取体积数据的科学可视化驱动发展的。 典型示例是通过计算机断层扫描(CT)或磁共振成像(MRI)获得的人体内部医学数据。 其他示例包括计算流体力学(CFD),地质和地震数据,以及抽象数学数据,例如伪随机数的3D概率分布。
随着高效体绘制技术的发展,体数据在视觉艺术和计算机游戏领域中也变得越来越重要了。 体积数据非常适合描述模糊的对象,例如流体,气体和例如云,雾和火等的自然现象。 许多艺术家和研究人员已经生成了体数据,以综合补充表面模型,在过程上来说,这对于渲染高质量的特效来说是特别有用的。
尽管体积数据比表面更难以可视化,但以真正的三维实体来渲染他们而不退回到2D子集,是很有价值和意义的。
1.1 体数据
离散化的体数据集可以被认为是一个元素是立方体(体素)的简单三维数组,每一个体素都代表着空间的一个单位。
图1.1 在离散化后,构成体对象的体素
尽管把体素想象成一个很小的立方体是容易的,并且这也可能对可视化单个体素的附近区域会有帮助,但更合适但是把每个体素认为是从连续三维信号中对一个无穷小的点采样得到的样本。
f(\vec{x})\in R\ with\ \vec{x}\in R^{3}\tag
假设连续信号是带限信号,截止频率是 v_{s} ,采样理论允许我们在不低于两倍截止频率的情况下精确重建(尼奎斯特)。然而,在实践中,有两个主要的问题阻止了采样体数据的理想重建。
-
根据采样理论,理想的重建需要在空间域中将采样点与Sinc函数进行卷积(图1.2a)。 对于一维情况,sinc函数如下:
sinc(x) = \frac{ sin(\pi x)}{\pi x}\tag三维版本仅通过张量积即可获得。注意到,该函数是无限延伸的。因此,要想精确重建,必须将原始信号在任意位置的所有采样点都考虑在内,而不仅仅是考虑邻域内的点。这表明实践中会出现计算量过大的问题。
-
普遍来讲,现实世界中的数据通常并不是带限信号。不同材质间尖锐的边界都是一个阶越函数,这意味着频率将会无限延伸。对非带限信号对采样和重构都将会产生走样。
为了从一个体素数组中重构连续信号,实践中理想对3D sinc滤波器通常使用一个盒式滤波器(图1.2a)或一个帐篷滤波器(图 1.2b)代替。盒式滤波器计算最近邻插值,这会导致尖锐的不连续性和一种更加块状化的表面。通过与3D帐篷滤波器卷积得到的三线性插值有着计算开销和输出信号平滑度的良好折衷。
1.2 直接体素渲染
体素渲染有一种试图在预处理步骤中从体数据中提取出表面表示的间接方法。直接方法与之不同,直接方法通过计算描述物体是如何发出,反射,散射,吸收和遮挡光的光学模型来展示体素数据。标量值被虚拟地映射到描述3D空间中各个点的光交互相互作用的物体属性上。该映射被成为分类(参见Part 4),该映射常在一个转换方程中使用到。这些物理属性常被用于图像合成。在1.2.1节中,我们将会讨论到用于直接体素渲染的不同光学模型。
图1.2:一维信号重建滤波器。在实际中,使用盒式滤波器(A)和帐篷滤波器(B)而不是理想的sinc滤波器(C)
在图像合成中,光线传播是通过基于光学模型积分光线沿着视线的影响计算的。对应的积分被称为体素渲染积分,我们将会在1.2.2节进行介绍。自然,在现实世界的条件下,这种积分以数学形式完成。可选地,可以根据外部光源的光照对体进行着色,这是第三部分对主题。
1.2.1 光照模型
几乎所有直接体渲染算法都将体视为具有一定密度的发光粒子的分布。 这些密度或多或少直接映射到RGBA四元体,以便沿着视线合成。 但是,此过程是由基于物理的光学模型驱动的。
对于直接体渲染来说,最重要对光学模型是Nelson Max在一篇调查论文中描述对,在这里,我们仅简要总结这些模型:
- 仅吸收:体被假设为由完全吸收所有撞到他们身上光的冷的黑色粒子组成。他们不发光,也不散射光.
- 仅发光:体被假设为由仅发光但不吸收光的粒子组成,因为吸收是可以忽略不计的。
- 吸收+发光:这种光学模型是直接体素渲染中最常见的一个。粒子会发光,也会遮挡(吸收)到来的光。然而,没有散射或间接光。
- 散射和着色/阴影:这个模型包括体素外部光照的散射。被散射的光可以假定不受远处光源的干扰,它也能被考虑内的光源和体素之间的粒子遮挡。
- 多重散射:这种复杂的模型支持能被多个粒子散射的间接光。
所有之后考虑的光照模型都将是同时发光和吸收光的粒子的一种。在下一节中所描述的体渲染积分也假设了这种粒子光学模型。更复杂的模型考虑光在体自身粒子间的散射,也包括阴影和自身阴影的效果。
1.2.2 体渲染积分
每一个基于物理的体渲染算法都以某种方式来计算体渲染积分,即使视线没有在算法中显式地应用。最基础的体渲染算法是1.2.3节介绍的ray-casting算法。它也许可以被认为是计算该积分最直接的数学方式。之后会涵盖更多的细节,但对于本节,知道ray-casting是下述过程就足够来。Ray-casting可以看作是对要渲染的图片中的每一个像素,从眼睛发出一束光线,传过像素中心,进入体内部,然后对沿着射线遇到的体密度进行光学属性的积分。
注意到,这种通用的描述假定了体和映射到体上的光学属性是连续的。当然,在实际中,体数据是离散的,并且积分的计算结果是数值近似的。结合多种简化方法,通常使用黎曼和来代替积分。
我们用 \vec{x}(t) 来表示投射到体内部的光线,并使用到眼睛的距离t来将之参数化。用 s(\vec{x}(t)) 来表示沿光线的某个位置对应的标量。如果我们使用发光-吸收光模型,那么体渲染方程将吸收系数 \kappa(s) (考虑光线的吸收),和发射颜色 c(s) (考虑有效发射的辐射能)沿着光线进行积分。为了让方程简单些,我们将发射系数 c 和吸收系数 \kappa 表示为眼睛距离t的函数,而不是标量s的函数:
c(t) := c(s(\vec{x})) \ \ and\ \ \kappa(t)\ := \kappa(s(\vec{x}(t)))\tag
图1.3举例说明来发光和吸收光的想法。在距离t = d的位置发射的大量辐射能沿着视线连续被吸收了d距离,直到到达眼睛。这意味着,在t = d位置发出的辐射能 c 只有一部分 c^{'} 最终能到达眼睛。如果沿视线的吸收系数是常量 \kappa = const ,那么 c^{'} 总量是
c^{'} = c \cdot e^{-\kappa d} \tag
图1.3: 在t=d位置发出的辐射能在传播距离d后一部分被吸收了
然而,如果沿着视线的吸收系数 \kappa 不是常量,而是依赖于位置的量,那么到达眼睛的辐射能 c^{'} 的量就必须通过对距离d进行吸收系数的积分运算
c^{'} = c \cdot e {\int_{0}\kappa (t)dt}\tag
指数中吸收系数的积分:
\tau (d_{1}, d_{2})=\int_{d_{1}}^{d_{2}}\kappa (\hat t)d\hat t\tag
也被称为光学深度。在这个简单的例子中,光仅仅是射线的一个点上发出的。如果我们想要决定在这个方向上到达眼睛的辐射能 C 的总量,那么我们必须把射线上所有可能的位置 t 所发出的辐射能考虑在内:
C = \int_{0}^{\infty}c(t)\cdot e^{-\tau (0, t)}dt\tag
实践中,这个积分是通过沿着射线从前到后或从后到前的采样点的组合(例如透明度混合)来进行数值计算的,这是ray-casting方法中最容易说明的。
1.2.3 Ray-Casting
Ray-casting 是一种image-order(图像顺序,逐像素)直接体渲染算法,该算法使用体渲染积分(公式1.7)的直接数值计算。图片的每一个像素都会发出一束光线到场景中。沿射线对离散的体数据以等间距进行重采样,通常使用三线性插值作为重构滤波器。也就是说,对于每个重采样的位置,八个相邻体素的标量都会根据他们到实际采样的位置的距离来做加权平均。在重采样后,标量值都将通过一个查找表来映射到光学属性中去,也就是会产生一个RGBA的四维数,并包含对应位置的发光系数和吸收系数。体渲染积分是通过以从前到后或从后到前的Alpha混合的方式来近似求解的。
表示沿射线到某个位置 \vec{x}(t) 的累计吸收的光学深度 \tau (公式1.6)能使用黎曼和来近似:
\tau(0, t) \approx \tilde{\tau}(0, t) = \sum_{i=0}^{\lfloor t / \Delta t \rfloor}{\kappa (i \cdot \Delta t)\Delta t} \tag
\Delta t 表示连续的重采样的位置间的距离。指数上的和可以通过多个指数项的乘来替换:
e^{-\tilde{\tau}(0, t)} = \prod_{i=0}^{\lfloor t/\Delta t\rfloor}e^{-\kappa(i\cdot \Delta t)\Delta t} \tag
现在,我们能引入在Alpha混合中很出名的不透明度A了。它是这样定义的:
A_{i} = 1 - e^{-\kappa(i\cdot \Delta t)\Delta t} \tag
然后重写公式1.9:
e^{-\tilde{\tau}(0,t)} = \prod_{i=0}^{\lfloor t/d\rfloor}(1-A_{j}) \tag
这允许不透明度 A_{i} 被看作为第 i 个射线段的吸收的近似,而不是单个点的。
类似地。第 i 个射线段发射的颜色能够这样近似:
C_{i}=c(i\cdot \Delta t)\Delta t \tag
有了沿着射线的发射和吸收的近似,我们现在能把体渲染积分近似为(通过 n=\lfloor T/\delta t\rfloor 表示样本数量):
\ \tilde{C} = \sum_{i=0}{n}C_{i}\prod_{j=0}(1-A_i) \tag
公式1.13能通过以从后到前或从前到后的顺序的Alpha混合来迭代计算。
1.2.4 Alpha混合
公式1.13能以从后到前的顺序使用从n-1到0的i来迭代计算:
C_{i}{'}=C_{i}+(1-A_{i})C_{i+1} \tag
新值 C_{i}^{'} 可以由当前位置 i 的颜色 C_{i} 和不透明度 A_{i} 以及前一个位置 i+1 的复合颜色 C_{i+1}^{'} 来算出。起始条件是 C_{n}^{'}=0 。
注意到,在所有混合方程中,我们使用带有不透明度权重的颜色,也就是所说的 associated\ colors (我不知道中文名词是啥,字面意思是结合颜色?)。带有不透明度权重的颜色是已经提前乘好他们相关的不透明度的颜色。这是一种十分便利的符号,在用于插值时尤其重要。可以证明,对颜色和不透明度分别进行插值后会造成失真,但对不透明度加权的颜色进行插值就会得到正确的结果。
下面是可选的使用从前到后顺序的迭代公式,用以计算方程1.13,i从1递增至n:
C_{i}{'}=C_{i-1}+(1-A_{i-1}^{'})C_{i} \tag
A_{i}{'}=A_{i-1}+(1-A_{i-1}{'})A_{i} \tag
新的值 C_{i}^{'} 和A_{i}^{'} 是从当前位置 i 的颜色 C_{i} 和不透明度 A_{i} 以及上一位置 i-1 的复合颜色 C_{i-1}^{'} 和不透明度 A_{i-1}^{'} 来计算的。起始条件是 C_{0}^{'}=0 和 A_{0}^{'}=0 。
注意到从前到后复合需要追踪alpha的值,然而从后到前组合不需要。在硬件实现中,使用从前到后的复合的话,意味着终点alpha必须被帧缓冲所支持(比如一个alpha的值必须存在帧缓冲中,然后它必须能在混合操作中用作乘数)。然而,由于从前到后复合的主要有点事一种叫做提前射线终止的常见优化方法,这种方法会在沿射线累计的alpha到达0时,将过程立刻终止。这在硬件上是难以执行的,使用GPU的体渲染通常使用从后到前的复合。
1.2.5 Shear-Wrap(剪-扭曲?) 算法
Sharp-warp算法是一种非常快的计算体渲染积分的方法。与ray-casting相反的是,没有光线回射到体内,但体自身逐片地投影到图像平面上。此投影使用二维切片中的双线性插值,而不是ray-casting使用的三线性插值。
图1.4举例说明了正交投影下的Shear-warp的基本思想。这个投影不会直接发生在最后的图像平面上,但是会在一个中间图像平面上。这个中间图像平面叫做基平面,它与体对齐,而不是与视口对齐。此外,对体本身进行修剪(shear,这里指的是把矩形修剪为平行四边形,可以看图来理解,感觉Shear的意思好像翻译错了),以便将倾斜的投影转换为垂直于基平面的投影,从而可以非常快地实现该投影。在这样设置后,就可以使用简单的二维图像重采样来重构整个切片。最终基平面上的图像被扭曲到最终图像平面。注意,扭曲仅在生成一个图像时需要一次,而不是每一个切片。如图1.5所示,在对体积切片进行修剪外,可以通过缩放体切片来兼容透视投影。
图1.4 用于正交投影的Shear-wrap算法
图1.5 用于透视投影的Shear-wrap算法
上面概述的巧妙方法和其他像对体数据进行游程编码等的优化方法使得Shear-Wrap算法可能时最快的体渲染方法。尽管这是最初为软件渲染开发的,但我们也将在硬件体渲染中遇到类似于Shear-wrap的原理,尤其是在基于2D纹理的体渲染的章节(3.2)中。当2D纹理用来存储体数据的切片并将这些切片的对战进行纹理映射,然后在硬件中混合时,类似于Shear-wrap,也可以用双线性插值来代替三线性插值。这再次成为可能,因为这种硬件方法还提供了对象对齐的切片。同样,基于Shear-wrap和基于2D纹理的硬件体渲染都需要存储三个切片栈,并根据当前的观察方向来切换。更多的细节将会在第3.2章讨论到。
1.3 最大强度投影(MIP)
最大强度投影时直接体渲染的一个变体,它不使用复合的光学属性,而是使用沿射线遇到的最大的值来确定对应像素的颜色。这种渲染模型最重要的应用领域是通过MRI(核磁共振成像)扫描仪获得的医学数据集。这些数据集通常由会表现出大量的噪声,这使其难以提取有意义的等值面或者定义有助于解释的传递函数。然而,使用MIP时,可以很容易得利用血管造影数据集内血管结构的数值高于周围组织的值来进行可视化。
在图形硬件中,当混合到帧缓冲的时候,可以使用最大值运算符来代替标准的alpha混合来实现MIP。图1.6展示了使用同样数据集的直接体渲染和MIP的比较。
图1.6 直接体渲染(A)和最大强度投影(B)的比较
本文转自 https://zhuanlan.zhihu.com/p/260540982,如有侵权,请联系删除。
标签:kappa,1.2,渲染,积分,实时,第一章,tag,体素 From: https://www.cnblogs.com/hustshu/p/17136215.html