すぎしーのXRと3DCG

主にXR, Unity, 3DCG系の記事を投稿していきます。

【Unity】バグ?Tex2DArray型RenderTextureにVRTextureUsage.TwoEyesが指定されている場合にGraphics.Blitが機能しないパターンがある (2021/06/05 追記)

概要

タイトル通りです。
単なる共有なので簡素に書きます。

※一応UnityにBug Report投げてます。

環境

  • Unity 2019.4.1f1 (発生)
  • Unity 2020.3.11f1 (発生)
  • Unity 2021.1.10f1 (解消済み)
  • Unity 2021.2.0a19 (解消済み)

詳細はブログの末尾に追記

機能しないパターン

  • RenderTextureDescriptor.vrUsage = VRTextureUsage.TwoEyesが指定されたTex2DArray型RenderTexture
    • TwoEyes以外の場合は問題なし
  • 上記RenderTextureをpublic static void Blit(Texture source, RenderTexture dest, int sourceDepthSlice, int destDepthSlice);のdestに使い、destDepthSlice: 0で使う
    • public static void Blit(Texture source, RenderTexture dest);であれば、source, destともにTex2DArray型では問題なく機能する

関連

機能しないときにRenderTextureDescriptor

var desc = new RenderTextureDescriptor(1024, 1024);

desc.dimension = UnityEngine.Rendering.TextureDimension.Tex2DArray;
desc.volumeDepth = 2;

// TwoEyesの場合に発生
desc.vrUsage = VRTextureUsage.TwoEyes;

機能しないときのGraphics.Blit

  • destDepthSliceが0の場合に、コピーが正しく実施されない
Graphics.Blit(
    source: srcTex, dest: arrayTex,
    sourceDepthSlice: 0, destDepthSlice: 0);
  • ちなみにdestDepthSliceが1以上の場合は問題なし

どうなるのか

  • 左側がTex2DArrayのIndex0のテクスチャで正しくコピーされていない
  • 右側がIndex1で問題なくコピーされている
  • 特にエラーログも出ない

f:id:tsgcpp:20200627195357j:plain
TwoEyesの場合

期待する結果(TwoEyes以外の場合)

f:id:tsgcpp:20200627195453j:plain
TwoEyes以外の場合

雑感

前回の記事でTex2DArray型RenderTextureを作成する場合は注意してください。

仕様なのかどうか分らなかったのでBug Reportに上げました。
最近Bug Report出しすぎて、無視されないか不安になってます。。。

それでは~。

追記

Unityより「再現しました~」メール来ました。
ただ、IssueTrackerは作成されなかったようです。

今回のBug Reportに対する返信がやたら早かったです。
これより前に送った4つぐらいはまだ返信ないのが気になりますけどw。

追記(2021/06/05)

こちらのバグは 2021.1.10f1では解消されています。
ただし、2021/06/05時点のLTS最新の 2020.3.11f1 では解消されていません

理由は定かではありませんが、Unity 2020では対応されないのかもしれませんね。

ついでに検証可能なようにサンプルコードを更新しています。
StereoTextureGenerator コンポーネントCopyTypeを変更することで確認可能です。

github.com

Unity 2020でも GenerateStereoTextureAsTwoEyes メソッドを参考に別のTexture2DArrayにコピーしてから、改めて Graphics.Blit を使うことでVRTextureUsage.TwoEyesのRenderTextureに対してもGraphics.Blitが可能になります。

ただし、コードのとおり余計にメモリを使用するのでご注意ください。