【问题标题】:In glsl, what is the formula used to compute gl_fragCoord from gl_position?在 glsl 中,从 gl_position 计算 gl_fragCoord 的公式是什么?
【发布时间】:2011-11-01 17:46:10
【问题描述】:

如果我错了,请纠正我。 当使用顶点和像素着色器时,我们通常会提供代码来计算顶点着色器的输出 gl_position。 然后,我们在像素着色器中找到输入 gl_FragCoord 的自己。 OpenGL 执行的从 gl_position 计算 gl_FragCoord 的操作的名称是什么?那些是“投影”和“剪辑坐标变换”是否正确? 那么,在这些操作期间究竟执行了哪些转换? 换句话说,gl_FragCoord 和 gl_position 之间的数学关系是什么,我可以用它来代替 openGL 函数?

非常感谢您的任何贡献。

【问题讨论】:

  • 前段时间我也遇到过同样的问题和疑问,我自己在“OpenGL: Compute eye space coord from window space coord in GLSL?”这个问题中回答了这个问题,你可以找到一个链接向右。
  • 抱歉 karx11erx,这不是我想要的。其实我觉得我想要的恰恰相反。我不想“取消投影”,我想将我的 3d 坐标投影到 2d 屏幕坐标。
  • 您也可以在那里看到如何执行此操作,因为着色器首先取消投影(从灯光视图空间),然后投影(到查看器屏幕空间)。

标签: opengl glsl shader relation


【解决方案1】:

gl_Position 位于投影后齐次坐标中。

值得注意的是,gl_Position 是 vertex 的 (4d) 位置,而 gl_FragCoord 是 片段 的 (2d) 位置。

中间发生的操作是

  1. 原始组装(例如从 3 个顶点生成三角形)
  2. 剪裁(即,如果最初不适合,则将三角形切割成多个三角形,这些三角形都位于视图内部)
  3. 视口应用
  4. 光栅化(获取这些三角形并从中生成覆盖的片段)

因此,虽然您可以找到公式来转换从作为视口的 2d 空间中的顶点位置表示的任意点,但它本身并没有那么有用,因为生成的片段不直接对齐到顶点位置。获取顶点二维坐标的公式是

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy / gl_Position.w)/2

同样,这不是 gl_FragCoord。如果您想深入了解,请查看 GL 规范中有关光栅化的详细信息。

我不确定您所说的“替换 openGL 函数”究竟是什么意思,但光栅化并非易事,而且超出了 SO 答案的范围。

【讨论】:

  • 感谢您的回答。我的目的是实现一个阴影贴图光照着色器。我通过从灯光位置渲染场景(使用灯光的“投影矩阵”)创建了深度图(阴影图),但是在渲染最终场景的顶点时,我不知道使用哪个坐标从地图中获取阴影数据.我想我可以使用灯光的“投影矩阵”来获取创建阴影贴图时的 gl_position 值,然后计算创建阴影贴图时的 gl_fragCoord 值,以获取正确位置的阴影数据。能用吗?
  • @wil:执行此操作的典型方法是将世界或视图空间位置与 gl_Position (在不同的输出中)一起传递给片段着色器。这样,在片段着色器中,正确的插值位置(在视图或世界空间中,取决于您传递的内容)可以通过矩阵转换以将其带回光空间。简短的回答是,不要依赖 gl_FragCoord,传递你需要的东西。
  • 我不确定您到底在追求什么,但这听起来不像是计算阴影贴图。这就是我所指的,听起来与你自己的东西有很大不同。我建议您打开一个新问题,了解您要解决的什么
猜你喜欢
  • 1970-01-01
  • 2018-09-21
  • 2019-06-24
  • 1970-01-01
  • 2014-07-17
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
相关资源
最近更新 更多