OpenGL:渲染大量的立方体

时间:2014-04-08 21:00:20

标签: c++ opengl 3d rendering voxel

我正在尝试创建一个包含单位立方体(或球体)的600x600x600网格。只有一些立方体存在。所以,基本上我正在尝试使用由小立方体或球体组成的类似物。

A 3D Shadow Hull

问题1 :渲染这样的结构成本很高。它需要3个嵌套循环(每次600次迭代)。有没有办法解决这个问题?

我认为将附近的立方体组合成一个(oct-trees),因为在我的情况下不会有太多的间隙。但我想要一个通用的解决方案。您认为上面渲染这样一个场景需要多长时间(看起来像250x250x250的场景)?

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

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

4 个答案:

答案 0 :(得分:1)

我过去做过体素渲染引擎。以下是一些我可以建议的快速优化,可以为您提供良好的速度提升:

  1. 使用几何剔除算法来剔除未呈现的位。我使用oct-trees因为它们很好地与体素一起使用。
  2. 从前到后对可见节点进行排序,并使用一些算法来确定哪些节点根本不可见。此外,充分利用遮挡剔除。
  3. 像其他人建议的那样使用几何着色器。
  4. 制定LOD计划。简单来说,如果两个立方体可以连接成一个,结果将是用户察觉不到的,那么就这样做。良好的LOD方案可以大大减少您重新设置的数据量。
  5. 请记住,最好的多边形是根本没有绘制的多边形:)。
  6. 如果做得恰当,这三件事将会给你一大部分你正在寻找的提升。之后,它会根据您的需求和要求进行微调。

答案 1 :(得分:0)

确实可以通过将各种立方体组合成一个大立方体来处理问题1。体素引擎通常将多个单独的盒子组合在一起。这可能是最好的方式。 其次,您可以为每个体素使用布尔变量,也可以为包含这些体素的块使用布尔变量,并将其设置为1以进行渲染,否则设置为0。 根据您的要求,您将需要一个体素类,一个块类和一些其他抽象。

答案 2 :(得分:0)

也许创建一个几何着色器,为网格中的每个点复制一个框。对着色器进行智能编程,使其不会输出偏离View的侧面,也不会出现有" active"相邻的盒子。

问题是为几何着色器提供600 * 600 * 600大小的布尔值。如果复合"对象"可能你需要在立方体的每一行/每列上提供起始位置和结束位置,因此:1,4,90,345表示填充位置从1到4,从90到345表示立方体。

答案 3 :(得分:0)

问题1:

我不会'知道如何渲染3个嵌套循环。我看到一个600 ^ 3体素的巨大循环。您要做的最后一件事就是逐个渲染每个体素,因为您的GPU是流式多核处理器,除了空间翻译外,您的数据几乎相同。公平地说,这个数字可能有点太高了。目前,在11ms渲染时需要大约64,000个立方体,但如果你有静态场景设置,你可能会更快地得到它。请参阅:SVO Rendering: OpenGL or Custom renderer?

你可以做的另一件事是LOD场景,即只渲染真正需要的东西。你真的对远处的体素感兴趣吗?如果它们具有子像素大小,您也可以改为渲染四元素冒号。

问题2:

实例渲染绝对是解决方案的一部分,VBO和VAO也是如此,但还有其他方法,例如只发送坐标并在几何着色器中生成实际几何体。另请参阅http://sol.gfxile.net/instancing.html

如果你有一个静态场景,你可以再提高5倍的性能。