浅谈gl_FragCoord与viewPort的关系

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}得到如下结果:

720.png

符合预期,左下角为(0,0),右上角为(720,1280)。

创建一个小纹理验证

先创建一个(300,300)纹理并绑好fbo直接往这个纹理中渲染得到如下结果,意思就是说这里还没涉及到窗口,离屏渲染也得到左下角为(0,0)右上角为(300,300)。

300.png

如果在绘制到(300,300)的纹理上是把viewport设为(50,50,300,300)

final2.png

很明显纹理左下角叫还是(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的起始点即可。

final3.png

希望对这个概念的理解有所帮助!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容