gl_FragCoord
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相关推荐
- gl_FragCoord 的含义
gl_FragCoord 表示当前片元着色器处理的候选片元窗口相对坐标信息,是一个 vec4 类型的变量 (x, y, z, 1/w), 其中 x, y 是当前片元的窗口坐标,OpenGL 默认以窗口 ...
- WebGL着色器内置变量gl_PointSize、gl_Position、gl_FragColor、gl_FragCoord、gl_PointCoord
WebGL着色器内置变量 WebGL中文教程网 本文是WebGL教程(电子书)的2.7节内容 着色器语言在GPU的着色器单元执行,javascript语言.C语言在CPU上执行,任何一种语言的语法规则 ...
- 关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量. gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w.其中,x和y是当前片元的窗口相对坐标 ...
- 关于gl_FragCoord的理解
关于gl_FragCoord的理解 概述 概述 记录一下在使用gl_FragCoord的一些知识点 先上shader来看效果 let shader = {vs: `void main() {gl_Po ...
- WebGL空间变换以及gl_FragCoord的运用
WebGL空间变换 局部坐标系-->世界坐标系-->相机坐标系-->剪裁坐标系-->规范化设备坐标系-->屏幕坐标系 模型变换:world.xyzw = modelMat ...
- WebGL—gl_Position gl_FragCoord gl_PointCoord 区别
gl_Position,gl_FragCoord,gl_PointCoord分别描述渲染管线中的顶点,片元,点域图元(点精灵/PointSprite)光栅化后的片元在各自坐标系中的大小:可以借助上图区 ...
- gl_FragCoord的xyzw
gl_FragCoord.xy代表屏幕的坐標,以分辨率800*600為例窗口,左下角(0,0) Windows(0,600).則gl_FragCoord.xy為vec2(0.5,0.5): 右上角(1 ...
- 有关GLSL中的gl_FragCoord
有关GLSL中的gl_FragCoord 在研究阴影映射的时候,我发现了一个很有意思的变量,它可以代替我们自己使用的varying变量,给我们带来方便.但是我们也需要了解它是如何计算的. 蒋彩阳原创文 ...
- glsl gl_FragCoord 与 屏幕关系
转载链接: http://blog.csdn.net/jinghouxiang/article/details/50751125 原创 2016年02月26日 17:06:01 标签: OpenG ...
最新文章
- html marquee
- 干货!不得不知的UI界面中“行为召唤按钮”设计秘诀
- Python3文件操作详解 Python3文件操作大全
- ModuleNotFoundError: No module named 'oscar.app'
- html中写随机数,为HTML生成一个随机数
- ul阻燃标准有几个等级_阻燃性弱电电缆种类众多 怎么样选择才合适?
- 前端html面试题及答案2019,前端面试题及答案2019-20210415034948.docx-原创力文档
- webkit内核 css,webkit内核
- Windows下安装NTP时间同步服务器
- 1030: [JSOI2007]文本生成器 ac自动机+dp
- 文件上传的几个 - 示例
- Nginx 安装 启动 停止 重启
- 函数:MySQL中取整函数round和floor
- C语言 进制转换 将十进制转换为任意进制
- Linux系统配置静态IP地址步骤
- 主播被MCN解约并判违约金60万
- Spring boot 2.0 Actuator 的健康检查
- 【Flocking算法】海王的鱼塘是怎样炼成的
- C语言计算BMI值,一看就会
- DC-DC15-150V降压5V0.8A 替代PN6005、PN6006电源驱IC