06.Java側で作成したGL_Texture_2Dのテクスチャを、Unity側で扱うことができることの確認
結果としては、以下の事象を確認した。
・CreateExternalTexture関数を用いて、Java側で作成したGL_TEXTURE_2Dのテクスチャから、Unityのテクスチャを作成すると、Java側で作成したテクスチャがUnityテクスチャとして描画される。
・UpdateExternalTexture関数を用いて、Java側で作成したGL_TEXTURE_2Dのテクスチャで、Unityのテクスチャを更新すると、Java側で作成したテクスチャがUnityテクスチャとして描画される。
解説
以下の処理を行い、Unityテクスチャとして描画されるかどうかを確認する。
- Java側の処理として、GL_TEXTURE_2Dをターゲットとするテクスチャを作成し、テクスチャに着色する。
Unity側の処理として、CreateExternalTexture関数を用いて、Java側で作成したテクスチャから、Unityテクスチャを作成する。作成したUnityテクスチャをRawImageのテクスチャに設定する。 - Java側の処理として、GL_TEXTURE_2Dをターゲットとするテクスチャを作成し、テクスチャに着色する。
Unity側の処理として、UpdateExternalTexture関数を用いて、Java側で作成したテクスチャで、Unityテクスチャを更新する。
実装:CreateExternalTexture()利用版
まず、CreateExternalTexture関数を利用した場合の動作を確認します。
(本項の後半で、UpdateExternalTexture関数を利用した場合の動作を確認します。)
プロジェクトを開く
「05.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でCreateExternalTexture()を利用し使用する方法」を実施していない場合は、実施します。
Javaクラスの編集
Androidライブラリのプロジェクトを開きます。
Surfaceの初期化の関数に以下の変更を加えます。
- 「Java側で作成したテクスチャを、GL_TEXTURE_2Dでバインドする処理」を追加します。
- 「GL_TEXTURE_2D をターゲットとしたテクスチャパラメータ設定処理」を追加します。
- 「テクスチャを4つの領域4つの色に塗り潰す処理」を追加します。
- 「GL_TEXTURE_EXTERNAL_OESをターゲットとしたバインド処理、テクスチャパラメータ設定処理、SurfaceTextureとSurfaceの作成処理」を、コメントアウトします。
Surfaceの初期化 initSurface関数の内容を以下のようにします。
SurfaceTextureとSurfaceについての処理が実行されないように、Surfaceでの描画の関数内の処理をすべてコメントアウトします。
Surfaceの描画 drawInSurface関数の内容を以下のようにします。
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アプリ側の変更はありません。
実行:CreateExternalTexture()利用版
Build And Run
Unityアプリのプロジェクトを開きます。
Android端末をUSB接続しておきます。
メインメニュー「File > Build And Run」を選択します。
Unityアプリのビルドが開始し、ビルドが終了すると、Android端末上でUnityアプリが実行されます。
起動直後
アプリ画面のボタンを押します。
TextureRendererの初期化処理が実行されます。
UnityアプリのRawImageの描画に変化があり、Java側でテクスチャに着色した内容で描画されました。
「Android Logcat」ウィンドウを確認すると、エラーは発生していません。
実装:UpateExternalTexture()利用版
続いて、UpdateExternalTexture関数を利用した場合の動作を確認します。
Javaクラスの編集
Androidライブラリ側の変更はありません。
Unityスクリプトの編集
Unityアプリのプロジェクトを開きます。
CreateExternalTexture関数に関連した処理を削除します。
TextureRendererの初期化の関数に以下の変更を加えます。
- 「AndroidテクスチャIDを取得する処理」を削除します。
- 「Texture2D#CreateExternalTexture()を利用してテクスチャを作成する処理」を削除します。
- 「作成したテクスチャをRawImageのテクスチャとして設定する処理」を削除します。
TextureRendererの初期化 InitializeTextureRenderer()関数の内容を以下のようにします。
UpdateExternalTexture関数に関連した処理を追加します。
イベント処理の関数に以下の変更を加えます。
- 「AndroidテクスチャIDを取得する処理」を追加します。
- 「Androidテクスチャでテクスチャを更新する処理」を追加します。
イベント処理 OnEvent関数の内容を以下のようにします。
実行:UpateExternalTexture()利用版
Build And Run
Unityアプリのプロジェクトを開きます。
Android端末をUSB接続しておきます。
メインメニュー「File > Build And Run」を選択します。
Unityアプリのビルドが開始し、ビルドが終了すると、Android端末上でUnityアプリが実行されます。
起動直後
アプリ画面のボタンを押します。
TextureRendererの初期化処理が実行されます。
アプリ画面のボタンを再度押します。
テクスチャの更新処理が実行されます。
UnityアプリのRawImageの描画に変化があり、Java側でテクスチャに着色した内容で描画されました。
「Android Logcat」ウィンドウを確認すると、エラーは発生していません。
考察
結果としては、以下の事象を確認した。
・CreateExternalTexture関数を用いて、Java側で作成したGL_TEXTURE_2Dのテクスチャから、Unityのテクスチャを作成すると、Java側で作成したテクスチャがUnityテクスチャとして描画される。
・UpdateExternalTexture関数を用いて、Java側で作成したGL_TEXTURE_2Dのテクスチャで、Unityのテクスチャを更新すると、Java側で作成したテクスチャがUnityテクスチャとして描画される。
UnityのTexture2Dクラスの関数「UpdateExternalTexture」「CreateExternalTexture」は、関数名に「External」とあることから、「GL_TEXTURE_EXTERNAL_OESをターゲットとするテクスチャを扱うための関数なのでは」という考えを想起させる。
しかし、この考えは正しくなく、「外部で作成された GL_TEXTURE_2Dをターゲットとするテクスチャを扱うための関数」が正しいようである。
関連ページ
前項目:05.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でCreateExternalTexture()を利用し使用する方法
前項目:07.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側で作成したGL_TEXTURE_2Dのテクスチャに転写する方法