【问题标题】:OpenGL: Rendering lots of cubesOpenGL:渲染大量立方体
【发布时间】:2014-05-21 19:12:35
【问题描述】:

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

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

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

问题 2:实例渲染与我的问题有关吗?

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

【问题讨论】:

    标签: c++ opengl 3d rendering voxel


    【解决方案1】:

    问题 1:

    我不知道你是怎么想出渲染 3 个嵌套循环的。我看到一个带有 600^3 体素的巨大循环。您要做的最后一件事是一个一个地渲染每个体素,因为您的 GPU 是一个流式多核处理器,并且您的数据实际上是相同的,除了空间中的平移。公平地说,这个数字可能有点太高了。目前,在 11 毫秒内渲染大约需要 64.000 个立方体,但如果您有静态场景设置,您可能会更快。见:SVO Rendering: OpenGL or Custom renderer?

    您可以做的另一件事是 LOD 场景,即只渲染真正需要的部分。你真的对远处的体素感兴趣吗?如果它们是亚像素大小,您也可以渲染一个四边形冒名顶替者。

    问题 2:

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

    如果您有一个静态场景,您可以再获得近 5 倍的性能提升。

    【讨论】:

      【解决方案2】:

      我过去做过体素渲染引擎。以下是我可以建议的一些快速优化,它们可以大大提高速度:

      1. 使用几何剔除算法剔除未渲染的位。我使用八叉树,因为它们与体素搭配得很好。
      2. 从前到后对可见节点进行排序,并使用某种算法来确定哪些节点根本不可见。此外,充分利用遮挡剔除。
      3. 像其他人建议的那样使用几何着色器。
      4. 制定 LOD 方案。简单来说,如果两个立方体可以合二为一,并且结果对用户来说是察觉不到的,那就去做吧。良好的 LOD 方案可以大大减少您正在渲染的数据量。
      5. 请记住,最好的多边形是完全没有绘制的多边形:)。

      正确完成这三件事将为您提供所需的很大一部分提升。之后,一切都将根据您的需求和要求进行微调。

      【讨论】:

        【解决方案3】:

        也许创建一个几何着色器,为网格中的每个点复制一个盒子。对着色器进行智能编程,使其不输出背离视图的边,也不输出相邻“活动”框的边。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 我有所有的类结构。主要问题是迭代。当您具有棋盘结构时(当没有立方体与任何其他立方体相邻时),组合立方体将不起作用。你有什么通用的解决方案吗?着色器有什么变化吗?另外,存储 600x600x600 布尔变量是否可行。
          • 棋盘结构使事情变得相当复杂。我还没有想到一个合理的答案。虽然您可以尝试sites.google.com/site/letsmakeavoxelengine/home 获取一些参考资料。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-12
          • 1970-01-01
          • 1970-01-01
          • 2018-09-27
          • 1970-01-01
          • 1970-01-01
          • 2020-04-09
          相关资源
          最近更新 更多