为什么不手动将世界视图投影与顶点位置相乘?这将为您提供“标准化设备坐标”中的顶点,其中 -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),数学就可以工作。