理解 glm::perspective 矩阵

understanding glm::perspective matrix

我正在尝试实现一个简单的 3d 渲染。我实现了一个类似于glm::perspective的透视投影矩阵。我读过透视投影矩阵变换顶点,使得在透视除法之后,可见区域,即位于指定平截头体内的对象落在 [-1,1] 范围内,但是当我用返回的矩阵测试一些值时glm::perspective结果和我理解的不太一样

float nearPlane = 0.1f;
float farPlane = 100.0f;

auto per =
    glm::perspective(45.0f, (float)(window_width * 1.0 / window_height),
                        nearPlane, farPlane);
// z=nearplane
print(per * glm::vec4(1, -1, -0.1, 1));
// z=farplane
print(per * glm::vec4(1, -1, -100, 1));
// z between nearplane and farplane
print(per * glm::vec4(1, -1, -5, 1));
// z beyond far plane
print(per * glm::vec4(1, -1, -200, 1));
// z behind the camera
print(per * glm::vec4(1, -1, 0.1, 1));
// z between camera and near plane
print(per * glm::vec4(1, -1, -0.09, 1));

根据我的理解,如果顶点的 z 坐标位于 nearPlane 的正 z 方向,那么在透视划分后 z/w 值应该 <-1 但如下图所示事实并非如此。我错过了什么?

as per my understanding if vertices has z coordinate which is lies towards positive z direction from nearPlane then after perspective divide z/w value should be <-1 but as shown in picture below it is not the case. what am i missing?

事实并非如此。 z=0(相机平面)处有奇点,函数符号翻转(相机向左看;蓝色竖线为近裁剪平面):

这些值仍然在 [-1,1] 范围之外,告诉我们它们在相机视锥之外,应该相应地进行裁剪。

您可能会感到困惑,因为您认为“较小的 z/w 值意味着该点更靠近相机”。但这仅在镜头前才是真实的。事实上,深度缓冲区值仅在片段未被裁剪时才重要——即在 [-1,1] 范围内,该关系恰好是正确的。