9

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

非常感谢您的任何贡献。

4

1 回答 1

11

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

值得注意的是 gl_Position 是一个顶点的 (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 答案的范围。

于 2011-08-23T09:05:19.507 回答