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

Fab*_*ian 5 opengl fragment-shader

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

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

Nic*_*las 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时的历史文物.我确信他们是出于纯粹自私的硬件原因,但我没有真正的证据.