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)
(四舍五入的值)。只要我无法理解它们,我就无法继续处理这些结果。有谁知道 x
、y
、z
和 w
值准确表达了我的观点?
感谢任何帮助或提示,在此问题上工作时间过长。
PS:我知道有很多问题涉及 glm::perspective
,但我不想
渲染网格。我什至不想包括 GLSL
。只是计算而已。
您可以将 screenPos
除以它的 w
分量,您将得到屏幕-space 坐标。
screenPos = screenPos / screenPos.w;
这是透视分割。此除法将相机平截头体转换为 post 投影立方体。之后 screenPos.xy
将成为屏幕 space 坐标和 screenPos.z
- 归一化深度(0.0 - 近平面,1.0 - 远平面,顺便说一句,它不是线性的)。
但它仅对具有正 screenPos.w
的顶点(即相机前的顶点)是正确的。
我想计算网格对最终渲染的影响,即它在视口中的大小。 为此,我尝试获取每个顶点在屏幕上的投影位置。 例如,在屏幕中心呈现的点应该在右上角 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)
(四舍五入的值)。只要我无法理解它们,我就无法继续处理这些结果。有谁知道 x
、y
、z
和 w
值准确表达了我的观点?
感谢任何帮助或提示,在此问题上工作时间过长。
PS:我知道有很多问题涉及 glm::perspective
,但我不想
渲染网格。我什至不想包括 GLSL
。只是计算而已。
您可以将 screenPos
除以它的 w
分量,您将得到屏幕-space 坐标。
screenPos = screenPos / screenPos.w;
这是透视分割。此除法将相机平截头体转换为 post 投影立方体。之后 screenPos.xy
将成为屏幕 space 坐标和 screenPos.z
- 归一化深度(0.0 - 近平面,1.0 - 远平面,顺便说一句,它不是线性的)。
但它仅对具有正 screenPos.w
的顶点(即相机前的顶点)是正确的。