国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity極坐標Shader特效,以及使用Instanced Property實現相同材質不同參數

這篇具有很好參考價值的文章主要介紹了Unity極坐標Shader特效,以及使用Instanced Property實現相同材質不同參數。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Unity極坐標特效

先看看效果

Unity極坐標Shader特效

有時候我們需要在場景中擺放一些熱點,用戶點擊之后出現互動,當然實現這個功能的方法有很多,作為一名程序員,當然是要用最簡單的實現。用shader程序化實現它。

啥是極坐標

極坐標,又稱極座標系。它是一種表示平面直角坐標系中點的方法,其中每個點都由距離原點的距離和從原點到該點的線段與某條固定軸正半軸(通常為 θ=0)的夾角(逆時針為正)兩個值確定。這兩個值通常用 (r, θ) 表示,其中 r 表示距離, θ 表示方向角度,范圍在 0 度到 360 度之間。極坐標系常用于描述圓形和對稱圖形,以及某些物理問題中更自然地描述旋轉對稱性。
像這種波從中間生成向往擴散的效果,使用極坐標系很容易實現。

極坐標的實現

Unity極坐標Shader特效,以及使用Instanced Property實現相同材質不同參數
以ASE為例,將UV轉為極坐標,然后取一張簡單的漸變紋理,最后乘以一個顏色輸出即可。
下面介紹一下每個參數的意義:
Unity極坐標Shader特效,以及使用Instanced Property實現相同材質不同參數

參數暴漏如上圖所示,其中:

參數 意義
MainColor 輸出顏色,HDR色
Size 大小,0-1
Texture 一張?zhí)厥獾募y理,請見下圖
Interval 間隔,0-1, 0.5表示發(fā)光的部分和不發(fā)光的部分尺寸相同
Scale 有多少條波
Offset 波的運動 0-1
那張?zhí)厥獾募y理圖如下:
Unity極坐標Shader特效,以及使用Instanced Property實現相同材質不同參數

如何讓不同的物體,使用相同的材質,但是卻擁有不同的參數?

效果如下所示,兩個物體,都使用了相同的材質,但是他們的播放速度可以各自調節(jié):

Unity Instanced Property 演示

這主要是使用了Shader中的Instanced Property。
Instanced Property的簡介,這是我直接問的chat-GPT:
實例化屬性(Instanced Properties)是 Unity Shader 中的一個特殊類型的屬性,它可以實現以下功能:

  1. 通過實例化屬性,我們可以同時創(chuàng)建多個實例化對象,并為每個對象賦予不同的屬性值。這意味著我們可以創(chuàng)建多個具有不同屬性的對象,而無需為每個對象編寫單獨的 Shader。

  2. 實例化屬性還可以用于實現高效的繪制技術,例如 GPU 實例化(GPU Instancing)。在 GPU 實例化中,我們可以在一個 Draw Call 中一次性渲染大量的實例化對象,從而減少 CPU 和 GPU 的工作負載,提高渲染性能。

  3. 實例化屬性還可以用于在 Unity Editor 中動態(tài)調整模型的屬性,而無需重新編譯 Shader。在 Unity Editor 中,我們可以直接調整每個實例的屬性值,從而快速預覽 Shader 在不同模型上的效果。

總的來說,實例化屬性是 Unity Shader 中一種非常有用的功能,可以幫助我們實現更高效、更靈活的渲染技術。

在代碼中修改Instanced Property主要使用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);
    }
}

但是要注意的是:UGUI中無法使用Instanced Property,因為UGUI中的CanvasRenderer類并沒有SetPropertyBlock方法。問了chat-GPT,給出的方法是調用材質類的SetPropertyBlock方法,然而材質類并沒有這個方法,不知道如何解決。如果您知道,麻煩評論區(qū)說一下,感謝?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-484398.html

到了這里,關于Unity極坐標Shader特效,以及使用Instanced Property實現相同材質不同參數的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包