w划分后Z值大于1

时间:2014-06-29 13:34:01

标签: opengl perspectivecamera

我在顶点着色器中所做的是:

shadowCoord = shadowVP * mMatrix *  vec4(vertex_position,1.0);

现在要将其恢复到[ -1 1 ]范围内,我在片段着色器中执行了此操作:

vec3 proj = shadowCoord.xyz / shadowCoord.w;

但如果我测试这一点的z值,我会得到一个大于 1 的值。

我使用的透视矩阵是通过以下方式获得的:

glm::perspective(FOV, aspectRatio, near, far); 

结果是:

[2.4142  0      0      0 
 0     2.4142   0      0
 0       0    -1.02   -1
 0       0    -0.202   0]

并且shadowVP是:

shadow_Perp * shadow_View

{{1>}不应该在[ -1 1 ]的范围内?

1 个答案:

答案 0 :(得分:2)

  

是否proj.z不在[-1,1]的范围内?

没有。如果该点位于平截头体内,则它在[-1,1]范围内。对于剪辑空间中的任何vetrex,平截头体被定义为-w <= x,y,z <= w(每个顶点w变化)。但是你不做任何剪辑,所以这里可以产生任何价值。请注意两件事:

  1. 虽然我在平截头体中说了这个含义&#34; v&#34; =&GT; &#34; NDC coords in [-1,1]&#34;坚持,反之亦然。这意味着你可以在[-1,1]内得到NDC坐标,这些点位于frusutm之外的位置(甚至可能位于&#34;观察位置&#34;后面)。

  2. 你也可以在这里得到除法。