multiplyMV的误区——OpenGL ES 2.0

Misunderstanding of multiplyMV - OpenGL ES 2.0

我使用 OpenGL ES 2.0 和 Java 为 Android 编写了一个简单的程序。 该程序使用正射投影矩阵、视图矩阵和模型矩阵在屏幕上的随机位置绘制一个点。在着色器中我放了 matrix * position.

一切正常,但出于测试目的,我尝试自己计算点的位置,所以我使用 multiplyMV 并将我的 MVPmatrix 作为参数(通过在投影和视图之间使用 multiplyMM 获得)然后在结果和模型矩阵之间)和我的观点(例如 2f、3.5f、0f、1f)。问题是有时我得到的 x and/or y 的结果大于 1 或小于 -1,尽管该点在屏幕上。但是在规范化的设备坐标中,点的范围必须在 -1 和 1 之间才能成为 "on screen".

我真的不明白我的错误在哪里。

在应用投影矩阵后,点必须在归一化设备 space [-1, 1](对于 x、y、z)中。
但是注意点可能是Homogeneous coordinate. This means you have to do a Perspective divide先。

投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图 space 转换为剪辑 space。剪辑 space 中的坐标通过除以 w 转换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的规范化设备坐标 (NDC)剪辑坐标的分量。

剪辑space坐标为Homogeneous coordinates。在 clipspace 中执行场景的剪辑。如果 xyz 分量在反转的 w 分量和 w 点的齐次坐标分量:

-p.w <=  p.x, p.y, p.z  <= p.w.

通过执行 Perspective divide:

将剪辑坐标转换为归一化的设备坐标
ndc.xyz = (p.x/p.w, p.y/p.w, p.z/p.w)