繁体   English   中英

OpenGL:渲染很多多维数据集

[英]OpenGL: Rendering lots of cubes

我正在尝试创建一个包含单元立方体(或球体)的600x600x600网格。 仅存在一些多维数据集。 因此,基本上,我正在尝试使类似以下内容的小立方体或小球组成。

3D阴影船体

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

我的想法是将附近的多维数据集合并为一个(八叉树),因为在我的案例中不会有太多的空白。 但是我想要一个通用的解决方案。 您认为将这样的场景渲染到上方会花费多长时间(好像是​​250x250x250的场景)?

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

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

我过去曾经做过体素渲染引擎。 以下是一些我建议的快速优化方法,它们可以为您带来良好的速度提升:

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

正确完成这三件事,将为您带来很大的提升。 之后,可以根据您的需求和要求进行微调。

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

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

问题是为几何着色器提供600 * 600 * 600大小的布尔值。 如果复合“对象”有些坚固,则可能只需要在多维数据集的每一行/列上提供开始和结束位置,因此:1,4,90,345表示使用多维数据集从1填充到4,从90填充到345。

问题1:

我不知道您如何提出3个嵌套循环。 我看到一个600 ^ 3体素的巨大循环。 您要做的最后一件事是逐个渲染每个体素,因为您的GPU是流式多核处理器,并且您的数据几乎相同,除了空间转换。 公平地说,这个数字可能有点太高了。 目前,在11ms的渲染时间大约需要64.000个多维数据集,但是如果您具有静态场景设置,则可能会更快地获得它。 请参阅: SVO渲染:OpenGL还是自定义渲染器?

您可以做的另一件事是将场景LOD,即仅渲染真正必要的场景。 您是否对远处的体素感兴趣? 如果它们具有亚像素大小,则可以代替渲染四元冒号。

问题2:

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

如果您有静态场景,则性能可以再提高近5倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM