06.Java側で作成したGL_Texture_2Dのテクスチャを、Unity側で扱うことができることの確認

結果としては、以下の事象を確認した。
・CreateExternalTexture関数を用いて、Java側で作成したGL_TEXTURE_2Dのテクスチャから、Unityのテクスチャを作成すると、Java側で作成したテクスチャがUnityテクスチャとして描画される。
・UpdateExternalTexture関数を用いて、Java側で作成したGL_TEXTURE_2Dのテクスチャで、Unityのテクスチャを更新すると、Java側で作成したテクスチャがUnityテクスチャとして描画される。

解説

以下の処理を行い、Unityテクスチャとして描画されるかどうかを確認する。

実装:CreateExternalTexture()利用版

まず、CreateExternalTexture関数を利用した場合の動作を確認します。
(本項の後半で、UpdateExternalTexture関数を利用した場合の動作を確認します。)

プロジェクトを開く

05.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でCreateExternalTexture()を利用し使用する方法」を実施していない場合は、実施します。

Javaクラスの編集

Androidライブラリのプロジェクトを開きます。

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の初期化の関数に以下の変更を加えます。

TextureRendererの初期化 InitializeTextureRenderer()関数の内容を以下のようにします。

UpdateExternalTexture関数に関連した処理を追加します。
イベント処理の関数に以下の変更を加えます。

イベント処理 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のテクスチャに転写する方法