我们的动态壁纸在摩托罗拉 Atrix 手机上无法正常工作。它有一个带有 Android 2.3 的股票 ROM。看起来discard
片段着色器的命令在没有透明部分的情况下无法正常工作。该问题未出现在 Desire S w/Android 2.3、Mototola Droid w/CM9、ASUS 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" +
"}";