0

私たちのライブ壁紙は Motorola Atrix フォンでは正しく動作しません。Android 2.3 を搭載したストック ROM を搭載しています。フラグメント シェーダのコマンドが機能しないように見えますが、discard透明部分がない結果の画像です。この問題は、Android 2.3 搭載の Desire S、CM9 搭載の Mototola Droid、4.0 搭載の ASUS Transformer、4.0 搭載の Samsung Galaxy Note では発生しません。したがって、問題は Motorola Atrix 電話に非常に固有のもののようです。
ETC1 圧縮テクスチャを使用するため、アルファ チャネルは別のテクスチャ サンプラーを介してシェーダーに渡されます。sTextureメインの拡散テクスチャに使用され、sAlpha白黒のアルファ チャネルがあります。

フラグメント シェーダーと頂点シェーダーのコードは次のとおりです。

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" +
        "}";

Motorola Atrix OpenGL ドライバは、圧縮テクスチャを間違った方法で処理し、Rチャネルを ETC1 圧縮テクスチャの場合は常に 1.0 であるAチャネルとしてサンプリングしているようです。テクスチャの内部フォーマットがRGBAではなくARGBとして扱われているようです。マスク テクスチャは白黒なので、他の色を取得できます。緑はうまく機能します。

于 2012-08-09T20:29:19.140 に答える