gl_FragCoord 变量存储四个分量:(x, y, z, 1/w)
w 坐标是什么?为什么将其存储为 1/w?
最佳答案
GLSL 和 OpenGL 规范在这方面不必要地令人困惑。 OpenGL 规范更容易理解:gl_FragCoord
存储窗口空间顶点位置的 X、Y 和 Z 分量。 X、Y 和 Z 值的计算方式与计算窗口空间位置时所描述的相同(尽管像素中心和左上角原点可以修改 X 和 Y 值)。规范的坐标变换
部分对此进行了描述。
gl_FragCoord
的 W 分量为 (1/Wc),其中 Wc 是剪辑空间 顶点位置。它是来自顶点着色器的 gl_Position.w
。
保留 Wc 的唯一有用目的是 reverse-transform gl_FragCoord
恢复剪辑空间位置。正如该页面所示,需要乘以 Wc。但由于 gl_FragCoord
仅存储该值的倒数,因此现在需要除以 gl_FragCoord.w
。
因此,我们可以假设 OpenGL 以这种方式存储它,因为 OpenGL 不允许有太多意义;)看,OpenGL 规范的每个部分都必须有一些有点无意义的东西,这是一条规则。 XYZ 组件太有意义了,因此他们决定让它存储您实际想要的值的倒数。
好吧,从技术上讲,这是 3D Labs 创建 GLSL 时代的历史工件。我确信他们这样做纯粹是出于自私的硬件原因,但我没有真正的证据证明这一点。
关于opengl - gl_FragCoord 中的 1/w 坐标代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10389040/