当前位置:   article > 正文

体渲染(Volume Rendering)与光线投射(Ray Casting)算法详解

体渲染

最近在接手一个实验室之前的实时光照体渲染的工作,需要了解一下体渲染和Ray Casting的相关知识,本文将简单的介绍上述两个知识,并简略对比一下光栅化渲染知识。

体渲染是使用一个3D数据的场,按照一定的成像方法产生的一张图像。对比于传统的光栅化渲染有很大的不同。传统的光栅化成像方式是通过构建三角形面片来对物体进行建模,而体渲染则是采用立方体的体素(voxel)进行建模。在成像方式上也有根本性的不同,常规光栅化渲染是通过对顶点和面进行着色(shading)操作来进行贴图或者是光照,而体渲染则是将光线投射都物体内部进行散射来构建最终得到的颜色。  

体渲染相对于传统渲染,由于是对场数据进行采样,所以对云雾,CT等非实体的场数据表现非常好,可以设置传输函数设置密度阈值来选择性的观察物体中的某一特定位置,如下图的Cornell Box 中的雾效果的兔子,使用光栅化渲染很难达到类似的效果   

简单了解完什么是体渲染的大致概念我们可以深入的了解体渲染的细节

Voxel,体素,Volume Pixel的简称,体素是体渲染的最小单元,表示场的3D空间某部分的值。体素情况如下图所示  

 (Volume Texture)体纹理

传统光栅化渲染中贴图仅仅是一个2D的图片,而体渲染中则是一个3D的纹理,通过一个3D坐标进行访问

现在既然大家都知道体渲染是怎么回事儿了,我们可以聊聊体素模型怎么和光线发生作用了 

我们接下来介绍光线投射算法

Ray Casting的基本方法是从视场Camera的位置向图像中的每一个像素,光线穿过整个图像序列,然后我们通过对图像序列采样获取颜色信息,同时根据光线吸收模型将颜色值进行累加,直至光线穿越整个图像序列。  

为了实现上述的功能我们需要构建光学模型  

1、吸收模型(Absorption only)

2、发射模型(Emission only)

3、吸收和发射模型(Absorption plus emissions)体素本身发射光线,并且可以吸收光线但不对光线进行反射和投射  

一般我们选择第三种光学模型,当光线穿越体素立方体时对光进行等距采样,并对每次得到的采样数据进行反复累加,那么如何累加呢,我们接下来就会讲到光透公式  

光透公式:

        透明度:代表光穿透物体的能力,透明度越高穿透能力越强。透明物体的渲染本质上是将透明物体于其背后物体颜色进行混合,此被成为alpha混合  

c_0 = a_sc_s+(1-a_s)c_d

a_s代表透明度,c_s代表透明物体本来的颜色,c_d代表目标物体的原本颜色,c_o是通过物体观察目标物体所得到的颜色值 

那么如果有多个物体呢,我们可以从前到后或者从后到前进行采样,假设从前到后

C_i^\Delta =(1-A_{i-1}^{\Delta})C_i+C_{i-1}^{\Delta}

A_i^\Delta =(1-A_{i-1}^{\Delta})A_i+A_{i-1}^{\Delta}

C_i是采样得到的颜色值,A_i是累积的不透明度

如果是从反面进行采样则索引的顺序反向,在此不赘述  

当我们知道光线在传播过程中是如何进行改变的我们可以沿着射线方向对光线进行采样  

 射线的图示如图所示,光线由F点进入立方体并从L点投出,设其在立方体中穿越的距离为m。当立方体中穿越的距离为n(n<m)进行采样。我们定义一个采样函数  

t=t_{start}+d*\Delta

 t_{start}表示立方体表面被投射点的体纹理坐标,d代表投射方向,\Delta表示采样间隔

当n>m或透明度大于1时采样过程结束

最后一个问题,我们怎么知道光线投射出了立方体,即计算m,我们通过深度值确定点和点之间的位置关系。

1.  剔除深度值较大的片段(正常的渲染状态),渲染场景深度图 frontDepth (参阅第 14 章),此时 frontDepth 上的每个像素的颜色值都代表“某个方向上离视点最近的点的距离”;

2.  剔除深度值较小的片段,渲染场景深度图 backDepth , backDepth 上的每个像素的颜色值都代表“某个方向上离视点最远的点的距离”;

3.  将两张深度图上的数据进行相减,得到的值就是光线投射距离 m 。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/94967
推荐阅读
相关标签
  

闽ICP备14008679号