随着3D动画行业的发展,在虚拟现实、三维游戏等领域中,都用到了实时渲染技术。单渲染系统计算不了渲染过程中的巨大数据量,如果想实现对3D场景的实时渲染,最好采用分布式渲染系统。而在一般的分布式渲染系统中,不需要考虑对场景的优化,因此同一场景在不同的系统当中会渲染出一样的效果。而分布式实时渲染系统则与之不同,要想达到好的实时渲染效果,就要采取一定技术进行场景优化,以降低计算量,提升渲染效率与质量。

一、并行算法sort-first

根据在物象的转换过程中,拆分渲染任务的位置不同,可将并行渲染系统分为三种。sort-first是在几何变换之前就重新分配图元;sort-middle算法对屏幕空间的几何元素重新分配是在几何变换与光栅化间进行;sort-last则是在光栅化的最后重新对像素进行分配。
sort-first是比较常见的一种并行算法,它首先将要输出的图像划分成为多个不重叠的区域,每块区域由它专门的渲染节点负责渲染,也就是要预分配每条流水线的渲染任务。在这种架构中,每一个渲染节点都相当于一条完整的渲染流水线,不需要在几何变换和光栅化过程中传递几何信息,也不用在最终进行深度信息的合并。
首先在分布图元时,需要计算图元覆盖的区域,这种计算被称为“预变换”。然后对分配好的各图元进行几何处理和光栅化操作。最后将渲染好的子图像拼接为最终图像。

newsview0185_1.jpg

Sort-first算法

二、场景优化

在实时渲染过程中,对场景进行优化,降低场景的复杂程度,可以有效提高渲染效率。本文选择的是Level of Detail (LOD)细节层次模型。
LOD算法主要是根据三维场景中的物体的清晰度不同,生成多个具有不同层次细节的版本,从而实现对清晰度分层管理的目的。在实时渲染的进程中,依据试点不同,选取合适的LOD模型,可以在不损伤细节的前提下,降低场景复杂程度,提高渲染速度,并加快场景的显示速率。
为降低场景的复杂程度,首先利用八叉树算法对三维场景进行分析与管理。接着针对不同物体,以及不同需求,选择合适的LOD模型,例如剔除法,即找到场景中观察者无论如何都看不到的图元,并将其剔除,以加快渲染速度。另一种方法是根据观察者与场景中物体的距离进行选择,距离远的可以采用比较粗糙的细节层次。还可以依据物体的运动速度选出适应的模型,运动较快的物体,在屏幕上显示的细节比较模糊,可以使用较粗糙的细节层次表现出来。

三、实时光线追踪

在计算机图形学领域里,光线追踪是十分经典的算法。光线跟踪的过程就是通过对现实世界当中的成像原理进行模拟,从而对每像素着色的过程。在光线追踪过程中,主要考虑光线传递的方法、中止位置以及光线所得的着色值等问题。当光照射到物体表面时,会产生光的反射、折射、吸收及透射等等现象,要想处理所有状况,就要选出合适的光照模型。我们可以选用简单光照模型,即Phong光照模型来简化问题。该光照模型可以依据物体的材质,在场景及物体交汇的交点处计算出镜面反射(specular)值和漫反射(diffuse)值,从而确定着色值。
传统的光线跟踪方案只能通过串行的方式解决光线产生、光线和场景的碰撞检测等问题。由于光线追踪的过程当中,不需要考虑像素间的依赖问题,因此可以利用这一特性,设计一种并行的光线追踪方案,其中初始参数包含观察方向、视角等,并利用这些参数生成初始光线。

newsview0185_2.jpg

并行的光线追踪算法结构

并行光线跟踪的实现主要由以下几个部分组成:
1) 针对光线的产生问题,对每个光线都生成相对独立的基本参数。
2) 针对光线与场景碰撞检测问题,因为在光线着色的过程中,像素之间没有依赖关系,所以对每一条光线可以进行并行地着色化。
实现以上算法后,可以针对不同的需要对细节进行再度优化,从而提升算法执行的效率。例如:在创建KD-Tree的时候,可以先使用均匀分割的方式,直到三角形数目达到规定数目后再利用最优面的分割方式,通过这种方案可以有效地提高创建KD-Tree的效率。我们还可以把场景当中的一些原始几何数据、KD-Tree等信息进行分类,并存储于不同的纹理之中。通过这种方案不仅可以利用数据的打包存放减少对同种数据资源的重复访问,还可以利用纹理提供的虚拟缓存,从而降低了数据访问的延迟,提升了访问效率。
使用这种光线追踪方案对场景进行渲染,渲染结果如下图所示。

newsview0185_3.jpg

人物模型渲染结果

newsview0185_4.jpg

场景渲染结果

通过对渲染结果分析可知,使用这种实时光线追踪算法,可以有效地提高渲染的质量,使场景更富真实感,从而达到更好的实时渲染效果。
利用这些技术,可以有效降低渲染时长,加快图像显示速率,达到更好的实时渲染效果。