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 中执行场景的剪辑。如果 x
、y
和 z
分量在反转的 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)
我使用 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 中执行场景的剪辑。如果 x
、y
和 z
分量在反转的 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)