夜風のMixedReality

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

Shaderの変更を保持して使用できるAssignNewShaderToMaterial を触る その② プロパティを保持する処理を実装する

本日はMRGT枠です。

現在MRGTのプロジェクトへ機能開発を行いプルリクエストを提出しています。

github.com

ここでは修正のリクエストが来ており、以下のようにAssignNewShaderToMaterialを編集してStanardShaderなどの発光マップがシェーダー変更時にMRGTStandardShaderの_EmittiveMapに引き継がれるように依頼が来ていました。

Could you also copy the emission map property from the standard shader in the AssignNewShaderToMaterial function below?

This way users will keep their settings when switching shaders.

今回はこの修正に取り掛かります。

〇AssignNewShaderToMaterial

AssignNewShaderToMaterialはShaderGUIクラスで提供されるShaderに関する関数です。

これはマテリアルに割り当てられたShaderを別のシェーダーに変更した際に発火されます。

redhologerbera.hatenablog.com

 つまりUnityStandardShaderなど従来のシェーダーからMRGTStandardShaderに変更した際などに処理が働き、一部の共通プロパティを引き継ぐ仕組みです。

〇_EmittiveMapの追加

今回のPRではMRGTStandardShaderに発光マップ(_EmissiveMap)を追加しました。

redhologerbera.hatenablog.com

これはMRGTStandardShaderの特殊なプロパティではなくUnityのStandardShaderなどにも共通して提供されているプロパティです。

そのためこの発光マップをShader変更時に保持されるようにしていきます。

AssignNewShaderToMaterial関数にemissionMapTextureを追加します。

    public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
        {
         ・・・
            float? emission = null;
            Color? emissionColor = GetColorProperty(material, "_EmissionColor");
            Texture emissionMapTexture = material.HasProperty("_EmissionMap") ? material.GetTexture("_EmissionMap") : null; //追加
            ・・・

②次にemissionMapTextureが存在する場合新たなマテリアルのプロパティとしてセットする処理を加えます。

            if (emissionMapTexture)
            {
                material.SetTexture("_EmissiveMap", emissionMapTexture);
            }

以上でプロパティを保持してシェーダーの変更が可能になりました。

PRの修正点はあと一か所なので今週中に仕上げていきたいです。