Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 关于八叉树及其如何在体素世界中工作的说明_Opengl_Lwjgl_Voxel_Octree_Multidimensional Array - Fatal编程技术网

Opengl 关于八叉树及其如何在体素世界中工作的说明

Opengl 关于八叉树及其如何在体素世界中工作的说明,opengl,lwjgl,voxel,octree,multidimensional-array,Opengl,Lwjgl,Voxel,Octree,Multidimensional Array,我读过关于八叉树的书,但我并不完全理解它们是如何在体素世界中工作/实现的,在体素世界中,八叉树的目的是通过将重复体素连接到一个大的“体素”来降低体素的渲染量 以下是我想澄清的问题: 您将使用什么类型的数据结构?如何将三维体素阵列转换为具有不同大小的体素并在阵列中占据多个位置的阵列 节点是什么,它们的用途是什么 八叉树是连接体素的,所以只有正方形,还是可能是矩形、L形或整个Y列的体素 八叉树真的提高了体素游戏的性能吗?如果是的话,通常是多少 快速回答: 树:每个节点都有8个子节点,左上角、右上

我读过关于八叉树的书,但我并不完全理解它们是如何在体素世界中工作/实现的,在体素世界中,八叉树的目的是通过将重复体素连接到一个大的“体素”来降低体素的渲染量

以下是我想澄清的问题:

  • 您将使用什么类型的数据结构?如何将三维体素阵列转换为具有不同大小的体素并在阵列中占据多个位置的阵列
  • 节点是什么,它们的用途是什么
  • 八叉树是连接体素的,所以只有正方形,还是可能是矩形、L形或整个Y列的体素
  • 八叉树真的提高了体素游戏的性能吗?如果是的话,通常是多少
快速回答:

  • 树:
    每个节点都有8个子节点,左上角、右上角等等。从某种程度上讲,
    这方面的代码可能会变得相当复杂,尤其是当体素在运行时发生变化时
  • 体素的类型(颜色、材质、项目列表)
  • 是的。仅多维数据集
    更具体地说,是1x1、2x2、4x4、8x8等。它必须是一个完整的节点。
    如果您真的想要,您可以定义某种模式,但它不再是八叉树
  • 是的,但这取决于你的数据。想象一下,分别描述256个相同的区块,或者只描述一次(就像地雷船中的空气)
我首先要试着理解四叉树。你可以在纸上做,也可以用它做一个测试程序。如果您进行实验,您将自己回答这些问题

快速回答:

  • 树:
    每个节点都有8个子节点,左上角、右上角等等。从某种程度上讲,
    这方面的代码可能会变得相当复杂,尤其是当体素在运行时发生变化时
  • 体素的类型(颜色、材质、项目列表)
  • 是的。仅多维数据集
    更具体地说,是1x1、2x2、4x4、8x8等。它必须是一个完整的节点。
    如果您真的想要,您可以定义某种模式,但它不再是八叉树
  • 是的,但这取决于你的数据。想象一下,分别描述256个相同的区块,或者只描述一次(就像地雷船中的空气)

我首先要试着理解四叉树。你可以在纸上做,也可以用它做一个测试程序。如果你进行实验,你会自己回答这些问题。正确的八叉树也可以帮助你进行邻居搜索,从而确定一张脸是否被认为是“可见的”(也就是说,你最终会看到一堆体素)。一旦建立了八叉树,就可以使用它来存储XYZ坐标,然后将其提取到单个数组中。然后将该数组馈送到顶点缓冲区(GL解决方案需要该缓冲区),然后可以根据需要(随着相机向前移动等)以块形式进行渲染

八叉树也很自然地把立方体折叠成更大的立方体,如果有相同类型的立方体。。。就像俄罗斯方块一样,当你的颜色/形状彼此“匹配”时。。这反过来可以减少顶点数,在渲染时,您实际上是在绘制正方形和矩形的组合

如果操作正确,您将得到大量块,这些块在顶点缓冲区中只有向外的“面”可见。现在,您还必须构建自己的遮挡剔除算法,该算法会降低该遮挡的可见性,从而减少所需的渲染

我在这里举了一个例子:


请注意,外部仅被渲染,而块本身一直向下到底部,即使块深度面应该相互抵消?(需要更多的优化)。还要注意相机如何旋转以及如何将面从渲染缓冲区中移除?

正确完成八叉树也可以帮助您进行邻居搜索,从而确定面是否被视为“可见”(即最终使体素外壳可见)。一旦建立了八叉树,就可以使用它来存储XYZ坐标,然后将其提取到单个数组中。然后将该数组馈送到顶点缓冲区(GL解决方案需要该缓冲区),然后可以根据需要(随着相机向前移动等)以块形式进行渲染

八叉树也很自然地把立方体折叠成更大的立方体,如果有相同类型的立方体。。。就像俄罗斯方块一样,当你的颜色/形状彼此“匹配”时。。这反过来可以减少顶点数,在渲染时,您实际上是在绘制正方形和矩形的组合

如果操作正确,您将得到大量块,这些块在顶点缓冲区中只有向外的“面”可见。现在,您还必须构建自己的遮挡剔除算法,该算法会降低该遮挡的可见性,从而减少所需的渲染

我在这里举了一个例子:

请注意,外部仅被渲染,而块本身一直向下到底部,即使块深度面应该相互抵消?(需要更多的优化)。还要注意摄影机是如何旋转的,以及面是如何从渲染缓冲区中移除的