2017-07-16 96 views
0

我一直在試圖弄清楚爲什麼我的着色器在Android上不起作用,而它在桌面上。不工作,我的意思是着色器使紋理無法看到。這裏是我的片段着色器的代碼:着色器在桌面上工作,但不在Android上

precision mediump float; 

varying vec4 v_color; 
varying vec2 v_texCoord0; 
varying float randomFloat; 

uniform vec3 dif_color; 
uniform sampler2D u_sampler2D; 

vec4 color_right; 
vec4 color_left; 
vec4 color_bottom; 
vec4 color_top; 

vec3 colorNeighbors; 
float neighbors; 

void main(){ 
    vec4 color = texture2D(u_sampler2D, v_texCoord0) * v_color; 
    ivec2 texSize = textureSize(u_sampler2D, 0); 
    ivec2 texIndex = ivec2(int(v_texCoord0.x * float(texSize.x)), int(v_texCoord0.y * float(texSize.y))); 
    color_right = texelFetch(u_sampler2D, texIndex + ivec2(1, 0), 0).rgba; 
    color_left = texelFetch(u_sampler2D, texIndex + ivec2(-1, 0), 0).rgba; 
    color_top = texelFetch(u_sampler2D, texIndex + ivec2(0, 1), 0).rgba; 
    color_bottom = texelFetch(u_sampler2D, texIndex + ivec2(0, -1), 0).rgba; 

    if(color_right.a != 0){ neighbors++; } 
    if(color_left.a != 0){ neighbors++; } 
    if(color_top.a != 0){ neighbors++; } 
    if(color_bottom.a != 0){ neighbors++; } 

    vec3 colorNeighbors = (color_right.rgb + color_left.rgb + color_top.rgb + color_bottom.rgb)/neighbors; 

    if((color_right.a != 0 || color_left.a != 0 || color_top.a != 0 || color_bottom.a != 0) && color.a == 0){ 
     color.rgba = vec4(.1 + .3 * randomFloat + colorNeighbors,1.0); 
     } 
    gl_FragColor = color; 
} 

我讀過很多類似的問題。這些建議的答案是添加一個特定的行:precision mediump float;並使用浮點而不是整數。我已經將這個應用於我的代碼,但沒有不同的結果不工作。 其他答案是完全不相關的我的代碼。我想在我的代碼問題就出在這行:

ivec2 texSize = textureSize(u_sampler2D, 0); 

當我刪除此行的着色器操作(與依賴於這個變量線一起),但當然不是在路上我想它。

所以,也許有人知道一種不同的方式來獲得紋理大小?但我也想知道是什麼原因導致着色器失效?

+1

你真的不應該在同一個着色器使用'textureSize'和'texture2D'。 –

+0

嘗試像馬裏離線編譯器 - 你可以測試你的着色器編譯作爲構建過程的一部分,而不是在運行時發生故障(https://developer.arm.com/products/software-development-tools/graphics-development-tools /馬裏脫機編譯/下載) – solidpixel

回答

0

根據Khronos specificationtextureSize僅在OpenGL ES SL 3.00可用。如果你想使用它,你應該重寫OpenGL ES [SL] 3格式的代碼。

而且,看到檢查着色器編譯日誌,如果有其他錯誤。

0

請勿使用textureSize。在Vector2制服中使用相同的值。 小心再派浮統一與devicePixelRatio。如果不這樣做,具有視網膜顯示的設備的紋理將看起來爲一半尺寸。

相關問題