Shader在桌面上工作但不在Android

时间:2017-07-16 13:44:37

标签: android opengl-es glsl

我一直在试图弄清楚为什么我的着色器在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;
}

我已经阅读了许多类似的问题。这些建议的答案建议添加一定的线:精确的mediump浮点数;并使用浮点而不是整数。我已经将它应用到我的代码中,但没有不同的结果。 其他答案与我的代码完全无关。我认为我的代码中的问题在于这一行:

ivec2 texSize = textureSize(u_sampler2D, 0);

当我删除这一行(以及依赖于此变量的行)时,着色器会运行,但当然不是我想要它的方式。

那么,也许有人知道获得纹理大小的不同方法?但是我也想知道导致着色器失效的原因是什么?

2 个答案:

答案 0 :(得分:0)

根据Khronos specification textureSize仅适用于OpenGL ES SL 3.00。如果你想使用它,你应该重写OpenGL ES [SL] 3格式的代码。

另外,检查着色器编译日志以查看是否存在其他错误。

答案 1 :(得分:0)

不要使用textureSize。在Vector2制服中使用相同的值。 小心使用devicePixelRatio发送另一个浮动制服。如果不这样做,具有视网膜显示的设备中的纹理将看起来是一半。