AndroidStudioを使ってOpenGL es2.0 をjniで使用していたときに
テクスチャをjavaからbitmapでpixelを取得し表示していたときに子一時間ほど
画像の透明部分が出なくてはまったので解決法を書き残します(以下の解決法が全ての場合に当てはまるとは
限りませんのでご勘弁を)
テクスチャをjavaからbitmapでpixelを取得し表示していたときに子一時間ほど
画像の透明部分が出なくてはまったので解決法を書き残します(以下の解決法が全ての場合に当てはまるとは
限りませんのでご勘弁を)
以下の記事より
参考記事http://blog.fujiu.jp/2011/08/android-android-ndk.html
アンドロイドのdrawbleから画像のデータを取得してテクスチャを作成しようとしたときに
画像は表示できたのですが,透明の部分が黒で表示されていました
環境
AndroidStudio 1.5
android 4.4.2 API19
ZTE Blade v4

↑黒の部分は本来透過しているべきところ
surfaceviewでもgifを使ったときに同様の現象が発生したのですがそのときはpngを代用することで事なきを
得たのですが今回はGLsurfaceviewでpngでこのようになったのでopenGL である命令を行うことで透明にすることができます

上記で以下でで書いたところが重要で
参考記事http://blog.fujiu.jp/2011/08/android-android-ndk.html
アンドロイドのdrawbleから画像のデータを取得してテクスチャを作成しようとしたときに
画像は表示できたのですが,透明の部分が黒で表示されていました
環境
AndroidStudio 1.5
android 4.4.2 API19
ZTE Blade v4

↑黒の部分は本来透過しているべきところ
surfaceviewでもgifを使ったときに同様の現象が発生したのですがそのときはpngを代用することで事なきを
得たのですが今回はGLsurfaceviewでpngでこのようになったのでopenGL である命令を行うことで透明にすることができます

//描画を行うmethod void drawTexturef(){ //LOGI("drawTexture"); glUseProgram(gTextureProgram); glEnableVertexAttribArray(gvTextureAttrPos); glEnableVertexAttribArray(gvTextureAttrUV); glUniform1i(unif_texture,0); const GLfloat uv[] ={ 0,0, 0,1, 1,0, 1,1 }; glVertexAttribPointer(gvTextureAttrPos,2,GL_FLOAT,GL_FALSE,0,(GLvoid*)rect); glVertexAttribPointer(gvTextureAttrUV,2,GL_FLOAT,GL_FALSE,0,(GLvoid *)uv); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glDrawArrays(GL_TRIANGLE_STRIP,0,4); glDisable(GL_BLEND); }
上記で以下でで書いたところが重要で
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
では透過処理(正式にはアルファブレンドというらしい)でテクスチャの画像の下の部分とテクスチャを合成する
という作業を行います。つまりopenglはデフォルトでは透過を行ってくれないということです。
この合成の作業をブレンドといいこの時点ではまだ適用されていません
glEnable(GL_BLEND);
でブレンドを適用することによって透過処理が行われるようになります
描画後は
glDisable(GL_BLEND);
では透過処理(正式にはアルファブレンドというらしい)でテクスチャの画像の下の部分とテクスチャを合成する
という作業を行います。つまりopenglはデフォルトでは透過を行ってくれないということです。
この合成の作業をブレンドといいこの時点ではまだ適用されていません
glEnable(GL_BLEND);
でブレンドを適用することによって透過処理が行われるようになります
描画後は
glDisable(GL_BLEND);
でブレンドを終了しておきほかの処理に影響が及ばないようにしています
glBlendFuncにはアルファブレンド以外にも画像処理で加算減算処理などもできるようです
参考記事
OpenGLの画像合成時のブレンドモードよく使うもの抜粋
Texture with transparent areas renders the areas as black - how do I make them transparent?
OpenGL ES 2.0 PNG alpha channel
入門 Python 3glBlendFuncにはアルファブレンド以外にも画像処理で加算減算処理などもできるようです
参考記事
OpenGLの画像合成時のブレンドモードよく使うもの抜粋
Texture with transparent areas renders the areas as black - how do I make them transparent?
OpenGL ES 2.0 PNG alpha channel
コメント