赞
踩
体渲染技术的用途:
本章只介绍基于纹理的体渲染,而不介绍光线投射的体渲染。基于纹理的体渲染很容易和多边形算法结合,只要求很少的渲染pass,又能提供很棒的交互性,还不需要牺牲渲染的质量。
直接体渲染法使用光学模型把数据值映射为光学性质(如颜色和不透明度)
体素(voxel)类似于像素和纹素的概念,指单独的体元素,对应数据空间中的一个位置。
光学模型描述体积中的粒子如何和光交互,最通用的模型假定体积由同时发射和吸收光的粒子组成,更复杂的加上了局部光照、体阴影和光的散射。
创建图像的过程是沿着所有的视线对体积采样并累计光学性质。对于发射-吸收模型,累计的颜色和不透明度按以下方程计算,其中Ci和Ai是由转换函数指定给采样i上的颜色和不透明度的数据值,Ai是吸收的近似值,而加权的颜色Ci则是沿着光线取样点i到i+1之间发射和吸收的近似值。
渲染步骤:
主要分为初始化、更新和绘制三个步骤,如下:
转换函数查询表和片元shader通常在应用的初始化阶段创建
观察参数发生变化时都要重新计算代理几何体,由多边形组构成。多边形切片的计算由切片平面与体包围盒相交的顶点顺时针或逆时针排序得到。
把数据组存储为2D纹理切片组时,速度很快但可能会产生以下几个问题:
在绘制多边形切片前需要设置渲染状态,包括禁用光照和剔除、建立alpha混合等。绘制时片元shader用纹理单元进行输入,此时指定shader输入参数并为渲染建立顶点数组。
一个简单的算法步骤:
- void main(uniform float3 emissiveColor,
- uniform sampler3D dataTex,
- float3 texCoord : TEXCOORD0,
- float4 color : COLOR)
- {
- float a = tex3D(texCoord, dataTex); // Read 3D data texture
- color = a * emissiveColor; // Multiply color by opacity
- }
上例渲染结果:
数据的表达和处理
代理几何体
当数据存储在3D纹理中是,用排列的观察平面把包围盒切片,产生多边形组进行体积的采样。算法如下:
渲染
- void main(uniform sampler3D dataTex,
- uniform sampler1D tfTex,
- float3 texCoord : TEXCOORD0,
- float4 color : COLOR)
- {
- float v = tex3d(texCoord, dataTex); // Read 3D data texture and
- color = tex1d(v, tfTex); // transfer function texture
- }
之前提到的光照模型简单却不符合实际,此处引入更复杂的光照。使用像素缓存,累积从光源视点看所衰减的光量,需要把切片轴设定在射线和光线的中间。算法如下:
3. 对于每个切片
效果如下:
此外,在以上算法中还可以加入半透明的散射光计算,通过在切片之间传播和模糊间接光。还可以对每个颜色通道指定一个独立的alpha,使得不同通道的衰减不同
体渲染的缺点之一是低分辨率时不能表现小的高频细节,此时程序化噪声模拟是添加细节的有效技术。有以下两个方法:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。