我想计算网格对最终渲染的影响,即它在视口中的大小。 为此,我尝试在屏幕上为每个顶点获取投影位置。 例如,在屏幕中心呈现的点应返回右上角的(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)
处。
所述点的screenPos返回(1.81, -2.41, 10.82, 11.0)
(舍入值)。只要我无法理解,我就无法继续这些结果。有谁知道x
,y
,z
和w
值对我的观点有何看法?
我感谢任何帮助或提示,在这个问题上工作太久。
PS:我知道有很多问题涉及glm::perspective
,但我不想要
渲染网格。我甚至不想包括GLSL
。这只是计算。
答案 0 :(得分:1)
您可以将screenPos
除以w
组件,然后获取屏幕空间坐标。
screenPos = screenPos / screenPos.w;
这是透视师。此划分将相机视锥转换为后投影立方体。在screenPos.xy
成为屏幕空间坐标和screenPos.z
- 标准化深度(0.0 - 近平面,1.0 - 远平面,以及顺便说一下,它不是线性的)之后。
但它只适用于具有正screenPos.w
的顶点(即相机前的顶点)。