【问题标题】:In OpenGL vertex shader, gl_Position doesn't get homogenized在 OpenGL 顶点着色器中,gl_Position 不会被同质化
【发布时间】:2011-02-09 01:15:18
【问题描述】:

我期待 gl_Position 自动得到均质化(除以 w),但它似乎不起作用..为什么以下会产生不同的结果?

1) 无效的主要(){ vec4 p; ...省略... gl_Position = 投影矩阵 * p; }

2) ...同上... p = 投影矩阵 * p; gl_Position = p / p.w;

我认为这两者应该产生相同的结果,但似乎并非如此。 1 不工作,而 2 按预期工作。这可能是精度问题吗?我错过了什么吗?这让我几乎发疯了..需要帮助。非常感谢!

【问题讨论】:

  • 截图? “不起作用”是什么意思?
  • 它没有在屏幕上显示任何内容,因为坐标没有得到均匀化,而 2 正在正确显示结果。我很快就会发布截图。谢谢!

标签: opengl graphics 3d glsl


【解决方案1】:

在裁剪之前不能进行透视分割,这发生在顶点着色器完成之后。所以没有理由可以观察到顶点着色器中的 w 分割。

GL 将在三角形光栅化之前进行透视分割,在片段着色器运行之前。

你想做什么但不起作用?

【讨论】:

  • 请注意,如果您启用了几何着色器阶段,则在 GS 之后进行透视分割。在所有情况下,它都在片段程序被调用之前完成。
  • 感谢大家的解答,我知道在顶点着色器阶段看不到均质化的结果,但问题是上面两个生成的最终结果不同。如果坐标自动均质化,它们最终应该显示相同的东西,不是吗?我会尽快发布截图,非常感谢您的回答..
  • @Kay 如果您自己进行均质化,将不会对三角形的不同属性进行透视正确插值。
【解决方案2】:

来自 GLSL 规范 1.2:

变量 gl_Position 可用 仅在顶点语言中并且是 用于编写 同质顶点位置。

所以不会自动同质化。

【讨论】:

  • 是的。我认为你的(1)应该是正确的,而另一个不应该是正确的。如果它们产生不同的结果,可能是因为 gl_Position 在均质化之前而不是之后被剪裁。也许您的对象太近/太远了?
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2016-05-04
相关资源
最近更新 更多