【问题标题】:Shader working on desktop but not on Android着色器可以在桌面上工作,但不能在 Android 上工作
【发布时间】:2017-07-17 22:47:27
【问题描述】:

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

当我删除这条线(连同依赖于这个变量的线)时,着色器会运行,但当然不是我想要的方式。

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

【问题讨论】:

标签: android opengl-es glsl


【解决方案1】:

根据Khronos specificationtextureSize 仅在 OpenGL ES SL 3.00 中可用。如果你想使用它,你应该为 OpenGL ES [SL] 3 格式重写你的代码。

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

【讨论】:

    【解决方案2】:

    不要使用纹理大小。在 Vector2 制服中使用相同的值。 小心发送另一个带有 devicePixelRatio 的浮点制服。如果不这样做,带有视网膜显示屏的设备中的纹理将显示为一半大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2018-07-18
      • 2015-06-06
      相关资源
      最近更新 更多