当在顶点着色器中使用透视矩阵时,我应该编写代码来除以 w 还是在稍后阶段自动完成?
我的问题的原因是我看到很多顶点着色器使用:
gl_Position = matrix * pos;
如果后面有一个阶段将向量除以它的 w 分量,这就有意义了。
然而,直到我在顶点着色器中使用以下内容之前,我从未让它工作:
gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;
第二个示例是正确的还是可能缺少其他设置?
换句话说:图中所示的步骤OpenGL 顶点变换 http://www.songho.ca/opengl/gl_transform.html(第一张图片)我必须在顶点着色器中写入吗?
我确信模型视图和投影矩阵属于那里(或两者的合并)。视口变换不是顶点着色器的一部分,但是divide by w
?
My setup是一些简单的三角形,x/y/z 的坐标在 [-1 1] 范围内。
透视矩阵应该将从 z=-1 到 -10 的坐标投影到 z=-1、x=[-1,1]、y=[-1,1] 上。
-1.0 0.0 0.0 0.0
0.0 -1.0 0.0 0.0
0.0 0.0 -1.2 -2.2
0.0 0.0 1.0 0.0
它是由以下内容生成的:
x = 2.0f * zNear / (xMax - xMin);
y = 2.0f * zNear / (yMax - yMin);
a = -(xMax + xMin) / (xMax - xMin);
b = -(yMax + yMin) / (yMax - yMin);
c = (zFar + zNear) / (zNear - zFar);
d = -(2.0f * zFar * zNear) / (zNear - zFar);
制作矩阵 P:
x, 0, a, 0
0, y, b, 0
0, 0, c, d
0, 0, 1, 0;
最后,我通过矩阵 = P * T 生成最终矩阵,其中 T 是平移 (0,0,-2)
我尝试在 CPU 上进行数学计算,它似乎可以生成预期结果,但是我也手动除以 w。
Update: 已解决,但需要理解
我对矩阵中的所有分量取反(乘以 -1),现在它可以工作了。
上面的示例还存在将正 z 坐标和负 z 坐标投影到投影平面上的问题,这一更改也解决了这个问题。
欢迎任何参考或解释为什么通过此更改解决了这个问题。