夜風のMixedReality

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

MixedRealityGraphicsTools StndardShader全機能解説 ⑥ Assigned at Runtime その①

本日はMRGT枠です。

こんかいはMRGTStandardShaderの機能の中のAssigned at Runtimeについて紹介します。

〇Assigned at Runtimeとは?

Assigned at Runtimeの設定項目はAlbedoにテクスチャを適応していない場合のみすぐ下に存在します。

 MRGTStandardShaderでは常に無駄な処理が走らずデバイスにとって最適なコストを支払い描画を行うシステムが採用されています。

 Assigned at Runtimeの機能もこの最適化にかかわる機能になります。

 Assigned at Runtimeはアプリケーション内で最初はテクスチャを使用していないが動的にテクスチャをアタッチする可能性がある場合に有効にします。

 テクスチャを適応していない場合はサンプリングが必要なく、このような処理をコンパイル時に除外しています。

 しかしながらコンパイル時に除外された場合サンプリングの処理が除外されているため動的にテクスチャを渡されても描画を行うことができません。

 Assigned at Runtimeを有効にしていることでこのようなサンプリング処理のコンパイルがおこなわれるようになります。

 逆に単色でのみ使用するマテリアルの場合はAssigned at Runtimeのチェックボックスは無効のままである方が最適なパフォーマンスを発揮できます。

〇Shader側の処理

プロパティブロックでは初期値がゼロで定義されています。

    [Toggle] _AlbedoAssignedAtRuntime("Albedo Assigned at Runtime", Float) = 0.0

シェーダー側ではこれのみの処理でShaderGUI側でこの値に応じて処理が行われます。

〇GUI上での処理

StandardShaderGUI.csではalbedoMap.textureValue == nullでif文で分岐しているようにテクスチャがアタッチされていない場合にGUI上に現れます。

 /// <summary>
        /// Displays inspectors settings that deal with texture sampling.
        /// </summary>
        /// <param name="materialEditor">Current material editor in use.</param>
        /// <param name="material">Current material in use.</param>
        protected void MainMapOptions(MaterialEditor materialEditor, Material material)
        {
            GUILayout.Label(Styles.primaryMapsTitle, EditorStyles.boldLabel);

            materialEditor.TexturePropertySingleLine(Styles.albedo, albedoMap, albedoColor);

            if (albedoMap.textureValue == null)
            {
                materialEditor.ShaderProperty(albedoAssignedAtRuntime, Styles.albedoAssignedAtRuntime, 2);
            }

この情報はSetupMaterialWithAlbedo関数の引数として渡されています。

        protected static void SetupMaterialWithAlbedo(Material material, MaterialProperty albedoMap, MaterialProperty albedoAlphaMode, MaterialProperty albedoAssignedAtRuntime)
        {
          ・・・
        }

この関数はアルベド設定に基づく機能の有効・無効を設定しています。

処理内容としては以下のようになります。

  if (albedoMap.textureValue || PropertyEnabled(albedoAssignedAtRuntime))
            {
                material.DisableKeyword(Styles.disableAlbedoMapName);
            }
            else
            {
                material.EnableKeyword(Styles.disableAlbedoMapName);
            }

      ・・・

上記処理で行われているのは以下の内容です。

  if (albedoMap.textureValue || PropertyEnabled(albedoAssignedAtRuntime))
            {
                material.DisableKeyword(Styles.disableAlbedoMapName);
            }
            else
            {
                material.EnableKeyword(Styles.disableAlbedoMapName);
            }

テクスチャが使用されているかAlbedoAssigned at Runtimeが有効な場合Shader内のdisableAlbedoMapNameを無効化します。

それ以外の場合はdisableAlbedoMapNameを有効化します

今回は以上です。次回その②でシェーダー内でdisableAlbedoMapNameによって変わるパラメータを見ていきます。