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

Wat*_*ter 3 c++ opengl rendering perspectivecamera glm-math

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

平截头体

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

因此认为我们通过了类似的东西glm::radians(90.0f)。然而,我开始遇到我的算法的剔除问题,因为我认为我会沿着左右各 45 度的飞机……但后来我开始得到误报剔除。一旦我将其更改为使用fov传递给的角度,glm::perspective则剔除开始工作正常。

但是有两件事我不确定:

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

这些对我来说很重要,因为我想让我的剔除算法在没有误报的情况下尽可能多地剔除。正如您可能猜到的那样,我得到了误报剔除,因为我认为“我需要将我glm::perspective()再次使用的第一个参数除以二以获得角度的一半”,这导致更紧密的截锥体将剔除更多它应该有。

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

Rab*_*d76 6

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

aspect = width / height
fov_x  = atan(tan(fov_y/2) * aspect) * 2
Run Code Online (Sandbox Code Playgroud)