02.Unity側で作成したテクスチャを、Java側でGL_TEXTURE_2DのテクスチャとしてSurfaceTextureに割り付けて使用する方法
結果としては、失敗。この方法はうまくいかなかった。
事象としては、glBindTexture() でのエラーは発生しないが、SurfaceTexture#updateTexImage() でエラーが発生する。
考察としては、「SurfaceTextureに割り付けできるテクスチャは、GL_TEXTURE_EXTERNAL_OESをターゲットしてバインドできるテクスチャである必要がある。そのため、SurfaceTextureに、Unityで作成したGL_TEXTURE_2Dをターゲットとするテクスチャを、割り付けたとしても、SurfaceTexture#updateTexImage()
でエラーが発生する」と考える。
解説
Unity側で作成したテクスチャを、Java側でGL_TEXTURE_2DのテクスチャとしてSurfaceTextureに割り付けて使用するために、すべきことは、以下です。
- Java側の処理として、「Unity側で作成したテクスチャを、GL_TEXTURE_2Dのテクスチャとしてバインドし、SurfaceTextureに割り付ける処理」を記述します。
実装
プロジェクトを開く
「01.Unity側で作成したテクスチャを、Java側でGL_TEXTURE_EXTERNAL_OESのテクスチャとしてSurfaceTextureに割り付けて使用する方法」を実施していない場合は、実施します。
Javaクラスの編集
Androidライブラリのプロジェクトを開きます。
Surfaceの初期化の関数における、
「Unity側で作成したテクスチャを、GL_TEXTURE_EXTERNAL_OESのテクスチャとしてバインドし、SurfaceTextureに割り付ける処理」を
「Unity側で作成したテクスチャを、GL_TEXTURE_2Dのテクスチャとしてバインドし、SurfaceTextureに割り付ける処理」に書き換えます。
Surfaceの初期化 initSurface関数の内容を以下のようにします。
Androidライブラリモジュールのビルド
Androidライブラリモジュールをビルドします。
「Gradle」ウィンドウの「SurfaceTextureRendererProject > surfacetexturerenderer
> Tasks > build > build」をダブルクリックします。
モジュールのビルドが開始します。
しばらく待ちます。
Android Studio のステータスバーに「Gradle build finished in ・・・」と出るまで待ちます。
「{Androidプロジェクトフォルダ}\{Androidライブラリモジュール名}\build\outputs\aar」フォルダに、リリースビルド、デバッグビルドの2つの「aar」ファイルが生成されます。
aarファイルの配置
Androidライブラリモジュールのファイル(aarファイル)を、Unityアプリのプロジェクトに配置します。
「{Unityプロジェクトフォルダ}\Assets\Plugins\Android」フォルダに、
「{Androidプロジェクトフォルダ}\{Androidライブラリモジュール名}\build\outputs\aar」フォルダに生成済みの「aar」ファイルのリリースビルドの方を、コピ-します。
Unityスクリプトの編集
Unityアプリ側の変更はありません。
実行
Build And Run
Unityアプリのプロジェクトを開きます。
Android端末をUSB接続しておきます。
メインメニュー「File > Build And Run」を選択します。
Unityアプリのビルドが開始し、ビルドが終了すると、Android端末上でUnityアプリが実行されます。
起動直後
アプリ画面のボタンを押します。
TextureRendererの初期化処理が実行されます。
「Android Logcat」ウィンドウを確認すると、「01.Unity側で作成したテクスチャを、Java側でGL_TEXTURE_EXTERNAL_OESのテクスチャとしてSurfaceTextureに割り付けて使用する方法」で発生していた glBindTexture() でのエラーは発生していません。
アプリ画面のボタンを再度押します。
テクスチャの更新処理が実行されます。
UnityアプリのRawImageの描画に変化はありませんでした。
「Android Logcat」ウィンドウを確認すると、SurfaceTexture#updateTexImage() で、エラーが発生しています。
考察
SurfaceTextureクラスのリファレンスによると、
「Each time the texture is bound it must be bound to the GL_TEXTURE_EXTERNAL_OES
target rather than the GL_TEXTURE_2D target.」
「SurfaceTextureに割り付けできるテクスチャは、GL_TEXTURE_EXTERNAL_OESをターゲットしてバインドできるテクスチャである必要がある。そのため、SurfaceTextureに、Unityで作成したGL_TEXTURE_2Dをターゲットとするテクスチャを、割り付けたとしても、SurfaceTexture#updateTexImage()
でエラーが発生する」と考える。
関連ページ
前項目:01.Unity側で作成したテクスチャを、Java側でGL_TEXTURE_EXTERNAL_OESのテクスチャとしてSurfaceTextureに割り付けて使用する方法
前項目:03.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト