我正在用OpenGL编写渲染器的优化阶段,下一步是剔除所有看不见的东西。在阅读this和其他资源时,我看到了平截头体的视觉描述,例如:

c++ - glm::perspective的fov参数是否定义为视场角的一半?-LMLPHP

图片来自:https://www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png

因此认为我们传递了类似glm::radians(90.0f)的东西。但是,我开始遇到算法的剔除问题,因为我认为我会沿飞机的左右方向旋转45度...但是后来我开始出现假阳性剔除。一旦将其更改为使用传递给fovglm::perspective Angular ,则剔除开始正常工作。

但是,我不确定两件事:

  • 我所说的正确吗?如在fov值中,应该是上面发布的图像中绿色 Angular 一半吗?
  • 如果(1)是true,那么为什么fov为90并不能向我显示我左右两侧的所有内容?

  • 这些对于我来说很重要,因为我想让剔除算法尽可能地无误报。您可能会猜到,我得到了假阳性剔除,因为我认为“我需要将用于glm::perspective()的第一个参数再次除以2以得到一半的 Angular ”,这导致了更紧密的平截头体,从而剔除了更多超出应有的水平。

    我目前选择的方法是计算平截头体的左边缘和右边缘,并通过点积选择左或右边缘(就像它们是线段)无法看到的任何2D线。这就是为什么狭窄的 Angular 让我感到悲伤。顺便说一句,如果有更好的方法可以做到这一点,请告诉我,尽管我认为两种点乘积可能是我要检查的直线计算效率中最便宜的一种。

    最佳答案

    fov glm::perspective参数是视锥的底部到顶部的 Angular (y轴)。
    如果视口(viewport)为矩形,并且视口(viewport)的宽度大于高度(且fov

    aspect = width / height
    fov_x  = atan(tan(fov_y/2) * aspect) * 2
    

    10-08 11:57