'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
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? –
@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. –