5

gl_FragCoord 变量存储四个分量: (x, y, z, 1/w )

w坐标是什么,为什么存储为1/w

4

2 回答 2

12

GLSL 和 OpenGL 规范在这方面是不必要的混淆。OpenGL 规范更容易理解:gl_FragCoord存储窗口空间顶点位置的 X、Y 和 Z 分量。X、Y 和 Z 值按照计算窗口空间位置的描述进行计算(尽管像素中心和左上角原点可以修改 X 和 Y 值)。这在Coordinate Transforms规范的部分中进行了描述。

的 W 分量gl_FragCoord是 (1 / W c ),其中 W c剪辑空间顶点位置。它gl_Position.w来自您的顶点着色器。

保留 W c的唯一有用目的是进行反向转换gl_FragCoord以恢复剪辑空间位置。如该页所示,这需要乘以 W c。但由于gl_FragCoord只存储这个值的倒数,它现在需要除以gl_FragCoord.w

因此,我们可以假设 OpenGL 以这种方式存储它,因为 OpenGL 不允许有太多意义 ;) 看,OpenGL 规范的每个部分都必须有一些有点荒谬的东西。XYZ 组件太有意义了,所以他们决定让它存储你实际想要的值的倒数。

好的,从技术上讲,这是 3D Labs 创建 GLSL 时的历史产物。我确信他们这样做纯粹是出于自私的硬件原因,但我没有真正的证据。

于 2012-04-30T21:28:52.733 回答
2

齐次坐标由(x, y, z, w)给出,投影到:(x/w, y/w, z/w)gl_FragCoord存储此投影,但不是存储最后一个组件的 (无用) (w/w) = (1),而是存储(1/w),以保留有用的信息。

于 2012-04-30T21:24:39.820 回答