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

C 确定多边形是否在视锥体内,c,opengl,graphics,rendering,glsl,C,Opengl,Graphics,Rendering,Glsl,以下是我的问题。我听说OpenGL忽略了视图截锥之外的顶点,不考虑渲染管道中的顶点。最近我遇到了一篇同样的帖子,上面说你应该自己检查一下,如果一个点不在里面,你有责任找出不是opengl的!现在, opengl是真的吗?它是否理解点是否不在内部,并且不渲染它 我正在开发一个草场景,它在矩形上有大约4000棵草。我有糟糕的FPS,我想出的唯一解决方案是决定哪些草在视口中,然后只渲染它们!我在这里的问题是,什么样的解决方案对我来说是最好的,来找出哪个矩形不在里面,或者哪个在里面 请注意,我的问题不是

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

  • opengl是真的吗?它是否理解点是否不在内部,并且不渲染它
  • 我正在开发一个草场景,它在矩形上有大约4000棵草。我有糟糕的FPS,我想出的唯一解决方案是决定哪些草在视口中,然后只渲染它们!我在这里的问题是,什么样的解决方案对我来说是最好的,来找出哪个矩形不在里面,或者哪个在里面
  • 请注意,我的问题不是关于点,而是关于长方形。此外,我还需要根据草的距离对它们进行排序,因此最好使用客户端内存


    请让我知道是否有任何有效和实时的方法,以找出任何给定的网格是内部或外部的锥台。谢谢。

    < P>即使是真的,OpenGL也不会在平截锥体之外显示多边形(像任何其他3D引擎),它必须考虑它们来检查内部是否存在,然后FPS减速。通常需要一些智能优化算法来避免场景中充斥着看不见的对象。例如,选择BSP树+PV或入口作为起点。
    要检查应用程序中是否存在瓶颈,可以尝试使用。如果没有什么是合理的错误优化是为了画出PVS(可能的可见集合)的方式。

    即使是真的,OpenGL也不会在平截头体之外显示多边形(像任何其他3D引擎),它必须考虑它们来检查内部是否存在,然后FPS减速。通常需要一些智能优化算法来避免场景中充斥着看不见的对象。例如,选择BSP树+PV或入口作为起点。


    要检查应用程序中是否存在瓶颈,可以尝试使用。如果没有什么是合理的错误,那么优化以只绘制PVS(可能的可见集)是一种方法。

    OpenGL不会在屏幕外渲染像素(“片段”),因此它必须以某种方式进行剪裁

    更准确地说:

    • 提交几何图形
    • 进行绘制调用(GLDrawArray或glDrawElements)
    • 每个顶点都经过顶点着色器,该着色器计算顶点在摄影机空间中的最终位置。如果您没有编写顶点着色器(=旧opengl),驱动程序将为您创建一个顶点着色器
    • 透视分割将这些坐标转换为标准化设备坐标。粗略地说,这意味着相机的平截头体变形以适合[-1,1]x[-1,1]x[-1,1]盒
    • 盒子外面的东西都剪掉了。这可能意味着完全丢弃三角形,或者如果三角形穿过剪裁平面,则对其进行细分
    • 每个剩余的三角形都被栅格化为片段
    • 每个片段都经过片段着色器
    所以基本上,OpenGL知道如何剪裁,但是每个顶点仍然必须经过顶点着色器。所以提交你的整个世界当然是可行的,但是如果你能找到一种不提交所有东西的方法,你的GPU会更快乐

    当然,这是一种权衡。如果你花10毫秒检查CPU上的每一块草地,这样GPU就只有最少的数据可供绘制,这也不是一个好的解决方案

    如果你想优化草地,我建议剔除大的斑块(5米x 5米左右)。这是标准的AABB平截头体测试


    如果您想优化更通用的模型,您可以研究“平面”模型的四叉树、更复杂对象的八叉树和bsp树。

    OpenGL不会在屏幕外渲染像素(“片段”),因此它必须以某种方式剪裁

    更准确地说:

    • 提交几何图形
    • 进行绘制调用(GLDrawArray或glDrawElements)
    • 每个顶点都经过顶点着色器,该着色器计算顶点在摄影机空间中的最终位置。如果您没有编写顶点着色器(=旧opengl),驱动程序将为您创建一个顶点着色器
    • 透视分割将这些坐标转换为标准化设备坐标。粗略地说,这意味着相机的平截头体变形以适合[-1,1]x[-1,1]x[-1,1]盒
    • 盒子外面的东西都剪掉了。这可能意味着完全丢弃三角形,或者如果三角形穿过剪裁平面,则对其进行细分
    • 每个剩余的三角形都被栅格化为片段
    • 每个片段都经过片段着色器
    所以基本上,OpenGL知道如何剪裁,但是每个顶点仍然必须经过顶点着色器。所以提交你的整个世界当然是可行的,但是如果你能找到一种不提交所有东西的方法,你的GPU会更快乐

    当然,这是一种权衡。如果你花10毫秒检查CPU上的每一块草地,这样GPU就只有最少的数据可供绘制,这也不是一个好的解决方案

    如果你想优化草地,我建议剔除大的斑块(5米x 5米左右)。这是标准的AABB平截头体测试


    如果要优化更通用的模型,可以研究“平面”模型的四叉树、更复杂对象的八叉树和bsp树。

    是的,OpenGL不会将三角形光栅化,使视锥变得过大。但是,这并不意味着这对应用程序来说是最佳的:OpenGL实现应变换顶点坐标(通过使用固定管道或顶点着色器),然后,通过标准化坐标,它最终知道三角形是否位于视锥中

    这意味着在这种情况下,没有像素被光栅化,但是顶点数据被处理得一模一样;根本不会产生来自不可见三角形的碎片

    OpenGL扩展可能有助于
        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.