2016-08-17 14 views
0

私はテクスチャを使用して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); 

これは完全に問題を解決するものではありませんが、私にとっては問題ありません。

答えて

1

私は多分blendFunctionがアルファシャネルをブレンドするだけでなく、それはまた、正しいRGBシャネル(アルファシャネルの値のベース)

をブレンドだと思う、ブレンドは、4つのチャネルすべてに影響します。アルファチャンネルだけをブレンドした場合は、望む効果が得られません(フォントスプライトの色の値は、実際にフォントのグリフがどこにあるかにかかわらず、すべてのピクセルに白として書き込まれます)。

私はこの問題を解決するために何ができますか?

完全に透明または完全に不透明にする場合は、0.0(透明)または(1.0)不透明なアルファ値のみを渡します。これはすでに述べたように正常に動作します。

本当に必要な場合は、お使いのシェーダで0.0または1.0への部分的な値を丸めることができます。

https://www.khronos.org/registry/gles/extensions/OES/OES_blend_equation_separate.txt

...しかし、私は実際にそれが何をしたいとは思わない:

拡張を経て、色とアルファチャンネルごとに異なるブレンドを設定することが可能です。

+0

感謝を。私はGLES20.glBlendFunc(GLES20.GL_ONE、GLES20.GL_ONE_MINUS_SRC_ALPHA)を使用しようとしました。それは私の場合に働く。アルファが0.0、1.0、またはそれらの間にあるかどうかにかかわらず、オーバーレイテクスチャを正確に描画します。唯一残っているのは、フラグメントシェーダからアルファチャンネルを変更したい場合です。結果の色は予期しないものです。とにかく、私にとっては大丈夫です。 – Ken

+0

これはうまくいくと思われます。これは、(s.RGB +(d.RGB *(1 - sA))のRGBカラーを返すので、ソースRGBカラーはアルファによって全く変更されません。入力テクスチャがあらかじめ乗算されて保存されているか、または(2)ソースグリフの色が黒である(したがって、スケーリングされた値が0になる) – solidpixel

+0

これを読んだら、https://developer.nvidia.com/content/alpha -blending-pre-or-not-pre – Ken

1

あなたが試してみました:私は疑ってる事についてご確認の

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_COLOR); 
+0

これはうまくいきませんでした。色が予期せず混ざりましたが、ちょっと違うし、うまくいきました:) GLES20.glBlendFunc(GLES20.GL_ONE、GLES20.GL_ONE_MINUS_SRC_ALPHA); – Ken

関連する問題