glm::perspective的fov参数是否定义为视野角度的一半?

Is glm::perspective's fov parameter defined as half the angle of the field of view?

我正处于用 OpenGL 编写的渲染器的优化阶段,下一步是剔除我看不到的所有内容。在阅读 this 和其他资源时,我看到视锥体的视觉描述如下:

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

因此认为我们通过了类似 glm::radians(90.0f) 的内容。然而,我开始 运行 使用我的算法剔除问题,因为我认为我会沿着左右 45 度的方向移动平面......但后来我开始出现误报剔除。一旦我将其更改为使用传递给 glm::perspectivefov 角度,剔除就开始正常工作了。

但是有两件事我不确定:

  1. 我说的对吗?至于fov值应该是上图中绿色角度的一半?
  2. 如果 (1) 为真,那么为什么 90 的视野不能显示我左右两侧的所有内容?

理解这些对我来说很重要,因为我想让我的剔除算法尽可能多地剔除而不会出现误报。正如您可能猜到的那样,我得到了误报剔除,因为我认为 "I need to divide the first argument I use for glm::perspective() again by two to get half of the angle" 这导致了一个更紧密的截锥体,会剔除比它应该拥有的更多的东西。

我目前剔除的方式是计算平截头体的左右边缘,并剔除任何左右边缘看不到的二维线(就像它们是线段一样)通过点产品。这就是为什么更窄的角度让我感到悲伤。顺便说一句,如果有更好的方法让我知道,尽管我认为就必须检查的一条线的计算效率而言,两个点积可能是最便宜的。

glm::perspectivefov参数为视锥从下到上(y轴)的夹角
如果视口是矩形的,并且视口的宽度大于高度(且 fov < 180°),则从左到右的角度大于从上到下的角度:

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