首页 > 解决方案 > OpenGL非常大的网格裁剪

问题描述

对于我的工作,我最近不得不进入 OpenGL 3d 渲染,我承认我对这个话题很陌生。

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

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

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

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

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

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

标签: javaopengl-eslwjglmeshclipping

解决方案


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


推荐阅读