我已经阅读了很多关于稀疏体素八叉树在未来图形引擎中的潜在用途的文章。
但是,我一直无法找到有关它们的技术信息。
我了解体素是什么,但是我不知道什么是稀疏体素八叉树,也不知道它们如何比现在使用的多边形技术更有效。
有人可以解释或指出我对此的解释吗?
id Tech 6 将使用一种更先进的技术,该技术基于 MegaTexture 理念并虚拟化几何体和纹理以获得独特的几何体,直至相当于纹素:稀疏体素八叉树 (SVO)。
它通过对存储在八叉树中的体素(而不是三角形)表示的几何图形进行射线投射来工作。
目标是能够将八叉树的部分流式传输到视频内存中,沿着树进一步向下查找附近的对象以提供更多细节,并为更多对象使用更高级别、更大的体素,从而提供自动级别的细节(LOD)系统同时用于几何和纹理。
在这个很棒的博客条目中找到了更多信息。
好吧,体素本身并没有那么有趣,因为对于任何合理详细的建模,您都需要非常大量的体素(如果使用统一的网格)。
因此,需要一个分层系统,这将我们带到八叉树。八叉树是一种非常简单的空间数据结构,它将每个节点细分为 8 个同样大的子节点。
稀疏八叉树是大多数节点为空的八叉树,类似于离散微分方程时得到的稀疏矩阵
八叉树有 8 个邻居,因为如果你想象一个正方形,它会像这样被切成 4 个相等的四分之一
______________
| | |
| | |
|_____|______|
| | |
| | |
|_____|______|
那么它将是一个“四”(四)树。
但是在 3 维中,你有自己,一个立方体,而不是一个正方形,所以水平、垂直和沿 Z 轴切割它,你会发现 8 个块而不是 4 个像这样
_____________
/ / / |
/-----/-----/ |
/_____/_____/ | |
| | | |/|
|-----|-----|/| |
| | | |/
|_____|_____|/
希望从那以后..
SVO 的独特之处在于它存储体素信息,这是空间中的一个点,具有颜色、法线等属性。
SVO 背后的想法是忽略三角形和纹理的需要,将它们放在一个包含体素化三角形外壳(模型)的单个 SVO 中,并将其表面纹理全部放在一个对象中。
这里需要八叉树的原因是,否则统一的网格结构将需要大量内存来处理现有显卡。
所以使用 SVO 可以实现一种 Mip-Mapped 3D 纹理。
MipMapping 基本上是相同的图像,但比例不同,一个具有更多细节,而最新的具有最少细节(但从远处看起来非常相似)
这样,近处的物体可以从 SVO 以更详细的方式流式传输,而更远的物体则以更少的细节流式传输。也就是说,如果您使用的是 Ray-Casting.. 光线离相机越远,我们对 Mega 的挖掘就越少-纹理/SVO
但是,如果您跳出框框思考“Euclideon”之类的“无限细节”,您只需使用平截头体切片和平面/aabb 相交,以及我们切片广告牌的投影 UV 来查找屏幕上的每个纹素颜色,反对到 Width*Height 像素,用 nvidia 天真的“光束优化”射出光线。
PS(有点离题):对于不了解欧几里得如何做他们的人的人,我相信这是最实用的解决方案,我有理由支持它(他们不使用射线投射)
他们最大的谜团不是渲染,而是存储他们的数据.. RLE 根本不会削减它.. 因为一些体积/体素数据可能更随机,并且在 RLE 无用的情况下不太“可靠”,还有压缩对我来说,这通常需要至少 5 个字节。他们说他们通过压缩输出大约一半的内容)..所以他们使用 2.5 字节,这与现在的三角形大致相同
名为Efficient Sparse Voxel Octrees – Analysis, Extensions, and Implementation的 NVIDIA 白皮书在此处对其进行 了非常详细的描述
实际上,1.15 位让我怀疑它们只是以某种非常简单的方式顺序存储东西。也就是说,如果他们只存储体积数据而不是颜色或纹理数据等东西。
像这样想:1 个体素只需要 1 位:它存在还是不存在?(是或不是,换句话说:P)。它所在的八叉树节点由 8 个体素和一点点来存储该事物是否包含任何内容。这是每个体素一位加上每 8 位一位。1 + 1/8 = 1,125。添加另一个有 7 个兄弟节点的父节点,你得到 1 + 1/8 + 1/8/8 = 1,140625。可疑地接近他们提到的 1.15。虽然我可能很遥远,但它可能会给某人一些线索。
您甚至可以简单地光栅化所有点,这些天您需要光线跟踪或光线投射,因为视频卡可以投射大量的点。您使用八叉树是因为它是一个立方体形状,不断地分割成越来越小的立方体。(体素)我现在正在使用光栅技术的引擎,它看起来不错。对于那些说你不能为体素设置动画的人,我认为他们真的没有考虑太多这个话题,当然这是可能的。在我看来,创造世界很像“无限的 3d 外套”,所以查看 3d 外套,关卡设计将与该程序的工作方式非常相似。主要缺点包括流传输速度不够快,光线追踪或光栅化不能达到 60 fps,绘制实际体素对象的计算成本非常高,目前我可以在大约 12 秒内绘制一个 1024x1024x1024 的球体,但所有这些问题都可以解决,这是一个令人兴奋的未来。目前我的最大世界大小是一个兆兆级,但实际上我可能会使它比这大 8 倍。当然,另一个实际上相当严重的问题是即使压缩后存储一个 8192x8192x8192 字符也需要大约 100 兆,因此环境会比这更多。尽管如此,与我们今天在游戏中看到的相比,说你将拥有 8192x8192x8192 的角色是完全荒谬的……整个世界曾经是 8192x8192x8192 :) 当然,另一个实际上相当严重的问题是,即使压缩后存储一个 8192x8192x8192 字符也需要大约 100 兆,所以环境会比这更多。尽管如此,与我们今天在游戏中看到的相比,说你将拥有 8192x8192x8192 的角色是完全荒谬的……整个世界曾经是 8192x8192x8192 :) 当然,另一个实际上相当严重的问题是,即使压缩后存储一个 8192x8192x8192 字符也需要大约 100 兆,所以环境会比这更多。尽管如此,与我们今天在游戏中看到的相比,说你将拥有 8192x8192x8192 的角色是完全荒谬的……整个世界曾经是 8192x8192x8192 :)
你如何通过只存储每个指针的位来做到这一点,指针是在运行时在视频内存中构造的......让你思考一下,你可以拥有自己的引擎。:)