繁体   English   中英

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

[英]Computing texture coordinates in fragment shader (iOS/OpenGL ES 2.0)

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

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

所以是的,它们似乎是等效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM