Bootstrap

通过粒子系统customData传值给材质球

粒子特效使用的材质球,如果通过动画控制shader的某个参数,例如溶解阈值,所有的粒子都会按照相同的数值变化,如果需要每个粒子在自己的生命周期内按照曲线变化,则可以通过customData实现。

1.ParticleSystem中勾选CustomData,支持8个通道,可以选择固定参数或者曲线

2.ParticleSystem中勾选Render中的Custom Vertex Streams

添加custom1和custom2两个通道,各支持四个通道

注意不可以调整上图内UV和Custom的顺序,上图就是默认添加后的顺序;

uv                = TEXCOORD0.xy

Custom1.xy = TEXCOORD0.zw     Custom1.zw = TEXCOORD1.xy

Custom2.xy = TEXCOORD1.zw     Custom2.zw = TEXCOORD2.xy

由于uv占用了TEXCOORD0寄存器,因此Custom2.zw存在了TEXCOORD2寄存器

Shader "Unlit/TestCustomData"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _TestValue("TestValue1",Range(0,0.5)) = 0.2
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
                   
            #include "UnityCG.cginc"

            float _TestValue;
            
            struct appdata
            {
                float4 vertex : POSITION;     
                float4 customData1 : TEXCOORD0;          
                float4 customData2 : TEXCOORD1;   
                float4 customData3 : TEXCOORD2;                                       
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;           
                float4 vertex : SV_POSITION;
                float4 testData1 : TEXCOORD1;
                float4 testData2 : TEXCOORD2;         
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.customData1.xy, _MainTex);
                
                o.testData1.xy = v.customData1.zw;
                o.testData1.zw = v.customData2.xy;
                o.testData2.xy = v.customData2.zw;
                o.testData2.zw = v.customData3.xy;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {          
                fixed4 col = tex2D(_MainTex, i.uv);
                                         
                //col *= i.testData1;
                 col = i.testData2;
                return col;
            }
            ENDCG
        }
    }
}

;