我正在用OpenGL编写渲染器的优化阶段,下一步是剔除所有看不见的东西。在阅读this和其他资源时,我看到了平截头体的视觉描述,例如:
图片来自:https://www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png
因此认为我们传递了类似glm::radians(90.0f)
的东西。但是,我开始遇到算法的剔除问题,因为我认为我会沿飞机的左右方向旋转45度...但是后来我开始出现假阳性剔除。一旦将其更改为使用传递给fov
的glm::perspective
Angular ,则剔除开始正常工作。
但是,我不确定两件事:
这些对于我来说很重要,因为我想让剔除算法尽可能地无误报。您可能会猜到,我得到了假阳性剔除,因为我认为“我需要将用于
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