我正处于我在OpenGL中编写的渲染器的优化阶段,下一步是剔除我看不到的所有内容。在阅读this和其他资源时,我看到了平截头体的视觉描述,如:
图片来自:https://www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png
因此认为我们传递了类似glm::radians(90.0f)
之类的东西。但是,我开始遇到算法的剔除问题,因为我认为我会沿着飞机的左右方向旋转45度...但是后来我开始出现假阳性剔除。一旦我将其更改为使用传递给fov
的{{1}}角度,则清除工作开始正常。
但是我不确定两件事:
这些对于我来说很重要,因为我想让剔除算法尽可能地被剔除而不会出现误报。您可能会猜到,我收到了误报,因为我认为“我需要将用于glm::perspective
的第一个参数再除以2以得到一半的角度”,这导致了更紧密的截锥体剔除比应有的更多。
我当前选择的方法是计算平截头体的左边缘和右边缘,并通过点积剔除左边缘或右边缘(就像它们是线段)无法看到的任何2D线。这就是为什么狭窄的角度让我感到悲伤。顺便说一句,如果有更好的方法可以做到这一点,请告诉我,尽管我认为两种点积可能是我要检查的直线计算效率上最便宜的一种。
答案 0 :(得分:2)
glm::perspective
的fov
参数是视锥的底部到顶部的角度( y 轴)。
如果视口是矩形,并且视口的宽度大于高度(并且fov
<180°),则从左到右的角度大于从上到下的角度:
aspect = width / height
fov_x = atan(tan(fov_y/2) * aspect) * 2