我需要一种简单快速的方法,通过使用OpenGL Modelview和Projection矩阵以及OpenGL视口尺寸,找出3D边界框在屏幕上显示的大小(用于LOD计算)。
我的第一个目的是使用gluProject()在屏幕上投射所有8个方框角,然后计算凸包的面积。此解决方案仅适用于完全位于视锥体内的边界框。
但是如何在屏幕上获取未完全在观看体积内的盒子?对一个盒子进行成像,其中7个角落在近平面后面,并且只有一个角落在近平面的前面,因此在视锥体内。
我找到了另一个非常相似的问题Screen Projection and Culling united,但它没有涵盖我的问题。
答案 0 :(得分:2)
如何使用查询并获取通过渲染的样本?
http://www.opengl.org/wiki/Query_Object并参阅GL_SAMPLES_PASSED,
通过这种方式,您可以测量渲染的碎片数量,并将其与正确的LOD选择进行比较。
答案 1 :(得分: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现在是屏幕空间坐标v.x.这正是图形管道确定顶点在屏幕上的位置。
我之前使用过这个基本方法来计算屏幕上几何体的大小。关于它的好处在于,无论投影是透视还是正投影,数学都可以工作,只要除以矢量的第4个分量(对于正交投影,第4个分量将为1)。