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