【发布时间】:2019-11-05 15:31:45
【问题描述】:
我正处于我在 OpenGL 中编写的渲染器的优化阶段,我的下一步是剔除我看不到的所有内容。在阅读this 和其他资源时,我看到截锥体的视觉描述如下:
图片来自:https://www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png
因此认为我们传递了类似glm::radians(90.0f) 的东西。然而,我的算法开始遇到剔除问题,因为我认为我会在飞机的左侧和右侧移动 45 度……但后来我开始出现误报剔除。一旦我将其更改为使用传递给glm::perspective 的fov 角度,那么剔除就会开始正常工作。
但是有两件事我不确定:
- 我说的对吗?因为 fov 值应该是上面发布的图像中绿色角度的一半?
- 如果 (1) 为真,那么为什么 90 的 fov 不能显示我左右两侧的所有内容?
这些对我来说很重要,因为我想让我的剔除算法尽可能地剔除而不会出现误报。正如您可能猜到的那样,我得到了误报剔除,因为我认为“我需要将我用于 glm::perspective() 的第一个参数再次除以二以获得一半的角度”,这导致了一个更紧密的截锥体,可以剔除一个比它应有的要多得多。
我目前剔除的方式是计算截锥体的左右边缘,并通过点积剔除左右边缘看不到的任何二维线(就好像它们是线段一样) .这就是为什么一个更窄的角度让我感到悲伤。顺便说一句,如果有更好的方法,请告诉我,虽然我认为两个点积可能是我要检查的一条线的计算效率方面最便宜的方法。
【问题讨论】:
-
“我说的对吗?因为 fov 值应该是上图中绿色角度的一半?” - 不,当您使用
glm::perspective时,那么这个角就是全角,但它是从平截头体顶部到底部的角度。所以从左到右的角度取决于纵横比。所以如果视图的宽度大于高度并且fov小于180°,那么从左到右的角度大于从上到下的角度。 -
另外,它是垂直角度。顺便说一句,extract the planes from the view-projection matrix 通常更容易、更健壮。
标签: c++ opengl rendering glm-math perspectivecamera