私はテクスチャを使用してOpenGLでビットマップを描画しています。OpenGLでRGBAビットマップテクスチャを表示するときにブレンドが正しくありません
TextureIdは、そのように生成されました:
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureIdForDrawingBitMap);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
そして、私はフレームを描画するために使用されるの下に、このコード:
//Enable blend for display a RGBA bitmap
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
GLES20.glUseProgram(ShaderHelper.programTexture);
GLES20.glEnableVertexAttribArray(ShaderHelper.a_Position_Texture);
GLES20.glEnableVertexAttribArray(ShaderHelper.a_texCoord_Texture);
GLES20.glVertexAttribPointer(ShaderHelper.a_Position_Texture, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glVertexAttribPointer(ShaderHelper.a_texCoord_Texture, 2, GLES20.GL_FLOAT, false, 0, uvBuffer);
GLES20.glUniform1f(ShaderHelper.alphaFactor_Image, alphaFactor);
GLES20.glUniformMatrix4fv(ShaderHelper.u_MVPMatrix_Texture, 1, false, mPVMatrix, 0);
GLES20.glUniform1i(ShaderHelper.u_texture_Texture, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureIdForDrawingBitMap);
//Upload bitmap to texture
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, mBitmap, 0);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, indicesBuffer);
GLES20.glDisableVertexAttribArray(ShaderHelper.a_Position_Texture);
GLES20.glDisableVertexAttribArray(ShaderHelper.a_texCoord_Texture);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
私は前に描かれた背景の上にビットマップを(描画される必要があるすべて)。オーバーレイビットマップはRGBA形式です。
ビットマップにアルファが0または255の色しか含まれていない場合、上のコードは完全に機能します(アルファ== 0の場合、ピクセルは透明、アルファ== 1、ピクセルは不透明です)。
ただし、alphaが100などの場合、ピクセルは正しく表示されません。色の16進数値が0xAAFFFFFFの場合、0xAA000000と表示されます。
私は多分blendFunctionがアルファシャネルをブレンドするだけでなく、それはまた、RGBのシャネル(アルファシャネルの値のベース)をブレンドだと思います。
この問題を解決するにはどうすればよいですか?私は、ペイントとキャンバスを使っていたのと同じように、OpenGLにオーバーレイビットマップを描画したいだけです。
=========================== UPDATEソリューション================= =======
私は
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
を使用しようとしたし、それは私の場合に動作します。アルファが0.0、1.0、またはそれらの間にあるかどうかにかかわらず、オーバーレイテクスチャを正確に描画します。唯一残っているのは、フラグメントシェーダからアルファチャンネルを変更したい場合です。結果の色は予期しないものです。この場合、私は次のように使用しました:
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
これは完全に問題を解決するものではありませんが、私にとっては問題ありません。
感謝を。私はGLES20.glBlendFunc(GLES20.GL_ONE、GLES20.GL_ONE_MINUS_SRC_ALPHA)を使用しようとしました。それは私の場合に働く。アルファが0.0、1.0、またはそれらの間にあるかどうかにかかわらず、オーバーレイテクスチャを正確に描画します。唯一残っているのは、フラグメントシェーダからアルファチャンネルを変更したい場合です。結果の色は予期しないものです。とにかく、私にとっては大丈夫です。 – Ken
これはうまくいくと思われます。これは、(s.RGB +(d.RGB *(1 - sA))のRGBカラーを返すので、ソースRGBカラーはアルファによって全く変更されません。入力テクスチャがあらかじめ乗算されて保存されているか、または(2)ソースグリフの色が黒である(したがって、スケーリングされた値が0になる) – solidpixel
これを読んだら、https://developer.nvidia.com/content/alpha -blending-pre-or-not-pre – Ken