本日はShader学習枠です。
昨日は特定の範囲がクリッピング(くりぬき)される表現を実装しました。
今回はこちらをさらに改造して、クリッピング範囲を任意に動かせるようにします。
〇クリッピング範囲の移動
①BlackboardにVector3型の変数ClippingPositionを加えます。
②PositionノードとSplitノードの間にAddノードを追加し、Positionノードの値にClippingPositionを加算します。
③これによってマテリアルのプロパティからクリッピングの位置を変えることができるようになりました。
ClippingPositionはVector3型で定義していますが、マテリアル上ではz値も含んだVector4型で表示されています。ここではz値は表示されているだけで使用されることはありません。
〇スクリプトとShaderを対応させる。
①次のスクリプトを適当なゲームオブジェクトへアタッチします。
using System.Collections; using System.Collections.Generic; using UnityEngine; [ExecuteInEditMode] public class ClipSphere : MonoBehaviour { [SerializeField] Material _ClipMat; // Update is called once per frame void Update() { UpdateShaderParam(); } void UpdateShaderParam() { Vector4 pos = this.transform.position *-1; _ClipMat.SetVector("_ClipPosition",pos); } }
②ShaderGraphのBlackboardからClippingPositionを選択し、GraphInspectorウィンドウからReferenceの値を_ClipPositionを入力します。
③ClipSphereのMaterialに対象のShaderを適応したマテリアルをアタッチします。
これによってClipSphereをアタッチしたオブジェクトの座標とくりぬかれる座標が一致しするようになります。
〇[ExecuteInEditMode]
ExecuteInEditModeはUnityで提供されるアトリビュート(属性)で、これをつけたクラスは実行中ではなくても処理が動きます。
これによってコンポーネントをアタッチした座標とマテリアルのパラメータを同期させています。