gl_FragCoord变量存储四个组件:(x,y,z, 1 / w )
什么是 w 坐标,为什么它存储为 1 / w ?
答案 0 :(得分:12)
GLSL和OpenGL规范在这方面不必要地混淆。 OpenGL规范更容易理解:gl_FragCoord
存储窗口空间顶点位置的X,Y和Z分量。如所描述的那样计算X,Y和Z值以计算窗口空间位置(尽管像素中心和左上原点可以修改X和Y值)。这在规范的Coordinate Transforms
部分中进行了描述。
gl_FragCoord
的W分量是(1 / W c ),其中W c 是 clip-space 顶点位置。来自顶点着色器的gl_Position.w
。
保持W c 的唯一有用目的是reverse-transform gl_FragCoord
以获得剪辑空间位置。如该页所示,需要乘以W c 。但由于gl_FragCoord
仅存储此值的倒数,因此现在需要除以gl_FragCoord.w
。
因此,我们可以假设OpenGL以这种方式存储它,因为OpenGL不允许有太多意义;)请注意,规则是OpenGL规范的每个部分都必须具有一些有点无意义的东西。 XYZ组件太有意义了,所以他们决定让它存储你想要的值的倒数。
好的,从技术上讲,这是3D Labs创建GLSL时的历史文物。我确信他们是出于纯粹自私的硬件原因而做的,但我没有真正的证据。
答案 1 :(得分:2)
齐次坐标由下式给出:(x,y,z,w),投影到:(x / w,y / w,z / w)。 gl_FragCoord
存储此投影,但不存储最后一个组件的(无用)(w / w)=(1),而是存储(1 / w),以保存有用的信息。