我们的动态壁纸在Motorola Atrix手机上无法正常使用。它有一个版本ROM w / Android 2.3。
看起来片段着色器的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" +
"}";
答案 0 :(得分:1)
好的,所以我已经解决了这个问题。非常感谢@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" +
"}";
似乎摩托罗拉Atrix OpenGL驱动程序以错误的方式处理压缩纹理,并将 R 通道作为 A 通道进行采样,在ETC1压缩纹理的情况下始终为1.0。看起来纹理的内部格式被视为 ARGB 而不是 RGBA 。由于我的面具纹理是黑白的,我可以获取任何其他颜色。格林工作得很好。