2011-10-14 31 views
11

GLSL parça gölgelendiricisinde (OpenGL ES 2.0) örnekleyici olarak NxM boyutlu bir doku geçiriyorum. Komşu dokulardan gelen texel verilerini okumak için doğru yol nedir? Parça gölgelendiricisinde "değişken" bir doku koordinatım yok. Doku bilgisini okumak için sadece parça koordinatını kullanabilirim.OpenGL ES 2.0'da, Örnekleyiciden gelen komşu metinleri nasıl okuyabilirim?

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

OFFSET değeri 1.0 VEYA NxM boyut doku için başka bir şey olmalı mı:

benim gölgelendirici Aşağıdaki ben onun aslında veri okuma emin değilim?

+0

Tam olarak burada yapmaya ne çalışıyorsunuz? – IDWMaster

+0

@IDWMaster Dediğim gibi komşu doku değerlerine ulaşmayı tahmin ediyorum. Net olmayan bir şeyin nerede olduğunu ya da sonunda neyi başarmak istediğinin önemli olduğunu bilmiyorum. –

+0

StackOverflow'a hoş geldiniz, umarım [FAQ] 'u okuyabilirsiniz (http://stackoverflow.com/faq#howtoask). –

cevap

14

Nem doku [0,1] olmalıdır koordinat o onun cevabını doğru. Ancak, gl_FragCoord değerlerinin [0, N] x [0, M] değerlerinde olduğunu unutmayın (görünümünüzün NxM olduğunu varsayarak). Bu nedenle (muhtemelen doku boyutu ile aynı olan) bir koordinat fragmanına 1 ofset ilave doğru, ama bu miktar ekran boyutu ile ayrılabilir sonra var

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 olduğu gölgelendiricide bölünmeyi önlemek için karşılıklı ekran boyutu (1/N, 1/M).

+0

Teşekkürler, şimdi çalışıyor. OpenGL ES Gölgelendirme Dili belirtiminin kendisi texture2D kullanımı konusunda çok net değildir. – kal21

+1

@ kal21 Aslında herhangi bir tanıtıcı OpenGL öğreticisi, dokulara normalleştirilmiş doku koordinatlarından [0,1] erişildiğini söylemiş olmalıydı. –

4

Öyle 1,0 ekleyerek yanlış olacaktır, OpenGL ES 2.0 tüm doku koordinatları 0.0 ile 1.0 arasında yüzer olduğuna eminim ve muhtemelen sadece aynı pozisyona etrafında kaydırılır. X ofsetiniz 1.0/N olmalı ve y ofsetiniz 1.0/M olmalıdır (NxM ifadenize göre). Bunun en iyi çözüm olduğuna emin değilim, ama benzer bir sorunu çözmek için kullandım.

Sana dokusu hakkında benim iddia biçimi doğru olduğunu koordinat doğrulamak için OpenGL ES Gölgelendirme Dili özelliklerini kontrol etmenizi tavsiye ediyorum (Ben birkaç ay önce bunu). Google ile bulmak kolay bir pdf ve bir yerde yerleşik fonksiyonların uygun bir listesini var.