gl_FragCoord 表示当前片元着色器处理的候选片元窗口相对坐标信息,是一个 vec4 类型的变量 (x, y, z, 1/w), 其中 x, y 是当前片元的窗口坐标,OpenGL 默认以窗口左下角为原点, 在 着色器中通过布局限定符可以重新设定原点,比如窗口左上角为原点 origin_upper_left,窗口大小由 glViewport() 函数指定。x, y 默认是像素中心 而非 整数, 原点 的窗口坐标值为 (0.5, 0.5), 小数部分恒为 0.5, 当viewport 范围 为(0,0,800,600)时, x, y 的取值范围为(0.5, 0.5, 799.5, 599.5), 当在着色器中布局限定符设置为 pixel_center_integer 时, x, y 取值为整数。

第三个分量 z 表示的是当前片元的深度信息,由 vertex shader 处理过后系统插值得到, gl_FragCoord.z 的产生过程:

假设 OpenGL 变换的各坐标系统定义如下: world.xyzw 表示 世界坐标系的坐标, eye.xyzw 表示眼坐标系(也叫观察坐标系,还有叫相机坐标系,呃。。。) 的坐标, clip.xyzw 表示 裁剪坐标系的坐标 , ndc.xyzw 表示 规范化设备坐标系坐标, win.xyzw 表示 窗口坐标系坐标, OpenGL 一个完整的空间变换流水线如下:

world coordinate system --> eye coordinate system --> clip coordinate system --> normalized device coordinate system --> window device coordinate system。

gl_FragCoord.z 生成过程:

(1)世界坐标系内的坐标乘以观察矩阵变换到眼坐标空间 eye.xyzw = viewMatrix * world.xyzw;

(2)眼坐标系内的坐标通过乘上投影矩阵变换到裁剪空间 clip.xyzw = projectMatrix * eye.xyzw;

(3)裁剪坐标系内的坐标通过透视除法(也就是 w 为 1 化) 到 规范化设备坐标系 ndc.xyz = clip.xyz / clip.w;

(4)设备规范化坐标系到窗口坐标系 win.z = (dfar - dnear)/2 * ndc.z + (dfar+dnear)/2;

可以看出 gl_FragCoord.z 是 win.z 。dnear ,dfar 是由 glDepthRange(dnear, dfar) 给定的,按openGL 默认值 (0,1) , win.z = ndc.z/2 + 0.5。

有时候我们需要在 shader 内反算 眼坐标系 或 世界坐标系 内的坐标, 这在后处理或延迟着色中很有用,不需要另外使用颜色缓存保留物体位置信息,减少带宽占用。反算窗口空间内的片元的空间坐标:

ndc.xyzw = ( gl_FragCoord.xy/viewport.wh * 2.0 - 1.0, gl_FragCoord.z * 2.0 - 1.0, 1.0 );

这样我们只需向shader 中传入 矩阵信息 , 就可以获得该片元在指定空间内的坐标 ,例如

eye.xyzw = projectionMatrixInverse * ndc.xyzw;
world.xyzw = modelViewProjectionMatrixInverse * ndc.xyzw
注意最终结果要除以 w 分量, eye.xyz = eye.xyz/eye.w;

第四个分量 gl_FragCoord.w

gl_FragCoord相关推荐

  1. gl_FragCoord 的含义

    gl_FragCoord 表示当前片元着色器处理的候选片元窗口相对坐标信息,是一个 vec4 类型的变量 (x, y, z, 1/w), 其中 x, y 是当前片元的窗口坐标,OpenGL 默认以窗口 ...

  2. WebGL着色器内置变量gl_PointSize、gl_Position、gl_FragColor、gl_FragCoord、gl_PointCoord

    WebGL着色器内置变量 WebGL中文教程网 本文是WebGL教程(电子书)的2.7节内容 着色器语言在GPU的着色器单元执行,javascript语言.C语言在CPU上执行,任何一种语言的语法规则 ...

  3. 关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算

    gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量. gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w.其中,x和y是当前片元的窗口相对坐标 ...

  4. 关于gl_FragCoord的理解

    关于gl_FragCoord的理解 概述 概述 记录一下在使用gl_FragCoord的一些知识点 先上shader来看效果 let shader = {vs: `void main() {gl_Po ...

  5. WebGL空间变换以及gl_FragCoord的运用

    WebGL空间变换 局部坐标系-->世界坐标系-->相机坐标系-->剪裁坐标系-->规范化设备坐标系-->屏幕坐标系 模型变换:world.xyzw = modelMat ...

  6. WebGL—gl_Position gl_FragCoord gl_PointCoord 区别

    gl_Position,gl_FragCoord,gl_PointCoord分别描述渲染管线中的顶点,片元,点域图元(点精灵/PointSprite)光栅化后的片元在各自坐标系中的大小:可以借助上图区 ...

  7. gl_FragCoord的xyzw

    gl_FragCoord.xy代表屏幕的坐標,以分辨率800*600為例窗口,左下角(0,0) Windows(0,600).則gl_FragCoord.xy為vec2(0.5,0.5): 右上角(1 ...

  8. 有关GLSL中的gl_FragCoord

    有关GLSL中的gl_FragCoord 在研究阴影映射的时候,我发现了一个很有意思的变量,它可以代替我们自己使用的varying变量,给我们带来方便.但是我们也需要了解它是如何计算的. 蒋彩阳原创文 ...

  9. glsl gl_FragCoord 与 屏幕关系

    转载链接:  http://blog.csdn.net/jinghouxiang/article/details/50751125 原创  2016年02月26日 17:06:01 标签: OpenG ...

最新文章

  1. html marquee
  2. 干货!不得不知的UI界面中“行为召唤按钮”设计秘诀
  3. Python3文件操作详解 Python3文件操作大全
  4. ModuleNotFoundError: No module named 'oscar.app'
  5. html中写随机数,为HTML生成一个随机数
  6. ul阻燃标准有几个等级_阻燃性弱电电缆种类众多 怎么样选择才合适?
  7. 前端html面试题及答案2019,前端面试题及答案2019-20210415034948.docx-原创力文档
  8. webkit内核 css,webkit内核
  9. Windows下安装NTP时间同步服务器
  10. 1030: [JSOI2007]文本生成器 ac自动机+dp
  11. 文件上传的几个 - 示例
  12. Nginx 安装 启动 停止 重启
  13. 函数:MySQL中取整函数round和floor
  14. C语言 进制转换 将十进制转换为任意进制
  15. Linux系统配置静态IP地址步骤
  16. 主播被MCN解约并判违约金60万
  17. Spring boot 2.0 Actuator 的健康检查
  18. 【Flocking算法】海王的鱼塘是怎样炼成的
  19. C语言计算BMI值,一看就会
  20. DC-DC15-150V降压5V0.8A 替代PN6005、PN6006电源驱IC

热门文章

  1. 内网使用openssl自签名证书开启https连接,同时解决chrome浏览器中的不安全访问
  2. 编码(RZ NRZ NRZI)
  3. 何时能在无线城市生活
  4. 第三方应用接入企业微信
  5. 物联网、大数据和人工智能,为什么总是“抱团出现”?
  6. maltose-Transferrin 麦芽糖-转铁蛋白
  7. 计算机主机硬件详细介绍,计算机硬件的简介
  8. 微服务,链路追踪,opentracing+jaeger(六)
  9. Windows组策略屏蔽U盘
  10. (1)面向对象开发_java石头剪刀布小游戏大厅之电脑玩家-初学