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

M-V*_*M-V 2 opengl-es ios

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

// #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;
Run Code Online (Sandbox Code Playgroud)

如果这是正确的,你能解释一下数学吗?我理解#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;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器的相关部分:

// 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;

...

}
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 5

(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.

所以是的,它们似乎是等价的.