OpenGL:渲染大量的立方体

3

我正在尝试创建一个包含单位立方体(或球体)的600x600x600网格。只有其中一些立方体是存在的。因此,基本上我想要像下面这样由小立方体或小球组成的东西。

A 3D Shadow Hull

问题一:渲染这样的结构是很昂贵的。它需要3个嵌套循环(每个循环都有600次迭代)。有没有什么方法来解决这个问题?

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

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

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

4个回答

3

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

  1. 使用几何剔除算法来剔除不需要渲染的部分。我使用八叉树,因为它们与体素很好地配合。
  2. 按照前后顺序排序可见节点,并使用某些算法确定哪些节点根本看不见。此外,充分利用遮挡剔除。
  3. 像其他人建议的那样使用几何着色器。
  4. 采用LOD方案。简单来说,如果两个立方体可以组成一个立方体而对用户来说是不可察觉的,则这样做。良好的LOD方案可以大大减少您要渲染的数据量。
  5. 请记住,最好的多边形是根本不绘制 :)。

如果正确执行这三件事,您将获得所需的大部分提升。之后,您需要根据自己的需求进行微调。


0

问题1:

我不知道你是如何想到渲染三个嵌套循环的。我看到一个有600^3个体素的巨大循环。最后你不想逐个渲染每个体素,因为你的GPU是一个流式多核处理器,而你的数据实际上是一样的,除了空间上的平移。公平地说,这个数字可能有点太高了。目前要渲染64000个立方体需要11毫秒,但如果你有一个静态场景设置,你可能可以更快地完成它。请参见:SVO Rendering: OpenGL or Custom renderer?

你还可以做的另一件事是对场景进行LOD处理,即仅渲染真正必要的部分。你真的对遥远的体素感兴趣吗?如果它们的子像素大小,那么您可以渲染一个quad imposter。

问题2:

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

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


0

实际上,问题1可以通过将各种立方体组合成一个大立方体来处理。像素引擎通常将多个单独的盒子分组到块中。这可能是最好的方法。 其次,您可以为每个像素和包含这些像素的块使用布尔变量,并将其设置为1以进行渲染或0以进行其他操作。 您需要一个像素类、一个块类以及一些其他抽象类,具体取决于您的要求。


我已经有了所有的类结构。主要问题是迭代。当你有一个棋盘结构(没有任何立方体相邻)时,组合立方体是行不通的。你有什么通用解决方案吗?是否需要更改着色器等内容? 另外,存储600x600x600个布尔变量可行吗? - Shashwat
棋盘结构使事情变得相当复杂。我还没有想到一个合理的答案。不过你可以尝试访问https://sites.google.com/site/letsmakeavoxelengine/home获取一些参考资料。 - Beowulf

0

也许可以创建一个几何着色器,为网格中的每个点复制一个盒子。智能程序着色器,以便它不输出面朝视图的侧面,并且不存在“活动”框相邻的侧面。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接