読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

ネイティブで作成したテクスチャを使用する

遅くなったが、[Unity]Unityでテクスチャを読む7つの方法の続き。4.5.6(PNGJPEGを読む方法)についてはこちら

で、今回はネイティブ(OpenGL ESやDirectX11)で作成したテクスチャを取得する方法。

結論を言ってしまうと、Texture2D.CreateExternalTextureTexture2D.UpdateExternalTextureを使用する。これを使用すると、ネイティブで使用しているテクスチャを直接…とは言わないが、ポインタ経由で使用することが出来る。

逆にこれを使用しない場合、ネイティブで取得した画像(例えば写真やビデオ等)を取得するには、テクスチャを一旦PNGに変換しファイルに書き込むかネイティブプラグイン経由でbyte[]を取得、Unity側で再びTexture2Dを生成するといった非常に面倒な手順が必要になる。


ネイティブのテクスチャを取得する前に、まずはテクスチャを作成する。方法はOpenGL ES・DirectXの方式に準じる。で、OpenGL宜しくテクスチャを生成した後、作ったID3D11ShaderResourceViewかGLuintをネイティブプラグイン経由で取得し、Texture2D.CreateExternalTextureでUnity側のテクスチャとして登録する。この際、指定のサイズと実際のサイズが異なるとエラーとなるので注意。

取得したポインタは直接UpdateExternalTextureで突っ込めるかと思ってたが、実際はCreateExternalTextureで一度Unity側に登録しないと使えない。このコストはほぼ無いっぽいが、少し気持ち悪い。

IntPtr ptr = GetTexturePtr ();
Texture2D externalTexture = Texture2D.CreateExternalTexture (
1024, 1024, TextureFormat.ARGB32, false, false, ptr);
texture.UpdateExternalTexture (externalTexture.GetNativeTexturePtr ());
GetTexturePtr()は中で適当にテクスチャ作ってポインタを返すだけのネイティブプラグイン

上手く使えば完全非同期なテクスチャの読込とか、カメラ画像のキャプチャに使える。


ちなみにUpdateExternalTextureは別にネイティブテクスチャじゃなくても使える。例えばRenderTextureからイメージを取得したい場合、renderTexture.GetNativeTexturePtr()でポインタを取得後、Texture2D.UpdateExternalTextureとしてやればイメージを更新出来る。ただTexture2Dを更新した訳ではないので元テクスチャが死ぬと一緒にオサラバする点に注意(要は参照先を変更しただけ)。