当在顶点着色器中使用透视矩阵时,我是否应该编写代码来除以w,还是在后续阶段自动完成?
我提出这个问题的原因是我看到很多顶点着色器使用:
gl_Position = matrix * pos;
如果有一个后续阶段将向量与其w分量相除,这就是有意义的。
然而,在我的顶点着色器中使用以下代码之前,我从未使它起作用:
gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;
第二个示例是正确的吗?还是可能缺少其他设置?
换句话说:在OpenGL顶点变换(第一张图片)中显示的步骤中,我必须在顶点着色器中编写哪些步骤?
我确定ModelView和Projection矩阵属于其中之一(或两者合并)。视口变换不是顶点着色器的一部分,但除以w
呢?
我的设置是一些简单的三角形,其坐标在[-1 1]范围内的x/y/z。
透视矩阵应该将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的操作。
更新:问题已解决,但需要理解。
我否定了矩阵中的所有组件(乘以-1),现在它可以正常工作。上面的示例还有一个问题,即将正和负z坐标投影到投影平面上,这个问题也因此更改而得到解决。
欢迎提供任何参考或解释为什么可以通过此更改解决该问题。