在顶点着色器中使用透视矩阵时,我应该编写代码以除以w还是在以后的阶段自动完成?

我提出这个问题的原因是,我已经看到许多使用以下方法的顶点着色器:

gl_Position = matrix * pos;

如果后面有一个阶段可以将向量及其w分量相除,那么这很有意义。

但是,直到在顶点着色器中使用以下命令,我才使它起作用:
gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;

第二个示例是正确的一个示例,还是可能缺少某些其他设置?

换句话说,我必须在顶点着色器中编写OpenGL Vertex transformation(第一张图像)中显示的哪些步骤?

我肯定知道ModelView和Projection矩阵属于该矩阵(或两者的合并)。视口(viewport)变换不是顶点着色器的一部分,但是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;

最后,我通过矩阵= P * T生成最终矩阵,其中T是一个平移(0,0,-2)

我试图在CPU上进行数学运算,它似乎可以产生预期的结果,但是我也手动执行了除以w的操作。

更新:已解决,但需要理解

我否定了矩阵中的所有成分(乘以-1),现在它可以工作了。
上面的示例还存在将正和负z坐标投影到投影平面上的问题,该问题也可以通过此更改解决。

任何引用或解释为何可以通过此更改解决。

最佳答案

您不应该在顶点着色器中进行透视划分,而是稍后在管道中自动完成。

如果这不起作用,您可以显示一些代码或进一步描述问题吗?我很惊讶它对您有所作为。

10-05 23:58