Android ETC1压缩纹理不适用于Motorola Atrix

Android ETC1压缩纹理不适用于Motorola Atrix,android,opengl-es-2.0,glsl,Android,Opengl Es 2.0,Glsl,我们的实时壁纸在摩托罗拉Atrix手机上无法正常使用。它有一个带Android 2.3的股票ROM。 碎片着色器的discard命令在没有透明部分的情况下无法生成图像。 这个问题在Desire S w/Android 2.3、Mototola Droid w/CM9、华硕Transformer w/4.0、三星Galaxy Note w/4.0上都没有出现。因此,这个问题似乎非常特定于摩托罗拉Atrix手机。 我们使用ETC1压缩纹理,因此alpha通道通过单独的纹理采样器传递给着色器-sTex

我们的实时壁纸在摩托罗拉Atrix手机上无法正常使用。它有一个带Android 2.3的股票ROM。 碎片着色器的
discard
命令在没有透明部分的情况下无法生成图像。 这个问题在Desire S w/Android 2.3、Mototola Droid w/CM9、华硕Transformer w/4.0、三星Galaxy Note w/4.0上都没有出现。因此,这个问题似乎非常特定于摩托罗拉Atrix手机。
我们使用ETC1压缩纹理,因此alpha通道通过单独的纹理采样器传递给着色器-
sTexture
用于主漫反射纹理,
sAlpha
具有黑白alpha通道

以下是片段和顶点着色器的代码:

private final String mVertexShader = "uniform highp mat4 uMVPMatrix;\n" +
        "attribute highp vec4 aPosition;\n" +
        "attribute highp vec2 aTextureCoord;\n" +
        "varying mediump vec2 vTextureCoord;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vTextureCoord = aTextureCoord;\n" +
        "}\n";

private final String mAlphaFragmentShader = "precision mediump float;\n" +
        "varying mediump vec2 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "uniform sampler2D sAlpha;\n" +
        "void main() {\n" +
        " vec4 base = texture2D(sTexture, vTextureCoord);\n" +
        " gl_FragColor = base;\n" +
        " if(texture2D(sAlpha, vTextureCoord).r < 0.5){ discard; }\n" +
        "}"; 
private final String mVertexShader=“uniform highp mat4 uMVPMatrix;\n”+
“属性highp vec4位置;\n”+
“属性highp vec2 ATEXTROCORD;\n”+
“正在更改mediump vec2 vTextureCoord;\n”+
“void main(){\n”+
“gl_Position=uMVPMatrix*aPosition;\n”+
“vTextureCoord=ATextureCord;\n”+
“}\n”;
私有最终字符串mAlphaFragmentShader=“precision mediump float;\n”+
“正在更改mediump vec2 vTextureCoord;\n”+
“均匀采样2D结构;\n”+
“统一采样器2D sAlpha;\n”+
“void main(){\n”+
vec4 base=texture2D(sTexture,vtexturecord);\n+
“gl\u FragColor=base;\n”+
if(texture2D(sAlpha,vtexturecord).r<0.5){discard;}\n+
"}"; 

好的,我已经解决了这个问题。非常感谢@Tim愿意在设备上运行测试应用程序并为我提供屏幕截图。 我用以下方式修改了片段着色器:

private final String mAlphaFragmentShader = "precision mediump float;\n" +
        "varying mediump vec2 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "uniform sampler2D sAlpha;\n" +
        "void main() {\n" +
        " vec4 base = texture2D(sTexture, vTextureCoord);\n" +
        " vec4 mask = texture2D(sAlpha, vTextureCoord);\n" +
        " gl_FragColor = base;\n" +
        " if(mask.g < 0.5){ discard; }\n" +
        "}";
private final String mAlphaFragmentShader=“precision mediump float;\n”+
“正在更改mediump vec2 vTextureCoord;\n”+
“均匀采样2D结构;\n”+
“统一采样器2D sAlpha;\n”+
“void main(){\n”+
vec4 base=texture2D(sTexture,vtexturecord);\n+
vec4 mask=texture2D(sAlpha,vtexturecord);\n+
“gl\u FragColor=base;\n”+
“如果(mask.g<0.5){discard;}\n”+
"}";

Motorola Atrix OpenGL驱动程序似乎以错误的方式对待压缩的纹理,并将采样R通道作为一个通道,在ETC1压缩纹理的情况下,该通道始终为1.0。看起来纹理的内部格式被视为ARGB而不是RGBA。因为我的面具纹理是黑白的,所以我可以得到任何其他颜色。绿色效果很好。

是否
base.a
存在,是否超过0.5?@tolgap抱歉,着色器代码错误(是旧着色器使用了单个纹理的alpha通道,ETC1纹理没有alpha,因此我已将着色器修改为使用2个纹理)。我已经编辑了这个问题-现在它有了正确的顶点和片段着色器。我在我的开发设备中使用了Atrix,我的
discard
语句工作正常。如果您尝试在If块内执行除放弃之外的其他操作,它是否有效?(比如说,将颜色设置为黄色而不是丢弃)。@Tim我没有尝试过这个,因为我无法访问手机。我只有一个客户的bug报告,我不能让她测试我的应用程序。如果这不会打扰你,我可以创建一些应用程序的测试版本并发送给你。我还可以再做一些构建,只是为了测试纹理采样的正确性,等等。我可以通过谷歌Play的电子邮件与您联系吗?(我在你的stackoverflow档案中找到了你的Google Play应用程序的链接)。我将感谢您的帮助,因为我迫切需要在Atrix上测试应用程序。@keaukraine-我允许您向我发送电子邮件。我没有运行QA部门,但我可能可以对apk进行非常有限的功能检查。如果您需要更彻底的了解,我建议您在易趣上寻找便宜的二手设备。很高兴您能够找到解决方案。我对问题的标题进行了编辑,以更准确地反映问题,从而帮助其他人解决同样的问题(ETC1)。