理解GLSL内部变量gl_FragCoord

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解GLSL内部变量gl_FragCoord相关的知识,希望对你有一定的参考价值。

参考技术A 相对于vertex shader里的gl_Position和fragment shader里的gl_FragColor, 同样是glsl内部变量的gl_FragCoord就比较少见。

1、gl_FragCoord是fragment shader的输入变量,只读。
2、gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w。其中,x和y是当前片元的窗口相对坐标,不过它们不是整数,小数部分恒为0.5。x - 0.5和y - 0.5分别位于[0, windowWidth - 1]和[0, windowHeight - 1]内。windowWidth和windowHeight都以像素为单位,亦即用glViewPort指定的宽高。w即为乘过了投影矩阵之后点坐标的w,用于perspective divide的那个值。gl_FragCoord.z / gl_FragCoord.w可以得到当前片元和camera之间的距离。

任何人都知道这个 GLSL 函数会产生啥坐标?

【中文标题】任何人都知道这个 GLSL 函数会产生啥坐标?【英文标题】:Anyone knows what coordinates this GLSL function would produce?任何人都知道这个 GLSL 函数会产生什么坐标? 【发布时间】:2013-03-23 02:18:52 【问题描述】:

我正在尝试在 WPF 中使用像素着色器,我想试试这段代码:

-1.0 + 2.0 * gl_FragCoord.xy / resolution.xy

但我不确定会产生什么范围的值。我将我的图像作为过滤器应用到图像中,并且可以访问 u 和 v 值 [0-1]。当我这样做时:

-1.0 + 2.0 * U,V;

我没有得到相同的结果。我知道上面也必须是一个标准化的值范围,但不确定是 -1 到 1,还是 0 到 1,等等。

有什么想法吗?

【问题讨论】:

U,V 坐标应在 [0,1] 范围内。如果将 U 与纹理宽度相乘,将 V 与纹理高度相乘,则得到 UV 坐标指向的像素位置。 【参考方案1】: gl_FragCoord.xy / resolution.xy 为您提供范围 [0,1]。 乘以 2 得到范围 [0,2]。 减去 1 得到范围 [-1,1]

示例: http://glsl.heroku.com/e#7712.0

【讨论】:

非常感谢,不胜感激。我基本上是在尝试这种效果,但不知何故,我在某些时间值中的效果最终会部分或完全偏离屏幕(黑屏)。所以基本上图像会在几秒钟后从屏幕上移开。你知道他们是怎么做到的,所以它似乎总是绕着图像的中心移动吗?它是逐像素应用的,我也是。这是链接,径向模糊:iquilezles.org/apps/shadertoy 在没有研究过效果机制的情况下:我猜这就是三角函数的用途。尝试使用那里的代码(并使用链接中的编译按钮重新编译)以了解发生了什么。【参考方案2】:

像编译器一样通读它。 -1.0 + 2.0 减少到 1.0。然后该语句变为1.0 * glFragCoord.xy / resolution.xy1 * x = x,鉴于此,等式变为glFragCoord.xy / resolution.xy

实际上,您最终会得到 [0, 1/resolution] 的范围。

如果您的意思是等式是-1.0 + (2.0 * glFragCoord.xy / resolution.xy),那么您有 [0, 2/resolution],减法 1 变为 [-1, (2/resolution)-1]。

【讨论】:

BODMAS (acronymfinder.com/…) 也适用于编译器。而且 gl_FragCoord 的内容各不相同。在早期的 Pixelshader 版本中,它通常是屏幕尺寸,例如在 heroku 示例或 iquilezles 示例中。

以上是关于理解GLSL内部变量gl_FragCoord的主要内容,如果未能解决你的问题,请参考以下文章

gl_FragCoord 的范围是多少

WebGL-Shader入门(5.着色器语言GLSL ES 内置变量和内置函数)

转载OpenGL超级宝典笔记——GLSL语言基础

深入理解Block

如何更改内部类中的变量值[closed]

JavaScript,当变量作为参数传递时更改函数内部的变量值[重复]