确定多边形是否在视锥体内

时间:2011-06-16 15:13:38

标签: c opengl graphics rendering glsl

这是我的问题。我听说opengl忽略了在视锥体之外的顶点,并且在渲染管道中不考虑它们。最近我遇到了一个同样的帖子,说你应该检查一下你自己,如果一个点不在里面,你有责任找出不是opengl的!现在,

  1. 这是关于opengl的吗?它是否理解一个点是否在内部,而不是渲染它?
  2. 我正在开发一个草地,在长方形上有大约4000棵草。我有可怕的FPS,我提出的唯一解决方案是决定哪些草在视口内,然后只渲染它们!我的问题是,什么解决方案最适合我找出哪个矩形不在里面或哪个是?
  3. 请考虑我的问题主要不是关于点,而是关于矩形。此外,我需要根据它们的距离对草进行排序,因此如果本机在客户端内存中则更好。

    如果有任何有效且实时的方法可以确定是否有任何给定的网格在平截头体内部或外部,请告诉我。感谢。

4 个答案:

答案 0 :(得分:3)

即使是真的,OpenGL也不会在视锥体外显示多边形(与任何其他3d引擎一样),它必须考虑它们来检查是否有内部,然后fps减速。通常需要一些智能优化算法来避免使用不可见对象充斥场景。检查例如BSP树+ PVS或门户作为起点。 要检查应用程序中是否存在某些瓶颈,您可以尝试使用gDebugger。如果没有任何合理的错误,那么优化以便仅绘制PVS(可能的可见集合)是可行的方法。

答案 1 :(得分:2)

OpenGL不会在屏幕外渲染像素(“碎片”),所以它必须以某种方式剪辑...

更确切地说:

  • 您提交几何
  • 您进行绘制调用(glDrawArrays或glDrawElements)
  • 每个顶点都通过顶点着色器,该着色器计算相机空间中顶点的最终位置。如果你没有写一个顶点着色器(=旧的opengl),驱动程序会为你创建一个。
  • 透视分割在标准化设备坐标中转换这些坐标。粗略地说,这意味着您的相机的平截头体变形以适合[-1,1] x [-1,1] x [-1,1]框
  • 此框外的所有内容都已剪裁。这可能意味着完全丢弃三角形,或者如果它跨越剪裁平面则将其细分
  • 每个剩余的三角形都被栅格化为片段
  • 每个片段都通过片段着色器

基本上,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)

  1. 是。像其他人指出的那样,OpenGL必须执行大量的每顶点操作以确定它是否在平截头体中。必须为发送它的每个顶点执行此操作。除了必须进行的处理开销之外,请记住,从CPU到GPU的那些顶点的传输还有额外的开销。您希望避免向GPU发送不会使用的信息。虽然CPU和GPU之间的带宽在现代硬件上相当不错,但仍然存在限制。

  2. 你想要的是Scene Graph。场景图通常使用某种空间分区方案来实现,例如QuadtreesOctreesBSPTrees等等。空间分区允许您智能地确定哪些几何是可见的。它不是基于每个顶点执行此操作(就像OpenGL一样),它可以一次消除几何体的巨大空间子集。渲染复杂场景时,性能节省可能是巨大的。