这个例子如何使用“块”使efficeint体素引擎?

我目前正在寻找如何体素引擎的作品,以期可能使一个,我自己。 我看到很多素材,比如“让我们制作一个体素引擎” ,这个素材讲述了如何减less绘制调用。 我似乎无法理解的是,它是如何实际节省绘制调用计数的,基于如下的逻辑:

// Without chunks: foreach voxel in myvoxels DrawIfVisible() // With chunks: foreach chunk in mychunks DrawIfVisible() // which then does ... foreach voxel in myvoxels DrawIfVisible() 

当然,你这样做不会节省任何东西; 你仍然对每个可见的体素进行绘制调用,并且在任一场景中可见的体素都需要绘制调用。 我能看到的唯一真正的节约是评估一个块的逻辑将能够确定是否有大量的体素是可见的,有效地,节省了一点“是这个块可见”的CPU时间。 这是对我的兴趣, 越less,应用程序越快。

如果它有什么区别,我可能会使用XNA和DirectX作为我的引擎,所以不要把我在上面的链接中select的例子当作我的技术select。 然而,这个问题是这样的,我怀疑这是重要的。

如果你每次testing每个体素的能见度,我想你不会节省很多。 但是,通常情况下,您希望构建一个表示体素世界表面的缓冲区。

你不只是“画”体素,你需要建立一个代表体素的网格。 建立网格是昂贵的,所以你想减less你需要这样做的次数。 第一种方法是只在体素变化时重建网格。 所以你建立一个包含表示你体素的顶点的缓冲区。 然后你每帧画出这个缓冲区。

现在你已经有了一个缓冲区,每次改变的时候都需要重建它。 这意味着把所有的东西扔掉,重建所有的东西。 但是建设是昂贵的,所以也许有一种方法可以减less浪费时间的变化? 是的,我们可以在改变的体素周围重建世界。 如果我们只需要更新变化体素周围的 ,我们就可以节省很多时间来重建已有的东西。

现在地形被分成较小的部分,我们可以画出我们可见的块,我们可以重建其中有体素变化的块。 现在我们可以做更多,我们有块。 例如,对于远处的块,我们可以为那些减less了多边形数的构建缓冲区,所以它们的绘制并不昂贵。

总而言之,大块让我们能够更好地控制我们所画的东西和什么时候。 它使我们能够实现我们无法做到的性能特征。