“我认为,在经典意义上的光线跟踪,具有常规定义的几何的分析相交的光线,无论是三角形网格还是高阶原始图像,我并不十分看好接管主渲染任务,这本质上是英特尔正在推动 从性能的角度来看,光栅化有很大的优势,他们争论的许多事情就是使用有效的剔除技术来避免引用很多几何,这些真正是虚伪的论据,因为你可以用遮挡查询来做类似的事情并使用光栅化条件渲染。头对头光栅化只是您可以使用任何晶体管的更有效的使用方式。“
如果约翰·卡马克似乎对射线追踪似乎并不感兴趣,那并不是因为他非常保守,而且希望看到三角形光栅化仍然是无可挑剔的渲染技术。据一年前的报道,约翰·卡马克(John Carmack)有自己的实时渲染未来的想法,它涉及体素射线投射。从那时起,我们已经看到Jon Olick在SIGGRAPH上的演讲,许多细节已经泄漏。所以现在是仔细看看软件在我们的存储中的时候了。
一点点的历史
Carmack的体素实验比去年更进一步。事实上,他的兴趣可以追溯到10年左右。在Quake / Quake II引擎和Quake III之间,Carmack用新的渲染技术进行了几次实验。他将所有这些研究的代码名称称为Trinity,许多游戏玩家被认为是未来的产品,也是来自id Software的新一代3D引擎。但事实上,Quake III引擎依然是传统的,因为Carmack自己在1998年的.plan文件中透露:
“这里有一些关于我为Quake3 / Trinity引擎做准备的技术的笔记。一开始我得到了几个月的大量开放研究,但事实证明,早期的研究并没有对我终于决定的方向产生任何影响。嗯,我学到了很多东西,可能会在稍后的时候回报。
这个说法来自于近10年前从2000年初的FiringSquad采访。所以,很明显,这个想法已经在约翰·卡马克(John Carmack)的头上转了一段时间。
你不能在没有提到Outcast的情况下谈论体素。该游戏在1999年7月首次出现在十年前,由于其众多品质,也受到了一代游戏玩家的青睐,同时也因为3D显卡已经开始成为游戏玩家的规则电脑
Outcast是基于一个全软件渲染引擎,这使得它尤其是电源饥饿。要以最高分辨率(令人印象深刻的512x384)播放游戏,您需要一个领先的处理器,但不需要3D显卡。它的资源密集度并不是这个发动机成为唯一的原因。它使用体素也使游戏的渲染真正独一无二。
但是你必须把它放在角度 - 即使标题依然存在(与Novalogic的游戏一起)是基于体素渲染的标准载体,它实际上只使用了一种相当简化的形式,也被保留给了这个风景。所有的对象和角色都是非常标准的多边形模型。景观基于高度图,这意味着环境中每个点只有一个可能的高度,排除了像拱门这样的复杂结构。
这种限制并不是一个破坏者,因为由于物理学的限制,这种结构在本质上是相当罕见的。然而,景观的展示相当简单,逐列实现。对于每列,存储最大Y值(在Y缓冲区中)。只有当Y值大于Y缓冲区中存储的值时,才会在屏幕底部开始填充所列列的像素。这种渲染方法使得去除场景中非可见部分的过程非常有效,非常容易。
在过去的那段小旅程之后,现在是时候来看看今后体素对我们来说意味着什么。
3 技术
在详细讨论正在讨论的算法之前,我们需要定义一些术语,如体素,八叉树和射线投射。不是每个人都有一个Carmack到英文字典方便。
正如“像素”是术语“图像”和“元素”的融合一样,体素是“体积”和“像素”的融合。因此,体素是基本体积元素。为了容易地想象出来,想想你和孩子一起玩乐高乐队(或者今天还有,如果你有孩子)。您可以使用几个基本块构建任何东西。体素以相同的原则开始:体积由立方体组合组成。这意味着我们有一个体积的表示,而三角形网格只表示一个空的shell或卷周围的皮肤。
Voxel已经在视频游戏中被多次使用,但是它们的传统用途主要在医疗领域。原始图像特别适用于从横向图像连续重建体积,如MRI扫描仪所推出的图像。
然而,使用体素代表体积不是一个完美的方法。现实世界不是由小立方体的组合组成的,所以不可能使用体素来得到大多数体积的精确表示。在下一个图像中,您可以看到一个特别不利的情况,用一个非常粗略的近似圆环(你可以称之为甜甜圈,如果你愿意)使用体素。
但是,谈论视频游戏时,必须把握这个缺点。毕竟,大多数游戏中使用的三角形网格也只是体积的近似值,就像您可以通过使用更多的三角形来细化表示一样,可以使用更精细的体素网格来限制效果。但是这里是内存消耗的起始位置,这代表了使用体素的主要缺点。
我们来做数学:每个维度上的1,024个体素的简单网格在红色,绿色,蓝色和alpha(RGBA)值中占据1,024 x 1,024 x 1,024 * 4,这相当于高达4GB的内存。这并不是一个夸张的决议。因此,以这种方式使用体素是不成问题的。幸运的是,有一个解决方案来限制缺点:八叉树或八进制树。
八叉树和光线投射
该树是计算机科学中经常使用的数据结构,因为它可以分层次地排列数据。每个人每天都使用树结构,甚至没有意识到它,例如当您使用计算机上的文件时。
使用文件系统树结构,硬盘的根目录包含几个“子”(文件夹),它们又包含自己的子文件夹(子文件夹)等等,直到到达“叶”(文件本身)。这个例子应该给你一个直观的想法,使用树的优点之一:访问平衡树的部分比所有的零件分散在更快。
但树木结构在哪里发挥作用?那么到目前为止,我们已经使用体素将它们放在一个规则的网格上,实际上通过编码空白空间浪费了大量的数据。通过使用最细粒度的分辨率,只有在必要的地方,Octrees才能更有效地使用内存空间。在三维方面思考并不是世界上最简单的事情,在文章中不容易表达,所以我们首先从二维方面介绍这个想法。
这是一个圆形的近似值,在分辨率为12 x 12的网格上。由于分辨率太低,近似值非常粗糙,但是您可以看到,大量的单元格是空白的,因此无用。如果我们使用四叉树,这是我们得到的:
建立四叉树很简单。您从初始图像开始,并将其细分为两个方向,产生四个象限。当象限为空或完全填满时,算法就停在那里。如果象限只有部分填充,那么象限再分为两个,依此类推。当所有象限均匀(即,均匀为空或填充)或者当达到给定深度时更为传统的象限(在上面的例子中,我们在四分之一的树深度处停止,这是在每个区间中除以16)尺寸)。正如你所看到的,即使我们的基本例子,最终的结果是更加忠实于初始圈,但是我们使用较少的数据(97个节点或“单元格”,如果你愿意,在这种情况下,而不是122与正规网格)。
在实践中,给定定义的内存空间的增益比起您可能想象的要少一些。这是因为在普通网格的情况下,体素的位置是隐含的。相反,在八叉树的情况下,每个节点必须保持与其每个子节点的“链接”。实际上,除了体素的颜色和法线之外,每个节点还必须有八个指针。
但是与八叉树的许多其他优点相比,这只是一个微小的缺点。要了解八叉树更重要的贡献,我们首先要描述数据结构的显示方式。有几种显示体素的方法,但是由ID Software选择的技术是(lighting casting)光线投射。这里有一个描述。
光线投射
像射线跟踪一样,光线投射是基于对图像的每个像素发射或“投射”射线。但是不同之处在于,一旦发现交叉路口,算法就停在那里,不会产生二次射线。
因此,光线投射比光线跟踪更快,因为正如我们前面的文章所示,这些二次射线是引入与其存储器访问相关的问题。另外一个优点是计算射线与体素的交点比三角形快得多。而且更重要的是,没有必要建立一个额外的数据结构来加速这些交点计算。八叉树是数据(几何和纹理)和加速度结构。
稀疏体素八叉树的优点
现在我们来看看我们的体素八叉树在渲染方面的优势。这种数据结构的主要优点是它提供了一种优雅的方式来解决纹理中的细节水平(LoD)问题,而且还可以使用单个算法来解决几何体的问题。这是因为,正如我们在前一段所暗示的那样,八叉树的每个节点都包含颜色信息,所以我们知道它们可以消除2D纹理。或者,要更准确地说,八边形既是纹理又是几何形状。
因此,必须以完全独立的方式对几何和纹理进行管理的细节问题级别现在相当于一个单一的系统:管理八叉树的细节级别。事实证明,这可以非常简单地完成。在某种程度上,原理是用于纹理的mipmap的扩展。mipmap的目的是尝试保存最接近可能的像素像素的纹素(纹理元素)。为了做到这一点,预先计算和存储纹理的几个分辨率,并且硬件将mipmap级别的选择与屏幕上的纹理的大小相匹配。
这样的事情也可以通过体素八度来实现,动态地选择细节级别。一旦体素的尺寸小于像素的大小,则该线程的八叉树遍历将停止在该级别。所有需要的是将每个节点中包含在其孩子中的信息的平均值存储起来,并且您有一种非常简单的管理LoD的方法。这个机制非常适合于一个流媒体系统,这是一个像MegaTextures一样的软件。只有所需的八叉树的那些部分被存储在视频存储器中,而另一部分存储在主存储器中以加速后续访问。但是,大部分八叉树只是保留在存储介质上。
结果是我们有几乎无限数量的几何(和纹理,我们注意到)。八叉树可以像我们想要的那样详细,并且在运行时,存储器的数量和显示时间保持(相对)恒定。唯一的限制是艺术家可以投入创建八叉树的时间和下一代计算机中存储媒体的物理限制。
我们应该说,还有其他可能的方法来解决这些问题,例如使用虚拟纹理系统,如MegaTextures或稀疏的虚拟纹理,将被内置到主要的3D引擎(CryEngine 3,idTech 5等)明年。几何是一个更复杂的问题要解决,但几个可能的解决方案正在进行中。其中最简单的包括以不同的分辨率预先计算网格的几个版本,并选择最适合从网格到相机的距离的网格。这个基本的解决方案很容易实现,但是当从一个细节层级移动到另一层时,会产生大量的视觉工件。
稀疏体素的优点(续)
一些研究人员已经在使用所谓的渐进网格的方法,从一个细节层次到另一个更平滑的方式。这个想法是,对于每个细节级别,将顶点分为两组:父顶点和子顶点。当细节水平降低时,子节点顶点逐渐变得更接近父节点。当细节级别达到一个新的整数值时,子顶点将被删除,以及连接到父节点的所有边。
这种技术有效,但并不完全自动。它需要来自艺术家的额外投入来指明哪些边缘是最重要的。这种额外的工作意味着更少的时间可用于精炼模型。
解决问题的另一种方法(我们听到DirectX 11卡的到来听到很多)是高阶原语(补丁)的细分,可能与位移映射相结合。这种技术的到来在纸上已经有好几年了(啊,Parhelia ...)没有任何实质的具体结果。但也许这一次是真实的。
再次,鉴于微软和AMD为推动开发者的努力,该技术是有效的,可以很好地达到一定的成功水平。但体素八度仍然是一个诱人的选择。如上所述,他们可以用单一的算法解决几何和纹理的问题,另外,细节层次的选择非常简单。毕竟,在屏幕上评估体素的大小很简单,但是对于三角形来说更为复杂。
体素渲染的潜在限制
但是,虽然技术是有吸引力的,但并不是没有缺点。主要问题源自于八叉树的计算量昂贵,这意味着在运行时修改数据结构是不现实的。这个缺点使得使用体素八叉树来使动态几何特别复杂。Id软件围绕这一路障的建议包括仅使用八叉树作为静态几何,而场景的所有动态元素将使用良好的三角形光栅化来显示。
令人遗憾的是,在视觉上这样一个新的一步必须伴随着这样的限制。随着技术的代际变化,玩家们也期待着与景观相互融合的新水平。当你提到体素时,玩家心目中的事情就是世界最终将是破坏性的,在那里你可以吹墙,看几何变化,揭示不同层次的材料。但是,至少现在看来,这不是最近的未来。我们可能会保持我们坚不可摧的墙壁几年。
这个问题并不是体素八度所独有的,因为所有的流媒体系统都是基于相对连续变化的细节水平的假设,并且不能跟上突然的变化。但是目前来说,这只是纹理的问题。而在一秒钟或两秒内看到低分辨率的纹理是丑陋的,看到一个低分辨率八叉树很有可能是令人恐惧的。
与体素有关的另一个缺点与像素化有关。如果我们仅显示与射线相交的体素的颜色,则立方体的边缘是可辨别的,这导致了一种老式的效果,这种效果与应用于渲染技术的未来的技术不合适。幸运的是,这个问题可以通过使用三线性滤波来解决:与二维相比,二维过滤也不同于纹理,过滤是三维的。
最后的挑战是,尽管八叉树数据结构的优势,以体素形式存储整个世界所需的存储空间是巨大的。正如我们所看到的,这并不会真正影响执行所需的资源。但是,另一方面,为了能够操纵,然后存储,并且最终分发这样的数据结构,id软件将需要对压缩技术做一些认真的工作。Jon Olick对这个话题说了几句话,他对已经实现的压缩率感到高兴。
结论
实时3D渲染是一个特别激动人心的阶段。随着GPU的到来越来越多的可编程,到现在为止,已经出现的许多方法已经不复存在了,因为开发人员试图解决手头的问题。
2009 年Olick的SIG论文中的使用体素渲染的模型
体素八叉射线投射是一种特别有前途的技术,可大大增加未来游戏的几何复杂性。显然,这一切都还在试验阶段,Olick在SIGGRAPH的演示更像是一个可行的示范。很多问题依然没有答案。
其中一个对技术未来具有决定性意义的问题,与图形艺术家必须工作的编辑工具有关。奥利克表示,他期待着目前使用的MegaTextures系统的发展,让艺术家应用缓冲区来向纹理添加细节。这样的系统,而不是修改法线贴图,将直接用这种技术修改几何。但是现在,一切都在概念阶段,而且我们知道,做好演示也不是最难的部分。然后,他们必须变成一个足够稳定和高效的成品。
尽管如此,使用几百万个多边形(在初始模型中为700万,完成了ZBrush),在当代卡上以60帧/秒的速度看动画,这是非常有趣的。这些早期的结果是非常有前途的,当您考虑到实际使用该技术的市场时间游戏将提供的硬件。鉴于现在的游戏开发时间,考虑到软件在明年之前不打算发布Rage,我们可能需要等待三,四年才能在此类型的渲染之间打上零售货架。
更多阅读
Olick SIGGRAPTH 会议上面关于体渲染+光线投射的论文 ,阐述了为什么光线投射和体渲染是下一代渲染技术的趋势。
olick-current-and-next-generation-parallelism-in-games.pdf
下载地址