5

我需要一种简单而快速的方法,通过使用 OpenGL 模型视图和投影矩阵以及 OpenGL 视口尺寸来找出屏幕上出现的 3D 边界框有多大(用于 LOD 计算)。

我的第一个意图是使用 gluProject() 在屏幕上投影所有 8 个框角,然后计算凸包的面积。此解决方案仅适用于完全在视锥内的边界框。

但是,如何才能在屏幕上显示未完全在观看范围内的盒子的覆盖区域?成像一个盒子,其中 7 个角在近平面后面,只有一个角在近平面前面,因此在视锥内。

我发现了另一个非常相似的问题Screen Projection and Culling,但它并没有涵盖我的问题。

4

2 回答 2

2

如何使用查询并获取通过渲染的样本?

http://www.opengl.org/wiki/Query_Object并查看 GL_SAMPLES_PASSED,

这样您就可以测量渲染了多少片段并比较它以进行正确的 LOD 选择。

于 2013-02-04T12:21:15.117 回答
1

为什么不手动将世界视图投影与顶点位置相乘?这将为您提供“标准化设备坐标”中的顶点,其中 -1 是屏幕的左下角,+1 是屏幕的右上角?

唯一的问题是,如果投影是透视的,您必须将顶点除以它们的第 4 个分量,即如果最终顶点是 (x,y,z,w),您将除以 w。

以位置向量为例

v = {x, 0, -z, 1}

给定垂直视角视图'a'和纵横比'r',x'在标准化设备坐标(范围0 - 1)中的位置是这样的(这个公式直接取自图形编程书籍):

x' = x *  cot(a/2) / ( r * z )

因此,给定参数的透视投影如下(以行主要格式显示):

cot(a/2) / r     0      0    0
     0        cot(a/2)  0    0
     0           0      z1  -1
     0           0      z2   0

当您将向量乘以投影矩阵时(假设世界,在此示例中视图矩阵是恒等式),您会得到以下结果(我仅计算新的“x”和“w”值,因为在此示例中它们很重要) .

v' = { x * cot(a/2) / r, newY, newZ, z }

所以最后,当我们将新向量除以其第四个分量时,我们得到

v' = { x * cot(a/2) / (r*z), newY/z, newZ/z, 1 }

所以 v'.x 现在是屏幕空间坐标 vx 这正是图形管道用来确定顶点在屏幕上的位置。

我之前使用过这种基本方法来计算屏幕上几何图形的大小。关于它的好处是,无论投影是透视投影还是正交投影,只要您除以向量的第 4 个分量(对于正交投影,第 4 个分量将为 1),数学就可以工作。

于 2013-02-04T18:45:57.440 回答