C++ OpenGL:渲染大量立方体

C++ OpenGL:渲染大量立方体,c++,opengl,3d,rendering,voxel,C++,Opengl,3d,Rendering,Voxel,我正在尝试创建一个600x600x600网格,其中包含单位立方体(或球体)。只有一些立方体存在。所以,基本上我试着让下面的东西由小立方体或球体组成 问题1:呈现这样的结构代价高昂。它需要3个嵌套循环(每600次迭代)。有什么办法解决这个问题吗 我的想法是将附近的立方体组合成一个立方体(oct树),因为在我的例子中不会有太多的间隙。但我想要一个通用的解决方案。您认为渲染上面的场景(看起来像是250x250x250的场景)需要多长时间 问题2:实例呈现是否与我的问题相关 注意:这里我将体素表示为一

我正在尝试创建一个600x600x600网格,其中包含单位立方体(或球体)。只有一些立方体存在。所以,基本上我试着让下面的东西由小立方体或球体组成

问题1:呈现这样的结构代价高昂。它需要3个嵌套循环(每600次迭代)。有什么办法解决这个问题吗

我的想法是将附近的立方体组合成一个立方体(oct树),因为在我的例子中不会有太多的间隙。但我想要一个通用的解决方案。您认为渲染上面的场景(看起来像是250x250x250的场景)需要多长时间

问题2:实例呈现是否与我的问题相关


注意:这里我将体素表示为一个立方体,而立方体又需要6个四边形。

事实上,问题1可以通过将各种立方体组合成一个大立方体来解决。体素引擎通常将多个单独的框组合成块。这也许是最好的办法。 其次,可以对每个体素以及包含这些体素的块使用布尔变量,并将其设置为1以进行渲染,否则设置为0。
您需要一个体素类、块类和一些其他抽象,具体取决于您的需求。

可能需要创建一个几何体着色器,为网格中的每个点复制一个长方体。对着色器进行智能编程,使其不会输出远离视图的边,也不会输出相邻“活动”框的边


问题是为几何体着色器提供600*600*600大小的布尔值。如果复合“对象”有点坚固,也许您只需要提供立方体每行/每列的起始和结束位置,因此:1,4,90345表示用立方体填充1到4和90到345的位置。

问题1:

我不知道你是怎么想到渲染3个嵌套循环的。我看到一个有600^3个体素的巨大循环。您最不希望做的事情是逐个渲染每个体素,因为您的GPU是一个流式多核处理器,您的数据实际上是相同的,除了在空间中进行转换。公平地说,这个数字一开始可能有点太高了。目前,以11毫秒的速度渲染大约需要64.000个立方体,但如果使用静态场景设置,渲染速度可能会更快。见:

您可以做的另一件事是LOD场景,即仅渲染真正需要的内容。你真的对遥远的体素感兴趣吗?如果它们是亚像素大小的,您也可以渲染一个四视点替用特效

问题2:

实例渲染肯定是解决方案的一部分,就像VBO和VAO一样,但还有其他方法,如仅发送坐标并在几何体着色器中生成实际几何体。另见


如果你有一个静态场景,你可以有另一个几乎5倍的性能提升。

我以前做过体素渲染引擎。下面是一些我可以建议的快速优化,它们将给您带来良好的速度提升:

  • 使用几何剔除算法剔除未渲染的位。我使用oct树,因为它们与体素配合得很好
  • 将可见节点前后排序,并使用某种算法确定哪些节点根本不可见。此外,还要充分利用遮挡剔除
  • 像其他人建议的那样使用几何体着色器
  • 制定LOD计划。简单地说,如果两个立方体可以合并成一个立方体,并且结果对用户来说是不可察觉的,那么就这样做。好的LOD方案可以大大减少渲染的数据量
  • 请记住,最好的多边形是根本没有绘制的多边形:)

  • 正确地完成这三件事会给你带来你所期待的巨大提升。在这之后,它将根据您的需要和要求进行微调。

    我已经了解了所有的类结构。主要问题是迭代。当您具有棋盘格结构时(当没有多维数据集与任何其他多维数据集相邻时),组合多维数据集将不起作用。你有什么普遍的解决办法吗?着色器有什么变化吗?此外,存储600x600x600布尔变量是否可行。检查板结构使事情变得相当复杂。我还没有想出一个合理的答案。尽管你可以尝试一些参考资料。