夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MRGTの実験的機能Acrylicを実機で動かした際のUnityマテリアルエラーを解消する。

本日はMRGT枠です。

MixedRealityGraphicsToolsを調査している中でバグと思われる現象を見つけたため今回修正を行いました。

〇発生したバグの詳細

MRGTの実験的機能であるAcrylicサンプルはMixedRealityDesignLaungateで提唱されるブラー効果を試すことができます。

このサンプルをMeta QuestおよびHoloLens 2でビルドし、確認したところ無数に球状に生成、回転するキューブのマテリアルがエラー表示になっていました。

 この問題を確認したバージョンとして最新の0.4.0および、本日時点でのMRGTの最新のMainブランチで確認しました。

〇原因と改善

 原因はマテリアルエラーを起こしているCube群の生成の方法にありました。

 これはOrbitalsクラスで生成されています。

 

github.com

ここでOrbiterでプリミティブを生成しています。

      public Orbiter(PrimitiveType primitiveType, Transform parent, int index, float size, float radius, float startSpeed, float startAngle, float tiltx, float tilty, Color color)
            {
                GameObject go = GameObject.CreatePrimitive(primitiveType);//指定したプリミティブを生成
                goParent = new GameObject("Orb " + index);
                goParent.transform.SetParent(parent, false);
                go.transform.SetParent(goParent.transform, false);
                go.transform.localScale = size * Vector3.one;
                go.transform.localPosition = radius * Vector3.right;
                speed = startSpeed;
                tiltX = tiltx;
                tiltY = tilty;
                angle = startAngle;

                Renderer r = go.GetComponent<Renderer>();
                if (r != null)
                {
                    r.material.color = color;
                }
                UpdatePosition(0.0f);
            }

 ここで注意点なのですが、GameObject.CreatePrimitive();で生成されるプリミティブオブジェクトのマテリアルはStandardShaderがデフォルトで指定される点です。

 厄介な点としてURPの場合ビルドして実機で動かした際にビルドインのStandardShaderがアタッチされます。

 これによってシェーダーエラーが発生することになります。

 このためOrbiterをマテリアルを参照するように変更しました。

  public Orbiter(PrimitiveType primitiveType, Material material, Transform parent, int index, float size, float radius, float startSpeed, float startAngle, float tiltx, float tilty, Color color)

            {
                GameObject go = GameObject.CreatePrimitive(primitiveType);
                ...
                Renderer r = go.GetComponent<Renderer>();
                if (r != null)
                {
                    r.material = material;
                }
                UpdatePosition(0.0f);
            }

このマテリアルはPublicとして定義することでUnityのインスペクターウィンドウから任意のマテリアルを参照できるようにしました。

 

以上で実機でのマテリアルエラーが解消されるようになりました。

 この変更はMRGTプロジェクトへPRを提出しています。

 そのため次回以降のリリースバージョンでは改善される可能性が高いです。

 

github.com