我在顶点着色器中所做的是:
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 ]的范围内?
答案 0 :(得分:2)
是否
proj.z
不在[-1,1]的范围内?
没有。如果该点位于平截头体内,则它在[-1,1]范围内。对于剪辑空间中的任何vetrex,平截头体被定义为-w <= x,y,z <= w
(每个顶点w
变化)。但是你不做任何剪辑,所以这里可以产生任何价值。请注意两件事:
虽然我在平截头体中说了这个含义&#34; v
&#34; =&GT; &#34; NDC coords in [-1,1]&#34;坚持,反之亦然。这意味着你可以在[-1,1]内得到NDC坐标,这些点位于frusutm之外的位置(甚至可能位于&#34;观察位置&#34;后面)。
你也可以在这里得到除法。