1 / w坐标在gl_FragCoord中代表什么?

时间:2012-04-30 18:59:32

标签: opengl fragment-shader

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

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

2 个答案:

答案 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),以保存有用的信息。