GLSL

2016-04-08 55 views
0

'da TexelFetch ve "Scalar Swizzle" ile ilgili sorunlar Daha önce shader'larla çalışma yaptım, ancak kendimi GLSL ile göreceli olarak deneyimsiz buluyorum. Bir dizi parça gölgelendirici kullanarak dumanı simüle eden bir sıvı çözücü yazmaya çalışıyorum. Bunların çoğu, dokulardan ayrı numuneler almayı ve ondan sonra bir miktar işlem yapmayı içerir, dolayısıyla hepsinin benzer derleme hataları vardır. Her piksel ve sadece her piksel değerlendirilmeli, bu yüzden örneklemem için texture2D'nin aksine texelFetch kullanıyorum. Aşağıdaki böyle bir parça gölgelendirici bir örnektir:GLSL

uniform sampler2D velocity; 
uniform sampler2D pressure; 
uniform sampler2D solid; 
uniform float numCellsX; 
uniform float numCellsY; 

void main(void) { 
    ivec2 pos = ivec2(gl_FragCoord.xy); 
    if (texelFetch(solid, pos.xy, 0).x > 0.0) 
     discard; 

    float c = texelFetch(pressure, pos.xy, 0).x; 
    float up = texelFetchOffset(pressure, pos.xy, 0, ivec2(0, 1)).x; 
    float down = texelFetchOffset(pressure, pos.xy, 0, ivec2(0, -1)).x; 
    float left = texelFetchOffset(pressure, pos.xy, 0, ivec2(-1, 0)).x; 
    float right = texelFetchOffset(pressure, pos.xy, 0, ivec2(1, 0)).x; 

    float upS = texelFetchOffset(solid, pos.xy, 0, ivec2(0, 1)).x; 
    float downS = texelFetchOffset(solid, pos.xy, 0, ivec2(0, -1)).x; 
    float leftS = texelFetchOffset(solid, pos.xy, 0, ivec2(-1, 0)).x; 
    float rightS = texelFetchOffset(solid, pos.xy, 0, ivec2(1, 0)).x; 

    if (upS > 0.0) up = c; 
    if (downS > 0.0) down = c; 
    if (leftS > 0.0) left = c; 
    if (rightS > 0.0) right = c; 

    gl_FragColor = texelFetch(velocity, pos.xy, 0) - vec2(0.5 * numCellsX * (right - left), 0.5 * numCellsY * (up - down)); 
} 

Ve glSlangValidator ile bu çalıştırdığınızda, ben aşağıdaki hataları alıyorum: Hemen hemen her satırda

ERROR: 0:14: 'texelFetch' : no matching overloaded function found 
ERROR: 0:14: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:17: 'texelFetch' : no matching overloaded function found 
ERROR: 0:17: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:18: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:18: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:19: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:19: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:20: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:20: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:21: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:21: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:23: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:23: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:24: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:24: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:25: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:25: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:26: 'texelFetchOffset' : no matching overloaded function found 
ERROR: 0:26: 'scalar swizzle' : not supported with this profile: es 
ERROR: 0:33: 'texelFetch' : no matching overloaded function found 
ERROR: 0:33: 'assign' : cannot convert from 'temp 2-component vector of float' 
to 'fragColor mediump 4-component vector of float FragColor' 
ERROR: 23 compilation errors. No code generated. 

yoktur hemen hemen bir hata ve Bu şeyler hakkında internette çok az bilgi buldum. Benim texelFetch aramaları kabul etmiyor Oldukça neden anlamıyorum

gvec4 texelFetch(gsampler2D sampler, ivec2 P, int lod); 

: GLSL referans kılavuzuna Başına. Ayrıca ne scalar swizzle olduğunu (bunu online ortamda bulamıyor) ya da neden bir sorun olduğunu bilmiyorum. Bu profil ile desteklenmez

cevap

0

:

Belki (muhtemelen 2.0) yerine GLSL ES'nin, GLSL masaüstü sürümünde ile derlemek gerekir es. GLSL gölgelendiricilerinizde her zaman bir #version beyanı kullanmalısınız.

Ayrıca, texelFetch kullanıyorsanız, neden hala gl_FragColor gibi kullanım dışı çıktılara yazıyorsunuz?

Ancak:

bakılmaksızın bu hat için versiyonunun doğrudur 'sıcaklığına 2 bileşenli şamandıranın vektör'

gelen dönüştürülemiyor:

texelFetch(velocity, pos.xy, 0) - vec2(0.5 * numCellsX * (right - left), 0.5 * numCellsY * (up - down)) 

texelFetch döndüren bir 4 elementli vektör. Bir 2 eleman vektörünü 4 elemanlı bir vektörden çıkaramazsınız.

+0

Sanırım bahsetmeliydim, WebGL'yi hedefliyorum, böylece ES'nin doğru seçim olduğunu varsaydım. WebGL texelFetch'i desteklemiyor mu? Ve değilse, normalleştirilmiş doku koordinatlarındaki her bir pikselin merkezinin konumunu nasıl alabilirim? –

+0

@JoshuaDotson: "* WebGL, texelFetch'i desteklemiyor mu? *" WebGL, OpenGL ES 2.0'a dayanmaktadır ve bu, ana bilgisayarda, masaüstünde GL 2.1'e dayanmaktadır. "texelFetch" masaüstü GL sürüm 3.0'a kadar sunulmadı. Diğer sorunuza gelince, en uygun soru olarak sorulur. Muhtemelen önce araman gerekse de, daha önce cevaplandığından eminim. –