OpenGL非常大的网格裁剪

Posted

技术标签:

【中文标题】OpenGL非常大的网格裁剪【英文标题】:OpenGL very large mesh clipping 【发布时间】:2020-01-14 23:23:54 【问题描述】:

由于我的工作,我最近不得不涉足 OpenGL 3d 渲染,我承认我对这个主题很陌生。

没有过多的细节,我必须处理一个巨大的数据数组(顶点),我需要从中绘制一个形状。基本上,在 3d 空间中想象一个形状非常奇怪的平面。此形状正在动态添加。想象一辆在飞机上行驶的汽车并在其后面绘制轨迹 - 但不仅仅是一条简单的轨迹,而是带有孔洞、废弃部分等。它每秒会生成一个新的部分,持续数小时。

所以,很明显,你最终得到的是很多顶点,它们确实得到了一些优化,但还不够。数以百万计。 显然我不能将它作为顶点 VBO 提供给嵌入式系统的 GPU。 所以我一直在阅读关于剔除和裁剪的内容,据我所知,我只需要显示这个数组的可见三角形,而不是渲染其他所有内容。

现在,我该如何正确地做到这一点?

最简单的蛮力解决方案是遍历所有三角形,如果它们位于截锥体之外 - 不要绘制它们。生成我绘制的缓冲区并将其传递给 GPU

我的一个想法是将世界空间划分为正方形,一种块,基本上将它们之间的“轨迹”网格分开。所以每个方块都将保存数据,因为它是轨迹的一部分,然后我可以使用平截头体剔除来决定渲染哪些方块以及跳过哪些方块。 但我不相信这是一个很好的解决方案。我还读到你应该尽可能减少 GL 函数调用的数量,并且调用它数百个正方形似乎并不好。

所以我决定向比我更了解这个主题的人寻求建议。可悲的是,我没有太多的学习时间——我需要深入研究它。 如果有人能给我一些指导性的提示,将不胜感激。

【问题讨论】:

我的另一个想法是可能忘记绘制实际的三角形,而是使用投射到“地板”平面上的纹理。随着对象的移动,纹理得到更新。然后我可以有几个这样的纹理来保持它们的大小可控,并在需要时动态加载它们(在任何给定时间保持不超过 9 个这样的“图块”加载,以填充对象周围的空间。我不确定是否这会比绘制网格更快或更慢。分辨率也是一个问题 - 如果相机离纹理太近,我预计它会产生像素化。 【参考方案1】:

您最好使用某种形式的空间分区树(例如 OctTree、QuadTree 等)。这与您的第二个建议类似,但是因为它是分层的,所以搜索树是 O(logN) 与 O(n)。

【讨论】:

是的,这是优化我的想法的好建议。如果我这样走,我肯定会用那种东西!

以上是关于OpenGL非常大的网格裁剪的主要内容,如果未能解决你的问题,请参考以下文章

opengl算法学习--- 直线裁剪算法

OpenGL 裁剪

在 OpenGL 中渲染网格多边形 - 非常慢

OpenGL里的坐标系统以及其变换

使用 lwjgl/opengl 进行简单裁剪

OpenGL 4.4管道 - 裁剪前的透视分割?