我们之前讨论的大部分问题都是关于面表示的。由于这些方法不需要显式地表示物体的内部空间,所以非常高效。
体建模方法表示的是实体而不是表面。使用体模型可以产生更丰富的仿真效果,如物体的运动学行为和半透明光照效果。
一、有限元模型
有限元模型是将实体模型刨分成多面体网格的一种通用分割方案。她广泛应用于工程仿真分析中,用于计算物体内部的力、热传导和压力传导、流体运动等。但是有限元模型很少应用于纯粹的绘制场合,因为与网格模型相比它在这方面并无优势。
将体内空间刨分成四面体或立方体等规则有限元网格对于建模和仿真而言还有另外的优点:
- 进行随机空间访问的时间为常数
- 可实现稳定的邻域检索
立方体刨分成规则网络,这是一种直观的表示,容易以此构建层次结构。这种表示称为体素模型。
二、体素
体素(voxel)是像素(pixel)、体积(volume)和元素(element)的组合词,相当于3D空间中的像素。我们的世界某种意义上也可以说是由类似体素的东西构成的,只不过构成物体的原子更小,所以理论上体素可以说是完美的建模技术。
过去
说到体素,有必要提一下它的起源。体素是一个古老的技术,当游戏步入3D时代的时候,有两种不同的建模技术在持续发展。一种是沿用至今的多边形(polygons)技术。而另一种就是体素,除了在游戏产业中有应用,也被用在医学,地质等领域。需要注意的是体素顾名思义重点在于体积的概念而不是它的形状。
游戏中最早关于体素技术的运用大概是高度图(height-map),如Comanche: Maximum Overkill。之后随着硬件的提升,使游戏可以使用更多的多边形,带来更加真实的体验,体素渐渐没落,大多数的软硬件也都只对多边形渲染提供优化。
现在
随着《我的世界》(Minecraft)的火爆把体素重新拉回了人们的视线,虽然游戏本身其实并没有使用体素技术而仍是多边形渲染。人们开始重新思考体素的应用,越来越复杂的多边形技术及难解决的问题也推动了这一倾向。
通过体素,可以对3D空间进行网格划分,并赋予每个网格特征。体素不一定得是方块,还可以是存储采样数据的体积点(volumetric points),存储包括材质、颜色、密度等。前文提到,当把体素缩小,也可以获得高级别的真实感,如游戏《Dreams》(可以参考他们的技术分享还有视频)。除了Dream,还有一些游戏展现了当把体素实现的物理和模拟加入游戏中带来的可能性,如《TearDown》.
几何实例化
在一些不需要精确表示的场景中常采用几何实例化来高效地表示许多相似的细节,例如,一个森林中可以用少量的不同树的模型和大量树的位置,参考坐标系来建模。森林中每一颗树之需要存储一个指向树模型的指针和一个坐标系而无需存储树的完整几何信息。这个在需要游戏引擎中均有应用比如Laya中的GPU Instance。
由较大尺度体素构成的场景可以利用类似的方案来呈现比体素分辨率更精细的细节,而不需要为每个体素显示地构建精细的几何。
光线追踪
在体素网格中进行光线追踪也是高效的,这是因为光线和网格表面的求交十分简单,而且在存储系统中网格结构具有很好的空间局部性。树形数据结构可对大片空区域实施高效编码。即使近距离观察,体素也不会呈现为块状。
三、粒子系统
液态或气态物体,如烟、云、火和水。常被建模为粒子系统。每个粒子都可以高效的表示为一个具有质量的点。粒子系统可能包含大量粒子,例如数千或数百万,他们扮演的角色类似于气体或液体中单个分子。不过仿真中所包含的粒子数远小于真实场景所包含的分子数(小多个数量级)。绘制时通常将每个粒子绘制成一个小的贴图板,以弥补粒子数目不足的问题。
贴图板交于场景中其他几何体时,就会露出贴图板的平面特性。软粒子是一种解决方案。软粒子在靠近场景中的几何体回变得更加透明。接近程度根据绘制时深度缓冲区保存的值决定。对于高密度且无明显可见结构的贴图板。如烟雾效果更佳。
四、雾
粒子和体素是无确定形状物体的离散表示形式。均质和半透明的物体可以采用连续的解析表示。一个典型的应用是大气透视效果的模拟,由于光穿越大气时存在小尺度的散射,使远处景物的色饱和度下降。一个更极端的例子是浓雾,他可能均匀分布于整个空间或者随高度不同在密度上有所变换。
真实的大气透视必然涉及以光的传输距离为参数的指数吸收过程,但是从画面效果考虑,常对吸收速率进行调控。一个例子是基于距离d,原始颜色c,雾的颜色f和密度参数k,计算最终颜色c'如下
同样的方法可以用于光在水下的散射和衰减。
局部雾气遵循与全局雾气相同的光衰减规律,但是其距离参数应取光线(沿视线方向)所穿过雾的长度,而不是从观察者到被观察景物的距离。这个距离可由光线和雾气的包围体求交获得。