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()を利用し使用するために、すべきことは、以下です。

実装

プロジェクトを開く

03.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト」を実施していない場合は、実施します。

Javaクラスの編集

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

03.テクスチャを異なるターゲットでバインドするとエラーが発生する事象のテスト」でSurfaceの初期化の関数に加えた変更を元に戻します。

Surfaceの初期化の関数に以下の変更を加えます。

作成したテクスチャ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アプリのプロジェクトを開きます。

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

イベント処理 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()を利用し使用する方法