04.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でUpdateExternalTexture()を利用し使用する方法
結果としては、失敗。この方法はうまくいかなかった。
事象としては、GLエラーは発生しないが、SurfaceTextureのテクスチャの内容は、Unityのテクスチャとして描画されない。
考察としては、「Texture2D#UpdateExternalTexture関数は、『GL_TEXTURE_2Dをターゲットとする』異なるネイティブのテクスチャで、Unityのテクスチャを更新する関数であり、『GL_TEXTURE_EXTERNAL_OESをターゲットとする』異なるネイティブのテクスチャで、Unityのテクスチャを更新しても、Unityのテクスチャとして描画されない」と考えます。
解説
Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でUpdateExternalTexture()を利用し使用するために、すべきことは、以下です。
- Java側の処理として、「テクスチャを作成し、GL_TEXTURE_EXTERNAL_OESのテクスチャとしてバインドし、SurfaceTextureに割り付ける処理」を記述します。
- Java側の処理として、「作成したテクスチャのIDを返す関数」を記述します。
- Unity側の処理として、「Texture2D#UpdateExternalTexture()を利用しテクスチャを更新する処理」を記述します。
実装
プロジェクトを開く
「03.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト」を実施していない場合は、実施します。
Javaクラスの編集
Androidライブラリのプロジェクトを開きます。
「03.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト」でSurfaceの初期化の関数に加えた変更を元に戻します。
- 「テクスチャを2つ作成する処理」を削除します。
- 「GL_TEXTURE_2Dでバインド、バインド解除した後に、GL_TEXTURE_EXTERNAL_OESでバインドする処理」を削除します。
- 「GL_TEXTURE_EXTERNAL_OESでバインド、バインド解除した後に、GL_TEXTURE_2Dでバインドする処理」を削除します。
Surfaceの初期化の関数に以下の変更を加えます。
- 「テクスチャを1つ作成する処理」を追加します。「作成したテクスチャをメンバー変数として保持する処理」を追加します。
- Unityテクスチャではなく、作成したテクスチャをバインドするように、バインド処理を書き換えます。
- GL_TEXTURE_2D ではなく、GL_TEXTURE_EXTERNAL_OES をターゲットして処理するように、バインド処理とテクスチャパラメータ設定処理を書き換えます。
- Unityテクスチャではなく、作成したテクスチャを、SurfaceTextureに割り付けるように、SurfaceTexture生成処理を書き換えます。
作成したテクスチャIDを保持するクラスメンバー変数を追加します。
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アプリのプロジェクトを開きます。
イベント処理の関数に以下の変更を加えます。
- 「AndroidテクスチャIDを取得する処理」を追加します。
- 「Androidテクスチャでテクスチャを更新する処理」を追加します。
イベント処理 OnEvent関数の内容を以下のようにします。
実行
Build And Run
Unityアプリのプロジェクトを開きます。
Android端末をUSB接続しておきます。
メインメニュー「File > Build And Run」を選択します。
Unityアプリのビルドが開始し、ビルドが終了すると、Android端末上でUnityアプリが実行されます。
起動直後
アプリ画面のボタンを押します。
TextureRendererの初期化処理が実行されます。
「Android Logcat」ウィンドウを確認すると、エラーは発生していません。
アプリ画面のボタンを再度押します。
テクスチャの更新処理が実行されます。
UnityアプリのRawImageの描画に変化がありましたが、Java側でテクスチャに描画した内容ではありませんでした。
「Android Logcat」ウィンドウを確認すると、エラーは発生していません。
(赤枠が、ボタンを再度押した際のログ)
考察
Texture2D#UpdateExternalTexture関数のリファレンスによると、
「Updates Unity texture to use different native texture object.」
「異なるネイティブのテクスチャオブジェクトを使うために Unity のテクスチャを更新します。」
リファレンスには、「テクスチャをバインドするターゲット」については特に記されていない。
「Texture2D#UpdateExternalTexture関数は、『GL_TEXTURE_2Dをターゲットとする』異なるネイティブのテクスチャで、Unityのテクスチャを更新する関数であり、『GL_TEXTURE_EXTERNAL_OESをターゲットとする』異なるネイティブのテクスチャで、Unityのテクスチャを更新しても、Unityのテクスチャとして描画されない」と考えます。
関連ページ
前項目:03.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト
前項目:05.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でCreateExternalTexture()を利用し使用する方法