当前位置:   article > 正文

基于纹理的体渲染技术详解

win10逆战程序创建纹理失败

5db1ff364b75d2b4db80aed2e62cfd8b.png
Chapter 39. Volume Rendering Techniques​developer.nvidia.com
a159d0edd686673be4b0e6b858b84052.png

介绍

体渲染技术的用途:

  • 液体、云、火焰、烟雾和灰尘很难用几何建模,更适合用体积模型表示。
  • 在科学工程领域中将三维数据集视觉化

本章只介绍基于纹理的体渲染,而不介绍光线投射的体渲染。基于纹理的体渲染很容易和多边形算法结合,只要求很少的渲染pass,又能提供很棒的交互性,还不需要牺牲渲染的质量。

体渲染

直接体渲染法使用光学模型把数据值映射为光学性质(如颜色和不透明度)

1fe8d0039fa3cd34650644bd12024af2.png

体素(voxel)类似于像素和纹素的概念,指单独的体元素,对应数据空间中的一个位置。

光学模型描述体积中的粒子如何和光交互,最通用的模型假定体积由同时发射和吸收光的粒子组成,更复杂的加上了局部光照、体阴影和光的散射。

创建图像的过程是沿着所有的视线对体积采样并累计光学性质。对于发射-吸收模型,累计的颜色和不透明度按以下方程计算,其中Ci和Ai是由转换函数指定给采样i上的颜色和不透明度的数据值,Ai是吸收的近似值,而加权的颜色Ci则是沿着光线取样点i到i+1之间发射和吸收的近似值。

4e149bbdb7242ca29bb0e27d6412d4b6.png

7828e4de663ddfc8936e346b49954fc3.png
Volume Sampling and Compositing

渲染步骤:

  1. 通过渲染垂直于视线方向的代理多边形取得采样数据组
  2. 转换函数把颜色和不透明度指派为取样位置的数据值
  3. 沿着视线方向累计所指派的颜色和不透明度,产生数据的图像

基于纹理的体渲染

主要分为初始化、更新和绘制三个步骤,如下:

6278392be679b5f78b998e5ddfa536b8.png

转换函数查询表和片元shader通常在应用的初始化阶段创建

观察参数发生变化时都要重新计算代理几何体,由多边形组构成。多边形切片的计算由切片平面与体包围盒相交的顶点顺时针或逆时针排序得到。

把数据组存储为2D纹理切片组时,速度很快但可能会产生以下几个问题:

  • 沿每个主要方向复制数据切片会增加3倍内存并损耗性能,运行时重建切片可避免数据复制。
  • 取样率由体分辨率决定,可以通过三次曲线插值来解决
  • 取样距离随视点变化会造成强度随摄像机移动变化,可能出现间断失真。

在绘制多边形切片前需要设置渲染状态,包括禁用光照和剔除、建立alpha混合等。绘制时片元shader用纹理单元进行输入,此时指定shader输入参数并为渲染建立顶点数组。

一个简单的算法步骤:

  1. 创建和下载作为3D alpha纹理的数据组,加载下面的片元程序
  2. 加载观察模型矩阵和投影矩阵
  3. 启用alpha混合,源片元设置为1,目标片元设置为1-source alpha
  4. 禁用光照和深度测试(此处没有不透明物体)
  5. 把数据纹理约束于纹理单位0
  6. 启用并约束片元程序,指定它的输入
  7. 沿着z轴画纹理方格,x-y顶点坐标为(–1, –1), (1, –1), (1, 1), (–1, 1),对应的x-y纹理坐标是(0, 0), (1, 0), (1, 1), (0, 1)。z顶点和纹理坐标在-1到1和0到1之间均匀增加
  1. void main(uniform float3 emissiveColor,
  2. uniform sampler3D dataTex,
  3. float3 texCoord : TEXCOORD0,
  4. float4 color : COLOR)
  5. {
  6. float a = tex3D(texCoord, dataTex); // Read 3D data texture
  7. color = a * emissiveColor; // Multiply color by opacity
  8. }

上例渲染结果:

554dffbe6d047c45e52cf1051a8a1a5d.png

实现细节

数据的表达和处理

  • 体数据组有不同的大小和类型,通常存储为单独的3D数组。根据代理几何体的类型,创建3D纹理对象。或者1到3组2D纹理的切片,纹理的尺寸为2的幂。
  • 为了改变数据组的大小,可以重取样使其进入更粗或更细的网格或填补在边界。此处涉及到不同的插值技术。
  • 局部光照技术和多维空间转换函数在渲染时使用梯度信息,通常通过中心差法来实现,是求梯度的近似方法,如以下公式:

