如何以有效的方式渲染体素
How to render voxel in an efficient way
现在,我使用 3D 数组来表示不同块中的体素。我想渲染玩家可见的体素,但我这样做的方式完全没有效率:
我遍历整个 10*10*10 块并检查每个体素是否有等于 Air
的邻居。然后我分别渲染每个可见的面孔。所以我主要检查每个体素 6 次。我对所有块都这样做。
是否有更好的方法或算法来减少迭代?
基本不知道用3D Array好还是Octree好...
谢谢。
我最近一直在思考这个问题,既然没有人回答你,我想我会提到一些我遇到的想法。
首先,需要注意的是,您只需要计算一次渲染哪些面,因为只有在您删除或添加体素时才会发生变化,然后您只需要立即重新计算您创建的地方周围的体素改变。只需使用一个标志来标记渲染和缓存,直到发生变化。如果您还没有这样做,这将大大提高计算每一帧的性能。
我还建议研究这种极快的光线投射算法:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.42.3443&rep=rep1&type=pdf
您可以使用它进行快速碰撞测试,也可以用于剔除测试。您可以在网格节点投射以查看面部的任何部分是否可见。
现在,我使用 3D 数组来表示不同块中的体素。我想渲染玩家可见的体素,但我这样做的方式完全没有效率:
我遍历整个 10*10*10 块并检查每个体素是否有等于 Air
的邻居。然后我分别渲染每个可见的面孔。所以我主要检查每个体素 6 次。我对所有块都这样做。
是否有更好的方法或算法来减少迭代?
基本不知道用3D Array好还是Octree好...
谢谢。
我最近一直在思考这个问题,既然没有人回答你,我想我会提到一些我遇到的想法。
首先,需要注意的是,您只需要计算一次渲染哪些面,因为只有在您删除或添加体素时才会发生变化,然后您只需要立即重新计算您创建的地方周围的体素改变。只需使用一个标志来标记渲染和缓存,直到发生变化。如果您还没有这样做,这将大大提高计算每一帧的性能。
我还建议研究这种极快的光线投射算法:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.42.3443&rep=rep1&type=pdf
您可以使用它进行快速碰撞测试,也可以用于剔除测试。您可以在网格节点投射以查看面部的任何部分是否可见。