在碎片着色器(iOS/OpenGL ES 2.0)中计算纹理坐标



我发现在我的碎片着色器中,这两条语句给出了相同的输出:

// #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的位置。

所以,是的,它们看起来是等价的。

最新更新