C++ / GLM:计算顶点的屏幕位置

C++ / GLM : Calculate screen position of vertex

我想计算网格对最终渲染的影响,即它在视口中的大小。 为此,我尝试获取每个顶点在屏幕上的投影位置。 例如,在屏幕中心呈现的点应该在右上角 return (0,0) 屏幕一角 (1,1) 等等。

这是我的代码,精简到最低限度,并且基于几乎每一个 为 glm::perspective 提供的示例代码:

glm::mat4 Projection = glm::perspective(
    glm::radians(45.0f), 
    800.0f/600.0f, 
    0.1f, 
    100.0f
);
glm::mat4 View = glm::lookAt(
    glm::vec3(-10,0,3),
    glm::vec3(0,0,3),
    glm::vec3(0,0,1)
);
glm::mat4 MVP = Projection * View * glm::mat4(1.f);

for each (Vertex vert in *verts) {
    glm::vec3 vertPos = vert.getPosition();
    glm::vec4 screenPos = MVP * glm::vec4(vertPos, 1);
}

此时我卡住了,因为我不知道如何处理生成的向量。 我搞不懂它的四个值是什么意思

在我的示例设置中,点 (-1,-1,2)(见第一张图片上的红色圆圈)粗略地呈现在像素 (480,380) 处。 所述点的屏幕位置 returns (1.81, -2.41, 10.82, 11.0)(四舍五入的值)。只要我无法理解它们,我就无法继续处理这些结果。有谁知道 xyzw 值准确表达了我的观点?

感谢任何帮助或提示,在此问题上工作时间过长。

PS:我知道有很多问题涉及 glm::perspective,但我不想 渲染网格。我什至不想包括 GLSL。只是计算而已。

您可以将 screenPos 除以它的 w 分量,您将得到屏幕-space 坐标。

screenPos = screenPos / screenPos.w;

这是透视分割。此除法将相机平截头体转换为 post 投影立方体。之后 screenPos.xy 将成为屏幕 space 坐标和 screenPos.z - 归一化深度(0.0 - 近平面,1.0 - 远平面,顺便说一句,它不是线性的)。

但它仅对具有正 screenPos.w 的顶点(即相机前的顶点)是正确的。