直接体绘制(Direct Volume Rendering)原理

文章目录

    • 什么是体绘制?
    • 体绘制与面绘制的区别?
    • 什么是科学可视化?
    • 体绘制与科学可视化的关系?
    • 体绘制的应用领域?
    • 体绘制与透明光照模型?
    • 什么是体数据?
    • 什么是体素?
    • 体绘制算法之光线投射算法
      • 光线如何穿越体纹理?
      • 光透公式:
      • 如何判断光线投射出体纹理?

学习“GPU编程与CG语言之阳春白雪下里巴人”记录:

什么是体绘制?

依据三维体数据,将所有体细节同时展现在二维图片上的技术,称之为体绘制技术。利用体绘制技术,可以在一幅图像中显示多种物质的综合分布情况,并且可以通过不透明度的控制,反应等值面的情况。

体绘制与面绘制的区别?

CT图片与相机拍出来的照片

什么是科学可视化?

科学可视化技术是运用计算机图形学、图像处理、计算机视觉等方法,将科学、工程学、医学等计算、测量过程中的符号、数字信息转换为直观的图形图像, 并在屏幕上显示的理论、技术和方法。

体绘制与科学可视化的关系?

体绘制是科学可视化领域中的一个技术方向。如前所述,体绘制的目标是在一副图片上展示空间体细节。举例而言,你面前有一间房子,房子中有家具、家电,站在房子外面只能看到外部形状,无法观察到房子的布局或者房子中的物体; 假设房子和房子中的物体都是半透明的,这样你就可以同时查看到所有的细节。这就是体绘制所要达到的效果。

体绘制的应用领域?

医疗领域:计算机断层扫描(CT)
地质勘探、气象分析、分子模型构造等科学领域:如三维气象可视化
强化视觉效果:模拟流体、云、烟等
直接体绘制(Direct Volume Rendering)原理_第1张图片

体绘制与透明光照模型?

透明光照模型一般是跟踪光线的交互过程,并在一系列的交互过程中计算颜色值;而体绘制技术是在同一射线方向上对体数据进行采样,获取多个体素的颜色值,然后根据其透明度进行颜色的合成。
总的来说,透明光照模型侧重于光照效果展现,并偏向艺术化;而体绘制技术侧重展现物质内部细节,要求真实!

什么是体数据?

体数据一般有 2 种来源:

  1. 科学计算的结果,如:有限元的计算和流体物理计算;
  2. 仪器测量数据,如:CT 或 MRI 扫描数据、地震勘测数据、气象检测数据等。

什么是体素?

体素,是组成体数据的最小单元,一个体素表示体数据中三维空间某部分的值。体素相当于二维空间中像素的概念。
直接体绘制(Direct Volume Rendering)原理_第2张图片

体绘制算法之光线投射算法

原理:光线投射方法是基于图像序列的直接体绘制算法。从图像的每一个像素,沿固定方向(通常是视线方向)发射一条光线,光线穿越整个图像序列,并在这个过程中,对图像序列进行采样获取颜色信息,同时依据光线吸收模型将颜色值进行累加,直至光线穿越整个图像序列,最后得到的颜色值就是渲染图像的颜色。

光线如何穿越体纹理?

在体绘制中需要一个三维模型作为体纹理的载体,体纹理通过纹理坐标(三维)和模型进行对应,然后由视点向模型上的点引射线,该射线穿越模型空间等价于射线穿越了体纹理。
通常使用普通的立方体或者圆柱体作为体绘制的空间模型。
直接体绘制(Direct Volume Rendering)原理_第3张图片
根据视点和立方体表面点可以唯一确定一条射线,射线穿越整个立方体等价于穿越体数据,并在穿越过程中对体数据等距采样,对每次得到的采样数据按照光透公式进行反复累加。

光透公式:

透明度本质上代表着光穿透物体的能力,光穿透一个物体会导致波长比例的 变化,如果穿越多个物体,则这种变化是累加的。所以,透明物体的渲染,本质上是将透明物体的颜色和其后物体的颜色进行混合,这被称为 alpha 混合技术。 图形硬件实现 alpha 混合技术,使用 over 操作符。Alpha 混合技术的公式如下所示:
在这里插入图片描述

如果从前面到背面进行采样合成,则合成公式为:
在这里插入图片描述
在这里插入图片描述
注意,很多体纹理其实并没有包含透明度,所以有时是自己定义一个初始的透明度,然后进行累加。
直接体绘制(Direct Volume Rendering)原理_第4张图片

沿射线进行采样:
直接体绘制(Direct Volume Rendering)原理_第5张图片
假定光线从 F 点投射到立方体中,并从 L 点投出,在立方体中穿越的距离为 m。当光线从 F 点投射到立方体中,穿越距离为 n(n 在这里插入图片描述
其中 tstart 表示立方体表面被投射点的体纹理坐标;d 表示投射方向;delta 表示采样间隔,随着 n 的增加而递增;t为求得的采样纹理坐标。通过求得的采样 纹理坐标就可以在体纹理上查询体素数据。直到 n>m,或者透明度累加超过 1, 一条射线的采样过程才结束。

如何判断光线投射出体纹理?

光线投射出体纹理,等价于光线投射出立方体。所以如何判断光线投射出体纹理,可以转换为判断光线投射出立方体。
首先计算光线在立方体中入射到出射的行进距离 m,然后当每次采样体纹理时同时计算光线在立方体中的穿越距离 n,如果 n>=m,则说明光线射出立方体。 给定光线方向,以及采样的距离间隔,就可以求出光线在立方体中的穿越距离n。
如果是在 CPU 上,距离 m 很容易通过解析几何的知识求得,直接求出光线和几何体的两个交点坐标,然后计算欧几里德距离即可。但是在 GPU 上计算光 线和几何体的交点是一个老大难的问题,尤其在几何体不规则的情况下;此外,就算是规则的几何体,光线与其求交的过程也是非常消耗时间,所以通过求取交点然后计算距离的方法不予采用。
在 GPU 中可以间接反应点和点之间关系的有两个量,一个是纹理坐标,另一个就是深度值。通常在渲染中会进行深度剔除,也就是只显示深度值小的片段。 不过也存在另外一个深度剔除,将深度值小的片段剔除,而留下深度值最大的片段(深度值的剔除方法设置,在 OpenGL 和 Direct中都有现成函数调用)。如果使用后者,则场景中渲染显示的是离视点最远的面片集合。
计算距离 m 的方法:

  1. 剔除深度值较大的片段(正常的渲染状态),渲染场景深度图 frontDepth,此时 frontDepth 上的每个像素的颜色值都代表“某个方向上离视点最近的点的距离”;
  2. 剔除深度值较小的片段,渲染场景深度图 backDepth,backDepth 上的每个像素的颜色值都代表“某个方向上离视点最远的点的距离”;
  3. 将两张深度图上的数据进行相减,得到的值就是光线投射距离 m。

通常,背面的面片(不朝向视点的面片)是不会被渲染出来的,图形学 基础比较好的同学应该知道,三个顶点通常按逆时针顺序组成一个三角面, 这样做的好处是,背面面片的法向量与视线法向量的点积为负数,可以据此 做面片剔除算法(光照模型实现中也常用到),所以只是改变深度值的比较 方法还不够,还必须关闭按照逆\顺时针进行面片剔除功能,这样才能渲染 出背面深度图。图 46 是立方体的正面和背面深度图。
直接体绘制(Direct Volume Rendering)原理_第6张图片
直接体绘制(Direct Volume Rendering)原理_第7张图片

你可能感兴趣的:(可视化)