0

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

1 回答 1

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。由于我的蒙版纹理是黑白的,我可以获取任何其他颜色。绿色工作得很好。

于 2012-08-09T20:29:19.140 回答