c8c2afa51267ad85256bb37d53e9fcb5.png
  • 直方图可以帮助分析数据中哪些范围的值更重要,不过不显示体积中采样的分布空间
  • 数据处理步骤的输出是纹理组,将多个纹理合成一个纹理有时更有效。

代理几何体

当数据存储在3D纹理中是,用排列的观察平面把包围盒切片,产生多边形组进行体积的采样。算法如下:

  1. 使用观察模型矩阵MV,把体包围盒顶点转变为观察坐标
  2. 找到所转换顶点的最小和最大z坐标,使用间距计算两个值之间的采样面数目
  3. 依次处理每个平面,测试和包围盒相交的顶点并加入列表。对顶点求平均值得出中心点,再把顶点投影到xy平面上计算它们围绕中心点的角度从而进行顺时针或逆时针排序。把代理多边形转化为三角形网格并把顶点加入数组。

0a03fcf21286acf7cfede29972b4c7f0.png
View-Aligned Slicing with Two Sampling Planes

渲染

  • 转换函数。作用是强调数据的特征,做法是把数据值和其他的数据测量映射为光学性质。一个简单的一维转换函数片元程序如下:
  1. void main(uniform sampler3D dataTex,
  2. uniform sampler1D tfTex,
  3. float3 texCoord : TEXCOORD0,
  4. float4 color : COLOR)
  5. {
  6. float v = tex3d(texCoord, dataTex); // Read 3D data texture and
  7. color = tex1d(v, tfTex); // transfer function texture
  8. }
  • 光照。最普通的是Blinn-Phong模型,在体渲染中规格化的梯度矢量被当作表面法线使用。

9de8d4131621c32d3d4ef1649b9246b9.png
  • 合成。合成的单个步骤成为算子,从背面往前面排序的迭代计算称为上算子,从前往后称为下算子,分别如下所示。alpha混合时,对于上算子,源片元设置为1,目标片元设置为1-source alpha;对于下算子,源片元设置为1-dest alpha,目标片元为1

2f60d2641480a72a07dceda3639b02bc.png

368165f8a73c2248c91c55ac0c61da82.png

高级技术

体光照

之前提到的光照模型简单却不符合实际,此处引入更复杂的光照。使用像素缓存,累积从光源视点看所衰减的光量,需要把切片轴设定在射线和光线的中间。算法如下:

  1. 把眼睛缓冲清零并初始化光源缓冲为光源颜色CL,也可以用纹理贴图初始化光源缓冲
  2. 使用之前的体渲染步骤计算物理空间的代理几何体,根据视线方向和光线方向设定切片方向s,如下图。对于光源而言从前到后渲染体都是用上算子

f9eef2e4d989348a8d3738e9f2ba676e.png


3. 对于每个切片

    1. 通道1:渲染切片并混合进眼睛缓冲:把切片顶点投影到光源缓冲并转换成2D纹理坐标,在片元shader中计算转换函数求出C和A再用光源颜色CL乘以C,并使用对切片方向合适的算子把C和A混合进眼睛缓冲
    2. 通道2:使用上算子把切片渲染和混合进光源缓冲

fe38dee4901cb2e66f0b307d222a3507.png

效果如下:

7b1124a79932287e8c3405795dc91cc7.png

此外,在以上算法中还可以加入半透明的散射光计算,通过在切片之间传播和模糊间接光。还可以对每个颜色通道指定一个独立的alpha,使得不同通道的衰减不同

程序化渲染

体渲染的缺点之一是低分辨率时不能表现小的高频细节,此时程序化噪声模拟是添加细节的有效技术。有以下两个方法:

  • 扰动着色阶段的光学性质
  • 扰动体积本身,即使用噪波修正数据在体中存取的位置

125d6f2c5a87dacd1b231f3c45ad2a0a.png

对性能的考虑

  • 产生许多片元会使得光栅化成为瓶颈,要注意避免产生不必要的代理几何体,可以通过缩小视口、降低采样率、使用预先分级以及不画空白区域来优化
  • 片元程序的限制,使用预先计算的查询表可能由于纹理读取会减小渲染速度,需要在片元操作和纹理读取间达到平衡
  • 纹理内存的限制,曲线插值可能对性能有损耗,纹理的压缩可会对性能有影响。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/95000
推荐阅读
相关标签
  

闽ICP备14008679号