ETC1压缩纹理无法在Motorola Atrix上运行

时间:2012-08-03 12:00:05

标签: android opengl-es-2.0 glsl

我们的动态壁纸在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" +
        "}"; 

1 个答案:

答案 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 。由于我的面具纹理是黑白的,我可以获取任何其他颜色。格林工作得很好。