这是我的问题。我听说opengl忽略了在视锥体之外的顶点,并且在渲染管道中不考虑它们。最近我遇到了一个同样的帖子,说你应该检查一下你自己,如果一个点不在里面,你有责任找出不是opengl的!现在,
请考虑我的问题主要不是关于点,而是关于矩形。此外,我需要根据它们的距离对草进行排序,因此如果本机在客户端内存中则更好。
如果有任何有效且实时的方法可以确定是否有任何给定的网格在平截头体内部或外部,请告诉我。感谢。
答案 0 :(得分:3)
即使是真的,OpenGL也不会在视锥体外显示多边形(与任何其他3d引擎一样),它必须考虑它们来检查是否有内部,然后fps减速。通常需要一些智能优化算法来避免使用不可见对象充斥场景。检查例如BSP树+ PVS或门户作为起点。 要检查应用程序中是否存在某些瓶颈,您可以尝试使用gDebugger。如果没有任何合理的错误,那么优化以便仅绘制PVS(可能的可见集合)是可行的方法。
答案 1 :(得分:2)
OpenGL不会在屏幕外渲染像素(“碎片”),所以它必须以某种方式剪辑...
更确切地说:
基本上,OpenGL知道如何剪辑,但每个顶点仍然必须通过顶点着色器。因此,提交您的整个世界当然会有效,但如果您能找到不提交所有内容的方式,那么您的GPU会更快乐。
当然,这是一种权衡。如果你花费10毫秒来检查CPU上的每一块草,以便GPU只有最少量的数据,那么它也不是一个好的解决方案。
如果你想优化草,我建议剔除大块(5米x 5米左右)。这是标准的AABB-frustum测试。
如果要优化更通用的模型,可以为更复杂的对象研究“平面”模型,八叉树和bsp树的四叉树。
答案 2 :(得分:2)
是的,OpenGL不会对观看截头体上的三角形进行光栅化。但是,这并不意味着这对于应用程序来说是最佳的:OpenGL实现应该转换顶点坐标(通过使用固定管道或顶点着色器),然后,具有标准化坐标,它最终知道三角形是否位于观看截头体内。 / p>
这意味着在这种情况下没有像素被光栅化,但是顶点数据被处理完全相同;根本不会产生从不可见三角形派生的碎片!
OpenGL扩展程序ARB_occlusion_query可能对您有所帮助,但在讨论部分中明确指出:
遮挡查询会使其他可见性算法过时吗?
No.
Occlusion queries are helpful, but they are not a cure-all. They
should be only one of many items in your bag of tricks to decide
whether objects are visible or invisible. They are not an excuse
to skip frustum culling, or precomputing visibility using portals
for static environments, or other standard visibility techniques.
关于深度网格排序的问题,你应该使用深度缓冲区:基本上只有当它与视口的距离小于同一位置的前一个片段时,才能有效地渲染网格片段。这使您了解排序网格。这个缓冲区基本上是免费的,它允许你提高性能,因为它丢弃了更远的片段。
答案 3 :(得分:1)
是。像其他人指出的那样,OpenGL必须执行大量的每顶点操作以确定它是否在平截头体中。必须为发送它的每个顶点执行此操作。除了必须进行的处理开销之外,请记住,从CPU到GPU的那些顶点的传输还有额外的开销。您希望避免向GPU发送不会使用的信息。虽然CPU和GPU之间的带宽在现代硬件上相当不错,但仍然存在限制。
你想要的是Scene Graph。场景图通常使用某种空间分区方案来实现,例如Quadtrees,Octrees,BSPTrees等等。空间分区允许您智能地确定哪些几何是可见的。它不是基于每个顶点执行此操作(就像OpenGL一样),它可以一次消除几何体的巨大空间子集。渲染复杂场景时,性能节省可能是巨大的。