Unity 極座標シェーダー エフェクト、およびインスタンス化プロパティを使用して同じマテリアルの異なるパラメーターを実現

Unity 極座標効果

まずは効果を見てみましょう

Unity 極座標 シェーダ効果


場合によっては、シーンにいくつかのホットスポットを配置する必要があり、ユーザーがクリックした後にインタラクションが表示されます。もちろん、この機能を実現するにはさまざまな方法があります。プログラマーとしては、当然、最も単純な実装を使用する必要があります。シェーダーを使用してプログラムで実装します。

極座標とは

極座標。極座標系とも呼ばれます。これは、平面デカルト座標系内の点を表す方法であり、各点は、原点からの距離、および原点から点までの線分と固定軸の正の半軸 (通常は θ) の間の角度によって表されます。 =0) (反時計回りが正) 2つの値が決まります。これら 2 つの値は通常 (r, θ) で表されます。ここで、r は距離を表し、θ は 0 度から 360 度の範囲の方向角度を表します。極座標系は、円形および対称の図形を記述したり、一部の物理的問題でより自然に回転対称を記述したりするためによく使用されます。
このような波のような効果は、中心から発生して広がりますが、極座標系を使用すると簡単に実現できます。

極座標の実現

ここに画像の説明を挿入
ASE を例に挙げると、UV を極座標に変換し、次に単純なグラデーション テクスチャを取得し、最後にカラーを乗算して出力します。
各パラメータの意味を以下に紹介します。
ここに画像の説明を挿入

パラメータの漏れを上の図に示します。

パラメータ 意義
メインカラー 出力カラー、HDRカラー
サイズ サイズ、0~1
テクスチャ 特別なテクスチャです。下の写真をご覧ください。
間隔 間隔、0 ~ 1、0.5 は、点灯部分と非点灯部分のサイズが同じであることを意味します
規模 何波
オフセット 波の動き 0-1

その特別なテクスチャ マップは次のとおりです。
ここに画像の説明を挿入

同じマテリアルを使用し、異なるパラメータを持つ異なるオブジェクトを作成するにはどうすればよいですか?

効果は次のとおりです。両方のオブジェクトは同じマテリアルを使用しますが、再生速度は個別に調整できます。

Unity インスタンス化プロパティのデモ

これは主に Shader の Instanced プロパティを使用します。
インスタンス化プロパティの紹介、これは私が直接質問したチャット GPT です:
インスタンス化プロパティ (インスタンス化プロパティ) は、Unity Shader の特殊なタイプのプロパティであり、次の機能を実現できます。

  1. プロパティをインスタンス化することで、複数のインスタンス化されたオブジェクトを同時に作成し、各オブジェクトに異なるプロパティ値を割り当てることができます。これは、オブジェクトごとに個別のシェーダーを作成しなくても、異なるプロパティを持つ複数のオブジェクトを作成できることを意味します。

  2. インスタンス化プロパティを使用して、GPU インスタンス化などの効率的な描画手法を実装することもできます。GPU インスタンス化では、1 つの描画呼び出しで多数のインスタンス化されたオブジェクトを一度にレンダリングできるため、CPU と GPU のワークロードが軽減され、レンダリング パフォーマンスが向上します。

  3. インスタンス化プロパティを使用すると、シェーダーを再コンパイルせずに Unity エディターでモデルのプロパティを動的に調整することもできます。Unity エディターでは、各インスタンスの属性値を直接調整して、さまざまなモデルでのシェーダーの効果をすばやくプレビューできます。

一般に、インスタンス化されたプロパティは Unity Shader の非常に便利な機能であり、より効率的で柔軟なレンダリング技術を実現するのに役立ちます。

コード内でインスタンス化されたプロパティを変更するには、主にRendererクラスのメソッドを使用しますSetPropertyBlockコードは以下のように表示されます:

using UnityEngine;
using Random = UnityEngine.Random;

public class WaveHotPoint : MonoBehaviour
{
    
    
    [SerializeField] private float Speed;
    private Renderer _renderer;
    private MaterialPropertyBlock propBlock;
    private float offset;
    private static readonly int OffsetIndex = Shader.PropertyToID("_Offset");

    private void Awake()
    {
    
    
        _renderer = GetComponent<SpriteRenderer>();
        propBlock = new MaterialPropertyBlock();
        _renderer.GetPropertyBlock(propBlock);

        offset = Random.value;
    }

    private void Update()
    {
    
    
        offset = (offset - Speed * Time.deltaTime) % 1f;
        propBlock.SetFloat(OffsetIndex, offset);
        _renderer.SetPropertyBlock(propBlock);
    }
}

CanvasRendererただし、UGUIのクラスにはメソッドがないため、UGUI ではインスタンス化プロパティを使用できないことに注意してくださいSetPropertyBlockchat-GPTに質問したところ、SetPropertyBlockマテリアルクラスのメソッドを呼び出す方法が示されているのですが、マテリアルクラスにはこのメソッドがないため、解決方法がわかりません。ご存知の方はコメント欄で教えてください、よろしくお願いします!

おすすめ

転載: blog.csdn.net/sdhexu/article/details/131215987