在顶点着色器中使用透视矩阵时,我应该编写除以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
?
我的设置是一些简单的三角形,坐标在[-1 1]范围内,适用于x / y / z。
Perspective矩阵应该将坐标从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坐标投影到投影平面上的问题,这也是通过这种变化解决的。
欢迎任何参考或解释为什么它会被这种变化解决。
答案 0 :(得分:4)
你不应该在顶点着色器中进行透视划分,它将在管道中稍后自动完成。
如果这不起作用,您能展示一些代码还是更多地描述问题?我很惊讶它对你有所作为。