Unity Shader学习笔记

仅记录本人的心得,不是正常阅读(待有时间再整理)

Properties

 _MainTex ("Flow Texture", 2D) = "white" {}

如果是Image,那这个纹理默认会从image的纹理属性里过来。

Subshader

Tags

  RenderType:
    Opaque        // 不透明物体(默认)
    Transparent   // 透明物体
    TransparentCutout // 透明度裁剪(如树叶)
    Background    // 背景(天空盒)
    Overlay       // 叠加层(UI)

  Queue:
    Background = 1000      // 最早渲染(天空盒)
    Geometry = 2000        // 不透明几何体(默认)
    AlphaTest = 2450       // 透明度测试
    Transparent = 3000     // 透明物体(从后向前渲染)
    Overlay = 4000         // 最后渲染(UI、镜头光晕)

Pass

简单左右流动效果

  v2f vert (appdata v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    return o;
}

half4 frag (v2f f) : SV_Target
{
    // UV动画
    float2 uv = f.uv;
    uv.x -= _Time.y * _Speed;
    //uv = frac(uv); 如果精灵使用的是钳制那就需要取余了
    // 采样纹理
    half4 col = tex2D(_MainTex, uv);
    
    // 应用颜色和强度
    col.rgb *= _Color.rgb * _Intensity;
    col.a *= _Color.a;
    
    return col;
}

以中心圆形向外扩散加旋转

   SubShader
{
    Tags { "RenderType"="Transparent" "Queue"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha
    
    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"
        sampler2D _MainTex;
        float4 _MainTex_ST;
        float _Speed;
        float _RangleSpeed;
        float4 _Color;
        float _Intensity;
        float _Density;
        
        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };
        
        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
        };
        
        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            //o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            o.uv = v.uv;
            return o;
        }
        
        half4 frag (v2f f) : SV_Target
        {
            // UV动画
            float2 uv = f.uv;
            float2 dir = uv - 0.5;
            float angle = atan2(dir.y, dir.x);
            angle +=  _Time.y * _RangleSpeed;
            //angle +=  _Time.y * _Speed;
            float len = length(dir);
            if(len * len > 0.25)
            {
                return half4(0,0,0,0);
            }
            len *= 2;
            float dis =_Time.y * _Speed;
            len -= dis; 
            len = frac(len);
            float2 newUV = float2(cos(angle) *len / 2  + 0.5 , sin(angle) *len / 2 + 0.5);
            return tex2D(_MainTex, newUV);
        }
        ENDCG
    }
}
posted @ 2026-01-13 09:10  stweily  阅读(9)  评论(0)    收藏  举报