【发布时间】:2012-05-08 09:53:17
【问题描述】:
在顶点着色器中使用透视矩阵时,我应该编写代码除以 w 还是在稍后阶段自动完成?
我提出问题的原因是我看到很多顶点着色器使用:
gl_Position = matrix * pos;
如果有后面的阶段将向量与其 w 分量相除,这是有道理的。
但是,直到我在顶点着色器中使用以下内容之前,我才让它工作:
gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;
第二个示例是正确的还是缺少其他设置?
换一种说法:OpenGL Vertex transformation(第一张图片)中显示的哪些步骤我必须在顶点着色器中编写?
我确定 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 坐标投影到投影平面上的问题,该更改也解决了这个问题。
欢迎提供任何参考或解释为什么通过此更改解决问题。
【问题讨论】:
-
我仍然不确定你从哪里得到这些方程,但如果我查看 gluPerspective,你的 'd' 值与它们使用的值完全相反。
-
公式是从头开始推导出来的,上面显示的矩阵是未知数。