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に割り付けて使用するために、すべきことは、以下です。

実装

プロジェクトを開く

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.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト