3

2D ゲームのクワッド スプライトのテクスチャとして使用している .png ファイルがいくつかあります。

これらの一部にはすでに部分的に透明なピクセルが含まれており、それらを正しく表示してフェードイン/フェードアウトできるようにする必要があります。

最初は、次のブレンド モードで描画していました。

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

これは、最初はソリッドなテクスチャでうまく機能し、1.0f から 0.0f の間の任意の値を使用して透明度を導入できます。これまでのところはうまくいっていますが、すでに透明になっている png を使用しようとすると、正しく表示されません (暗すぎて輪郭が暗い)。

私は多くの調査を行い、上記のテクスチャが適切に機能しないため、これらのタイプのテクスチャのブレンド モードを変更する必要があることがわかりました。 ..

フラグメントシェーダー

String strFShader =
"precision mediump float;" +
"varying vec2 v_texCoords;" +
"uniform sampler2D u_baseMap;" +
"void main()" +
"{" +
"gl_FragColor = texture2D(u_baseMap, v_texCoords);" +
"gl_FragColor.a *= "+1.0f+";"+  //** Where 1.0f is the amount to blend, with 0.0f being completely transparent and 1.0f being as per the original png file.
 "}";

コード

GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

GLES20.glDisable(GLES20.GL_BLEND);

シェーダーで 1.0f の値でこれを使用して半透明のテクスチャを描画すると (上記のように)、うまく描画されます。ただし、次にフェード アウトしようとすると、0.0f のときにフェード アウトする色とフェード アウトしない色があり、元のテクスチャの奇妙な色のバージョンが残ります。

これらのタイプのテクスチャを正しくレンダリングする方法を誰かが教えてくれたらありがたいです。

ありがとう

4

2 に答える 2

1

最終的に画像を乗算前の画像に変換する必要はありませんでした。単純にその形式のままにして、シェーダーの行を次のように変更しました。

"gl_FragColor *= "+op+";"+

そして中古……。

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

完璧に動作します。

于 2013-04-10T18:53:56.137 に答える