gl_FragCoord
表示当前片段的窗口相对坐标。但看到这个概念后也许会有点迷惑难道一直都返回相对于窗口的非归一化坐标吗?
先把结论写在前面:当然不是,是相对于当前绑定FBO的颜色附件纹理大小。
当然实践出真理,为了彻底描述清楚这个概念做了几个简单的实验。
备注:因为shader编译和传值不是本文重点所以直接上shader
首先编写两个简单
定点着色器:
attribute vec2 position;
void main() {
gl_Position = vec4(position, 0.0,1.0);
}
片元着色器:
uniform vec4 viewport;
void main()
{
gl_FragColor = vec4(vec2(gl_FragCoord.xy)/viewport.zw, 0.0, 1.0);
}
在一个720x1280的渲染窗口上直接执行viewport设为{0, 0, 720, 1280}得到如下结果:
符合预期,左下角为(0,0),右上角为(720,1280)。
创建一个小纹理验证
先创建一个(300,300)纹理并绑好fbo直接往这个纹理中渲染得到如下结果,意思就是说这里还没涉及到窗口,离屏渲染也得到左下角为(0,0)右上角为(300,300)。
如果在绘制到(300,300)的纹理上是把viewport设为(50,50,300,300)
很明显纹理左下角叫还是(0,0)点,(50,50)是(50.0/300.0,50.0/300.0)点,如果想跟viewport对齐可以稍微调整一下shader代码
gl_FragColor = vec4(vec2(gl_FragCoord.xy-viewport.xy)/viewport.zw, 0.0, 1.0);
减掉viewport的起始点即可。
希望对这个概念的理解有所帮助!