我正在尝试,在JOGL中,从大量渲染的四边形中挑选(数千)。有没有人有任何建议?
为了给你提供更多细节,我正在绘制一大堆数据,作为具有程序创建纹理的广告牌。
我看过这篇文章 OpenGL GL_SELECT or manual collision detection?并发现它很有帮助。然而,我的程序可能需要几分钟才能完成全套渲染,因此我不认为绘制2x(用于颜色拾取)是一种选择。
我目前正在调用glBegin / glVertex ... / glEnd。鉴于我已经使用vao和vbo切换到GPU上的批量渲染,你认为我会获得足够大的加速以促进颜色选择吗?
如果没有,假设使用GL_SELECT提出反对的所有建议,您认为值得我使用吗?
我研究了多线程CPU方法来挑选这些完全回避OpenGL的四边形。 您认为无需OpenGL的CPU解决方案吗?
对不起所有问题。 我的主要问题仍然是,人们可以使用OpenGL(JOGL)从大量四边形中选择一个好方法吗?
答案 0 :(得分:2)
从大量四边形中挑选的最佳方法无法轻松定义。我不太喜欢颜色挑选或类似的技术,因为它们在大多数情况下似乎是不切实际的。我从来没有理解为什么会有这么多的教程专注于OpenGl的新手,甚至是专注于挑选的编程,几乎对所有东西都没用。例如:尝试获取您在高度图中单击的像素:不可能。尝试在您单击的模型中找到确切的网格:不切实际。
如果你有大量的四边形,你可能需要一个良好的空间分区,或者至少(更好的是)一个场景图。好吧,你不需要这个,但它有很多帮助。查看场景图的一些教程以获取更多信息,了解您是否从3D编程开始是一件好事,因为您了解了很多概念而不仅仅是OpenGl代码。
那么现在该做些什么呢?在您的鼠标光标位置上取模型视图矩阵(带glUnproject(...)
的iirc)的反函数。使用相机的方向,您现在可以将光线投射到空间结构(或包含空间结构的场景图)中。现在检查与四边形的碰撞。我目前没有链接,但是如果你搜索逆模型视图矩阵,你应该找到一些页面来解释这个更好,更详细,而不是在这里做的实际。
使用这种基于光线投射的技术,您将能够在O(log n)中找到四边形,其中n是您拥有的四边形数量。根据应用程序的确切布局(您的问题过于通用而不是更具体)的一些启发式方法,您可以在大多数情况下对此进行大量改进。
这种简单的空间结构例如是四叉树。但是你应该先从他们的光线投射开始,以完全理解这种技术。
答案 1 :(得分:0)
从未遇到过这样的问题,但在我看来,我认为基于CPU的选择是最好的尝试方式。
如果您有大量的四边形,也许您可以按空间对四边形进行分组以避免测试所有四边形。例如,您可以将四边形分组在两个框中,并快速测试您
的哪个框答案 2 :(得分:0)
我刚刚实施了颜色选择,但glReadPixels
在这里很慢(我在某处读过它可能对GL
和CPU
之间的异步行为有害。)
另一种可能性似乎是我使用变换反馈和进行剪刀测试的几何着色器。然后GS
可以丢弃所有不包含鼠标位置的面。变换反馈缓冲区然后包含有关悬停网格的信息。
您可能也希望将深度写入变换反馈缓冲区,以便找到最顶层的悬停网格。 这种方法也适用于实例化(另外将实例id写入缓冲区)
我还没有尝试过,但我想它会比使用glReadPixels
快得多。
我只找到了此approach的参考资料。
答案 3 :(得分:-1)
我正在使用我从DirectX SDK
借来的解决方案,这是一个很好的例子,如何检测椎骨缓冲区对象中的选定多边形。
相同的算法适用于OpenGL
。