【问题标题】:Perspecitve divide in vertex shader?顶点着色器中的透视划分?
【发布时间】: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' 值与它们使用的值完全相反。
  • 公式是从头开始推导出来的,上面显示的矩阵是未知数。

标签: opengl opengl-3


【解决方案1】:

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

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

【讨论】:

  • 很高兴知道,然后我知道哪里不能“解决”我的问题,我添加了更多关于我的配置的示例。
  • @phq - 我对这个声明感到困惑:from z=-1 to -10 onto z=-1。你的 znear/zfar 参数是什么,你是用 gluPerspective 还是等价物生成的?裁剪是在透视分割之前完成的,所以唯一的解释可能是你的多边形在非分割示例中被裁剪,而不是当你手动分割它们时。
  • 我正在尝试使用上面的代码自己生成矩阵。 z 范围 [-1, -10] 应该映射到 [1, -1] 并且投影位置在 z=-1 处垂直于 z 轴。
  • 你不会碰巧上传矩阵转置吧?在您的示例中,“d”应该是元素 14。否则我不知道您从哪里得到这些方程式,但我建议您尝试模仿 gluPerspective 手册页上给出的方程式之类的东西,除非这是某种学术练习.
  • 是的,目标是理解,我正在使用 M*v 乘法,因此列向量应该反映在矩阵中,如果它是正确的。查看问题更新,一个小的改变使它工作。仍然不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多