夜風のMixedReality

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

ShaderGraphの変数をスクリプトで扱う

本日はshader勉強枠です。

UnityのShaderではマテリアルに表示されるパブリックな変数をスクリプトで変更できます。

例えば次のような[Universal Render Pipeline/Lit]シェーダーのマテリアルをアタッチしたPlaneの例を見てみます。

f:id:Holomoto-Sumire:20211005204624p:plain

使用しているShaderごとに変数は異なります。これを確認するためにはマテリアルのインスペクターウィンドウ上部のメニューから[SelectShader]でShaderの元ファイルを選択します。

f:id:Holomoto-Sumire:20211005204827p:plain

Shaderの元ファイルの[Propeties]以下に表示されている変数がスクリプトでアクセス可能な変数になります。

f:id:Holomoto-Sumire:20211005205137p:plain

次のスクリプトをPlaneにアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MaterialChanger : MonoBehaviour
{
    private Material _mat;

    [SerializeField] private Color _Maincol;

    [SerializeField] private float _smoothness;
    // Start is called before the first frame update
    void Start()
    {
        _mat = GetComponent<Renderer>().material;
        _mat.SetColor("_BaseColor",_Maincol);
        _mat.SetFloat("_Smoothness",_smoothness);
    }
    
}

実行することでスクリプトでマテリアルの値を変化できました。

f:id:Holomoto-Sumire:20211005205833p:plain

これらのUnityのマテリアル側からアクセス可能な変数は[Properties]ブロックで定義されています。

 Properties
    {
        ...
        [MainColor] _BaseColor("Color", Color) = (1,1,1,1)

        ...

        _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
       ...
    }

同様にShaderGraphの場合はマテリアル側で扱える変数は[Backboard]に記述されます。

f:id:Holomoto-Sumire:20211005210152p:plain

ShaderGraphも同様にインスペクタから[Properties]によって変数が定義されています。

f:id:Holomoto-Sumire:20211005210524p:plain

しかし[Vector1_90f04088abb342df9b80cf49ccfab668]のように非常にわかりにくい変数名になっています。

これはShaderGraphのBackboardで変数を選択した状態でGraphInspectorに表示される[Refarence]で定義されます。

f:id:Holomoto-Sumire:20211005210748p:plain

[Refarence]を書き換えることでコード同様可読性があるスクリプトでアクセス可能な変数が作成できます。

f:id:Holomoto-Sumire:20211005210955p:plain

後は前述のコードのShader同様の方法でスクリプトでアクセス可能になります。