顶点着色器中的透视划分?

时间:2012-04-27 16:14:03

标签: opengl opengl-3

在顶点着色器中使用透视矩阵时,我应该编写除以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坐标投影到投影平面上的问题,这也是通过这种变化解决的。

欢迎任何参考或解释为什么它会被这种变化解决。

1 个答案:

答案 0 :(得分:4)

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

如果这不起作用,您能展示一些代码还是更多地描述问题?我很惊讶它对你有所作为。