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

実装

プロジェクトを開く

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

Javaクラスの編集

Androidライブラリ側の変更はありません。

Unityスクリプトの編集

Unityアプリのプロジェクトを開きます。

04.Java側で作成したGL_TEXTURE_EXTERNAL_OESのテクスチャを、Unity側でUpdateExternalTexture()を利用し使用する方法」でイベント処理の関数に追加した変更を元に戻します。

イベント処理 OnEvent()関数の内容を以下のようにします。

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

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側で扱うことができることのテスト