着色器在桌面上工作,但不在Android上

着色器在桌面上工作,但不在Android上

问题描述:

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

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

而且,看到检查着色器编译日志,如果有其他错误。

请勿使用textureSize。在Vector2制服中使用相同的值。 小心再派浮统一与devicePixelRatio。如果不这样做,具有视网膜显示的设备的纹理将看起来为一半尺寸。