[英]OpenGL: Rendering lots of cubes
我正在尝试创建一个包含单元立方体(或球体)的600x600x600网格。 仅存在一些多维数据集。 因此,基本上,我正在尝试使类似以下内容的小立方体或小球组成。
问题1 :渲染这样的结构成本很高。 它需要3个嵌套循环(每个循环600次)。 有什么办法可以解决吗?
我的想法是将附近的多维数据集合并为一个(八叉树),因为在我的案例中不会有太多的空白。 但是我想要一个通用的解决方案。 您认为将这样的场景渲染到上方会花费多长时间(好像是250x250x250的场景)?
问题2 :实例渲染与我的问题有关吗?
注意 :在这里,我将体素表示为一个立方体,而该立方体又需要6个四边形。
我过去曾经做过体素渲染引擎。 以下是一些我建议的快速优化方法,它们可以为您带来良好的速度提升:
正确完成这三件事,将为您带来很大的提升。 之后,可以根据您的需求和要求进行微调。
确实,可以通过将各种多维数据集组合为一个大多维数据集来处理问题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.