和光线追踪(Ray Tracing)类似的是,Ray Casting也要对画面的各个像素都发射或者投射光线,所不同的是,一旦出现交集,这个动作就停止并且不会再向这个像素投射第二条光线。
值得注意的是,Ray Casting和Ray Tracing虽然听上去有些类似,并且在开头的计算动作上也是几乎相同,但是两者绝对不是一回事,主要的应用场合也有很大区别,前者主要是用来获取可视面和形态,后者则是主要作光线方向和强度计算 ,当然由于工作原理接近,少数情况下也可以互通使用。
正因为这样,Ray Casting要比Ray Tracing更快,因为后者投射第二条光线的时候就会涉及内存访问所带来的各种问题。此外,Voxel的光线交集计算也要比三角形快得多,这也是Ray Casting在这里的另一个优势。除此以外,我们无需为加速这些交集计算建立而额外数据结构(在三角形上执行光线追踪的话,一般需要建立被称作KDtree的数据结构来时实现处理加速),Voxel的八分树既是数据结构(几何、纹理),同时也是加速结构。
上面我们讨论的是Voxel八分树内存空间上的优势,那么在渲染的时候,这样的架构又有怎样的优点呢?
Voxel八分树在渲染中的一个主要优势是提供了一个纹理细节度求解的简洁途径,并且在几何体细节度求解上体现此优势(都只需要单一算法)。因为正如我们前面提到的那样,八分树包含了彩色信息,因此我们省略掉了2D纹理,更准确而言,八分树本身既是纹理同时也是几何体。因此在传统渲染方式中必须独立执行的纹理、几何体细节度管理问题现在已经合并为一个单一系统:八分树细节度管理,这使得问题变得相当简单,原则上这其实就是一个在纹理贴图中采用的mipmaping扩展。
Mipmap的作用就是用来尝试保存接近像素(pixel)尺寸的纹理元素(texel),为此,纹理会被预计算并保存为若干分辨率的版本,然后由硬件根据不同的mipmap级别选择屏幕上纹理的分辨率。
这样的动态细节度选择技术同样能在Voxel上达成。一旦Voxel的尺寸小于像素尺寸的话,八分树的光线遍历就会在这个级别上被叫停。你所需要的只是保存八分树各个节点子级所包含信息的平均值,然后你就有了一个非常简单的管理细节度途径。这个机制非常适用于流式数据系统,而这又有一点像id Software已经应用于Megatextues(兆级纹理)的数据处理方式。只有这部分八分树需要存储到显卡内存中,另一部分则存放在系统主内存中以加速后续的存取,而八分树的大头实际上保存在硬盘或者其他海量存储媒介当中。
这样的机制可以让我们拥有几乎无限的几何体数量以及纹理(图7)。我们可以按照显示时的内存大小和刷新时间,来设定八分树的细节度。能对此限制的只是艺术家们用于创作八分树的时间量以及下一代电脑系统存储媒介的物理上限。
图7 八分树的细节度越高,图形也就相应地更精细。
当然,这两个问题其实也是可能有些办法来解决的,例如采用Megatextures或者离散虚拟纹理等虚拟纹理系统,这类纹理系统已经在现有的CryEngine 3和idTech 6等3D引擎中集成。几何体问题的解决要更棘手一些,不过我们也都有几个可能的方案了。简单的办法就是在不同的分辨率上预先计算若干本版本,这样的基本方案容易实现,但是在从一个分辨率级别切换到另一个级别的时候就会容易看到突变。
有些研究人员已经在细节度过渡平滑这个课题上使用被称作渐进网面的技术做了一些工作。所谓渐进网面(图8),就是每个几何体细节度的顶点分为两组,一组叫夫顶点,一组叫子顶点。当细节度调低的时候,子顶点的绘制会逐渐向夫顶点靠近,当细节度达到整数的时候,子顶点就被删除掉,此时剩下的都是由夫顶点所连结的边缘。
图8 渐进网面技术示意图
这个技术的确可行,但是它不够自动化,需要艺术家额外的工作以指示哪些边缘重要需要被保留,这也意味着减少了对模型精雕细琢的时间了。
另一个实现几何细节度平滑化过渡的方案是现在大家颇为熟悉的高序图元tessellation(镶嵌),这是在DirectX 11中正式引入的技术,至少有三个已经上市的DirectX 11游戏使用了该技术,按照NVIDIA在Fermi测试指南中透露的信息,id Software也将会采用tessellation技术。八分树的主要问题是创建相当耗时,无法在游戏运行的时候实时修改数据结构,在采用动态几何体的时候,Voxel八分树的这个缺点显得尤为突出。id Software对此的应对措施和当年Novalogic差不多,只对静态几何体采用Voxel八分树渲染,而动态的几何体则采用传统的三角形光栅化渲染显示。这意味这我们将可能无法看到具互动特性的地形,例如爆炸依然只能让地面出现一团黑色的痕迹而不是出现一个真实的弹坑。
此外,虽然Voxel八分树可以透过一些技术让视野渐变或者行进时候看到的几何细节度变化平滑化,但是如果是像突然使用高倍数望远镜或者是传送门之类的装备,仍然会出现一个粗糙的轮廓而后逐渐清晰的几何体重构现象。游戏开发人员必须想办法让这些短时间的变化在一定的条件下变成合情合理,例如望远镜设计成电子式的,画面需要“充电”或者计算才能完全显示观测景象,传送门会让玩家的视野有短暂的眩晕感(或者其他任何合情合理的小把戏)等。
虽然传统的三角形渲染也会有类似的细节度突变问题,但是在大多数情况下都是表现为纹理细节度的变化,这只是让你看几秒的粗糙低分辨贴图效果,而在Voxel八分树中,如果不加一些特殊处理,你看到的将是令人崩溃的粗糙世界。
Voxel渲染的另一个不足是当我们凑近的时候会出现像素放大化痕迹,让画面看上去非常斑驳,这实在不是我们想象中的新一代渲染技术所能呈现的效果,幸运的是,我们可以使用三线性过滤将这个问题解决掉(图9)。
图9 画面锯齿不是问题,通过三线性过滤可以将其消除。
后,虽然八分树数据结构能节省内存空间,但是以Voxel方式存放整个渲染空间所需要的内存依然是相当庞大的,虽然我们提到过,这并不真的影响执行所需的资源。
为了管理、存储、分发这样的数据结构,id Software在压缩技术上进行了一些研究,该工作室的约翰·欧力克就曾经谈及这个话题。据他介绍,彩色数据压缩比率预期可以达到8:1,每个Voxel的位置数据可以用1.15个位元实现,与之相比三角形采用传统32-bit(单精度)格式的话每个三角形的所有信息需要160-bit(Voxel与之相比可以达到2.2:1的压缩比率)。