5

在顶点着色器中使用透视矩阵时,我应该编写代码来除以 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 坐标投影到投影平面上的问题,该更改也解决了该问题。

欢迎任何参考或解释为什么它通过此更改得到解决。

4

1 回答 1

5

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

如果这不起作用,您可以显示一些代码或更多地描述问题吗?我很惊讶它对你产生了影响。

于 2012-04-27T16:23:43.067 回答