2011-10-14 71 views
11

我在GLSL片段着色器(OpenGL ES 2.0)中傳遞一個NxM大小的紋理作爲採樣器。從相鄰紋理中讀取紋理數據的正確方法是什麼?我在片段着色器中沒有「變化」的紋理座標。我只能使用片段座標來讀取紋理信息。以下在OpenGL ES 2.0中,如何從採樣器中讀取相鄰紋理元素?

是我的着色器,我不知道,如果它的實際讀取數據:

precision mediump float; 

uniform sampler2D Sampler; 

#define OFFSET 1.0 

void main() 
{ 

    vec2 T = gl_FragCoord.xy; 

    //Find neighboring velocities: 
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+OFFSET)).xy; 
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-OFFSET)).xy; 
    vec2 E = texture2D(Sampler,vec2(T.x+OFFSET,T.y)).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-OFFSET,T.y)).xy; 
} 

是偏移值應爲1.0或爲N×M的大小質地別的東西嗎?

+0

你究竟想在這裏做什麼? – IDWMaster

+0

@IDWMaster我猜想訪問相鄰的texel值,就像他說的。我不知道哪裏有什麼不清楚的地方,或者最重要的是他到底想要達到什麼目的。 –

+0

歡迎來到StackOverflow,我希望你閱讀[FAQ](http://stackoverflow.com/faq#howtoask)。 –

回答

14

Nem在他的答案中是正確的,紋理座標應該在[0,1]中。但請記住,gl_FragCoord的值是[0,N] x [0,M](假設您的視口也是NxM)。那麼,你是在添加座標1偏移到片段正確的,但是這部分的總和,然後通過屏幕大小可分爲(這可能是一樣的紋理尺寸):

precision mediump float; 

uniform sampler2D Sampler; 
uniform vec2 invScreenSize; 

void main() 
{ 

    vec2 T = gl_FragCoord.xy; 

    //Find neighboring velocities: 
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+1.0)*invScreenSize).xy; 
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-1.0)*invScreenSize).xy; 
    vec2 E = texture2D(Sampler,vec2(T.x+1.0,T.y)*invScreenSize).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-1.0,T.y)*invScreenSize).xy; 
} 

其中invScreenSize是相互屏幕尺寸(1/N, 1/M),以防止着色器中的分割。

+0

謝謝你們,它現在有效。 OpenGL ES着色語言規範本身在texture2D的使用上並不是很清晰。 – kal21

+1

@ kal21事實上,任何介紹性的OpenGL教程都應該告訴你紋理是通過[0,1]中的規範化紋理座標來訪問的。 –

4

我很確定,在OpenGL ES 2.0中,所有紋理座標都是0.0到1.0之間的浮點數,所以加1.0將是錯誤的,並且可能只是迴繞到完全相同的位置。你的x偏移應該是1.0/N,你的y偏移應該是1.0/M(根據你的NxM語句)。我不相信這是最好的解決方案,但我已經用它來解決類似的問題。

我建議您檢查OpenGL ES着色語言規範,以驗證我關於紋理座標格式的聲明是否正確(我在幾個月前完成了此操作)。這是一個很容易找到谷歌的pdf,並有一個方便的列表中的所有內置函數的地方。