gl_FragCoord 变量存储四个分量: (x, y, z, 1/w )
w坐标是什么,为什么存储为1/w?
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 时的历史产物。我确信他们这样做纯粹是出于自私的硬件原因,但我没有真正的证据。
齐次坐标由(x, y, z, w)给出,投影到:(x/w, y/w, z/w)。gl_FragCoord
存储此投影,但不是存储最后一个组件的 (无用) (w/w) = (1),而是存储(1/w),以保留有用的信息。