2012-07-26 111 views
2

我發現,在我的片段着色器,這兩個語句產生相同的輸出:計算紋理座標(的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; 

... 

} 

回答

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再次指定位置。

所以是的,他們似乎是相同的。