我发现在我的碎片着色器中,这两条语句给出了相同的输出:
// #1
// pos is set from gl_Position in vertex shader
highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0;
// #2 - equivalent?
highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;
如果这是正确的,你能解释一下数学吗?我理解#2,这是我想到的,但在一篇论文中看到了#1。这是NDC(标准化设备坐标)计算吗?
上下文是,我使用的纹理坐标具有与视口大小相同的FBO。这一切都有效,但我想了解一下数学。
顶点着色器的相关部分:
attribute vec4 position;
uniform mat4 modelViewProjectionMatrix;
varying lowp vec4 vColor;
// transformed position
varying highp vec4 pos;
void main()
{
gl_Position = modelViewProjectionMatrix * position;
// for fragment shader
pos = gl_Position;
vColor = aColor;
}
碎片着色器的相关部分:
// transformed position - from vsh
varying highp vec4 pos;
// viewport dimensions
uniform highp vec2 uWinDims;
void main()
{
highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0;
// equivalent?
highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;
...
}
(pos.xy / pos.w)
是标准化设备坐标(NDC)中的坐标值。该值在每个维度中的范围为-1到1。
(NDC + 1.0)/2.0
将范围从(-1 to 1)
更改为(0 to 1)
(屏幕左侧为0,右侧为1,类似于顶部/底部)。
或者,gl_FragCoord以像素为单位给出坐标,因此其范围从(0 to width)
到(0 to height)
。
将该值除以宽度和高度(uWinDims),可以再次得到从屏幕左侧的0到右侧的1的位置。
所以,是的,它们看起来是等价的。