在顶点着色器中使用透视矩阵时,我应该编写代码来除以 w 还是在稍后阶段自动完成?
我提出问题的原因是我看到很多顶点着色器使用:
gl_Position = matrix * pos;
如果有一个后期阶段将向量与其 w 分量相除,这是有道理的。
但是,直到我在顶点着色器中使用以下内容之前,我才让它工作:
gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;
第二个示例是正确的示例还是缺少其他设置?
换一种说法:OpenGL顶点变换(第一张图像)中显示的哪些步骤我必须在顶点着色器中编写?
我确定 ModelView 和 Projection 矩阵属于那里(或两者的合并)。视口变换不是顶点着色器的一部分,但是divide by w
呢?
我的设置是一些简单的三角形,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;
最后,我通过 matrix = P * T 生成最终矩阵,其中 T 是平移 (0,0,-2)
我试图在 CPU 上进行数学运算,它似乎可以产生预期的结果,但是我也手动进行除以 w 。
更新:已解决但需要理解
我否定了矩阵中的所有组件(乘以-1),现在它可以工作了。上面的示例还存在将正负 z 坐标投影到投影平面上的问题,该更改也解决了该问题。
欢迎任何参考或解释为什么它通过此更改得到解决。