代码之家  ›  专栏  ›  技术社区  ›  pdeva

什么是稀疏体素八叉树?

  •  31
  • pdeva  · 技术社区  · 16 年前

    我已经读了很多关于稀疏体素八叉树在未来图形引擎中的潜在使用。

    但我一直找不到他们的技术信息。

    我知道体素是什么,但是我不知道稀疏体素八叉树是什么,或者它们如何比目前使用的多边形技术更有效。

    有人能给我解释一下吗?

    5 回复  |  直到 12 年前
        1
  •  8
  •   XiaJun    12 年前

    Nvidia白皮书非常详细地描述了它~ http://www.nvidia.com/object/nvidia_research_pub_018.html

        2
  •  26
  •   Ólafur Waage    16 年前

    以下是关于 id Software on this subject.

    ID技术6将使用一种更先进的技术,建立在巨纹理理念的基础上,并虚拟化几何体和纹理,以获得与Texel相同的独特几何体:稀疏体素八叉树(SVO)。

    它通过对存储在八叉树中的体素(而不是三角形)表示的几何体进行光线投射来工作。

    其目标是能够将八叉树的一部分流式传输到视频内存中,沿着树进一步向下移动以获取附近对象的更多细节,并为进一步的对象使用更高级别、更大的体素,同时为几何体和纹理提供一个自动的细节级别(LOD)系统。

    阿尔索 here's a paper on this.

    在此中找到更多信息 great blog entry.

    好吧,单体素就没有那么有趣了,因为对于任何合理详细的建模,您需要非常大量的体素(如果使用统一的网格)。

    所以,我们需要一个层次系统,它将我们带到八叉树。八叉树是一种非常简单的空间数据结构,它将每个节点细分为8个同样大的子节点。

    稀疏八叉树是一个八叉树,其中大多数节点是空的,类似于离散微分方程时得到的稀疏矩阵。

        3
  •  17
  •   Jimmy    13 年前

    一个八叉树有8个邻居,因为如果你想象一个正方形,它被切成4等分,就像这样

    ______________
    |     |      |
    |     |      |
    |_____|______|
    |     |      |
    |     |      |
    |_____|______|
    

    然后它将是一个“四”(四)树。

    但是在三维空间中,你有你自己,一个立方体,而不是一个正方形,所以水平,垂直,沿着z轴切割它,你会发现8个块,而不是4个这样的块。

        _____________
       /     /     / |
      /-----/-----/  |
     /_____/_____/ | |
     |     |     | |/|
     |-----|-----|/| |
     |     |     | |/
     |_____|_____|/
    

    希望从那以后……

    SVO的独特之处在于它存储了体素信息,体素信息是空间中的一个点,具有颜色、法线等属性。

    SVO背后的想法是忽略三角形和纹理的需要,将它们放在一个包含体素化三角形外壳(模型)及其表面纹理的单个SVO中,所有这些都在一个对象中。

    这里需要一个八叉树的原因是,否则一个统一的网格结构将需要大量的内存来处理现有的图形卡。

    因此,使用SVO可以获得一种mip映射的3D纹理。

    mipmapping基本上是相同的图像,但在不同的比例下,一个具有更多细节,而最新的具有最少细节(但从远处看相当相似)。

    这样,靠近对象的对象可以以更大的细节从SVO流出来,而更多的对象则以更少的细节流出来。如果你用的是射线投射……离相机的光线越远,我们对超大纹理/SVO的挖掘就越少。

    但是,如果你把盒子外的“欧几里得”想象成它的“无限细节”,你只需要使用截锥切片,平面/AABB交叉点,用我们切片广告牌的投影紫外线在屏幕上找到每一种texel颜色,而不是宽度*高度像素,用Nvidia天真的“光束优化”。

    PS(离题):对于不了解欧几里得原理的人来说,我认为这是最实际的解决方案,我有理由支持它(他们不使用射线投射)。

    他们最大的秘密不是渲染,而是存储数据。RLE根本就不剪……因为一些体积/体素数据可能更随机,并且在RLE是USLESS的情况下“实体”更少,所以对我来说,通常需要至少5个字节的压缩到任何更小的数据中。他们说他们通过压缩输出了大约一半的内容。所以他们用的是2.5字节,和现在的三角形差不多。

        4
  •  3
  •   Martijn Dekker    15 年前

    实际上,1.15位让我怀疑它们只是以某种非常简单的方式按顺序存储东西。也就是说,如果它们只存储体积数据,而不是颜色或纹理数据。

    这样想:1个体素只需要1位:它在那里还是不在那里?(是或不是,换句话说:P)。它所在的八叉树节点由8个体素组成,并且有一点用于存储该对象是否包含任何内容。这是每个体素一个比特加上每8个比特一个。1+1/8=1125。添加另一个包含7个兄弟节点的父节点,得到1+1/8+1/8/8=1140625。可疑地接近他们提到的1.15。虽然我可能还远着呢,但这可能会给一些线索。

        5
  •  1
  •   Magnus Wootton    13 年前

    你甚至可以简单地光栅所有的点,你需要光线跟踪或光线投射这些天,因为视频卡可以投射淫秽的点数量。使用八叉树是因为它是一个立方体形状,不断地分割,形成越来越小的立方体。(体素)我有一个引擎正在使用一个光栅技术,它看起来不错。对于那些说你不能动画体素的人,我认为他们真的没有考虑过这个话题,当然这是可能的。如我所见,使世界非常像“无限的三维涂层”,所以查找三维涂层和水平设计将非常类似于这个程序的工作方式。主要的回调包括流速度不够快,光线跟踪或光栅化不能达到每秒60帧,绘制实际体素对象的计算成本非常高,目前我可以在大约12秒钟内绘制一个1024x1024x1024球体,但所有这些问题都可以补救,这是一个令人兴奋的未来。我目前最大的世界尺寸是一个兆,一个兆,一个兆,但实际上我可能会使它比这个大8倍。当然,另一个实际上相当严重的问题是,即使在压缩之后,存储8192x8192x8192字符也需要大约100兆兆,因此环境将比这还要严重。尽管如此,说你将拥有8192x8192x8192字符与我们今天在游戏中看到的相比是完全荒谬的…整个世界过去是8192x8192x8192:)

    如何做到只存储每个指针的位是指针在运行时在视频内存中构造的…把你的脑子转过去,你就可以有自己的发动机了。:)