专业的编程技术博客社区

网站首页 > 博客文章 正文

Shader(shader warming)

baijin 2024-09-02 11:03:40 博客文章 5 ℃ 0 评论
Shader"un/aoShader"
{
    //定义变量
    Properties
    {
        [Header(Base)]
        [NoScaleOffset]//隐藏UV 偏移
        _MainTex("MainTex",2d)="white"{}
        //特性 [HideInInspector] 隐藏属性
        _Color("Color",Color)=(0,0,0,0)
        _Value("Intensity",float)=1
        [Header(Dissolve)]
        //开关控制 结合变体实现
        [Toggle]_DissolveEnable("Dissolve Enable",int)=0
        _DissolveTex("_DissolveTex",2d)="white"{}
        _Clip("Clip",Range(0,1))=1
        [Header(RampTexture)]
        _Ramp("Ramp",2d)="white"{}
        
    }
    //第一个shader的
    SubShader
    {
        Tags
        {
            "Queue"="Geometry"
        }
        //第一个Pass通道
        pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            //定义变体
            #pragma mulit_compile _ _DISSOLVEENABLE_ON
            #include "UnityCG.cginc"

            fixed4 _Color;
            float _Value;
            sampler2D _MainTex;
            sampler2D _DissolveTex;
            sampler _Ramp;
            float4 _DissolveTex_ST;//uv
            float _Clip;
            
            struct appdata{
                float4 vertex:POSITION;
                float4 color:COLOR;
                float4 uv:TEXCOORD0;
                
            };
            struct v2f
            {
                float4 pos:SV_POSITION;
                float4 uv:TEXCOORD0;       
            };
            //顶点着色
            v2f vert (appdata v)
            {
                //对象空间转世界空间 转裁剪空间  转法线空间  空间单位化转二维空间
                //uv操作 高斯模糊
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv.xy=v.uv.xy;
                //o.uv.zw=v.uv*_DissolveTex_ST.xy+_DissolveTex_ST.zw;
                o.uv.zw=TRANSFORM_TEX(v.uv,_DissolveTex); //和上面方法相同  unity封装函数 unityCG。cginc
                return o;
            }
            //片元着色
            float4 frag(v2f i):SV_TARGET
            {
                //光栅化 颜色线性插值 顶点线性插值
                //混合颜色
                //sss 漫反射 高光 反射 叠加  
                float4 col;
                float4 tex=tex2D(_MainTex,i.uv.xy);
                col=tex*_Value+_Color;

                #if _DissolveEnable_ON
                float4 diss=tex2D(_DissolveTex,i.uv.zw);
                //<0 舍弃 溶解
                clip(diss.r -_Clip);
                fixed dissoleValue=saturate((diss.r-_Clip)/((_Clip+0.1)-_Clip));
                float4 ramp=tex1D(_Ramp,dissoleValue);
                col+=ramp;
                #endif
                return col;
            }
            ENDCG
        }   
    }

    
}
  • TRANSFORM_TEX(UV,Texture)返回float2;
  • tex2D(Texture,uv);贴图采样
  • clip(float)溶解函数小于0舍弃
  • saturate限制值在0到1之间,在0-1之间就做插值
Shader "taecg/Effects"
{
    Properties
    {
        [Header(Base)]
        [Enum (UnityEngine.Rendering.BlendMode)]_SrcBlend("Src Blend",int)=0
        [Enum (UnityEngine.Rendering.BlendMode)]_DstBlend("Dst Blend",int)=0
        [Enum (UnityEngine.Rendering.CullMode)]_Cull("Cull",int)=0
        _Color("Color",Color)=(1,1,1,1)
        _Intensity("Intensity",Range(-4,4))=1
        _MainTex ("Texture", 2D) = "white" {}
        _MainUVSpeedX("MainUVSpeedX",float)=1
        _MainUVSpeedY("MainUVSpeedY",float)=1

        [Header(Mask)]
        [Toggle]_MaskEnable("Mask Enable",int)=0
        _MaskTex("MaskTex",2D)="white"{}
        _MaskUVSpeedX("MaskUVSpeedX",float)=1
        _MaskUVSpeedY("MaskUVSpeedY",float)=1
        
        [Header(DistorTex)]   
        [Toggle]_DistorEnable("Mask Enable",int)=0
        _DistorTex("DistorTex",2D)="white"{}
        _DistorUVSpeedX("MaskUVSpeedX",float)=1
        _DistorUVSpeedY("MaskUVSpeedY",float)=1
        _Distort("Distort",Range(0,1))=0
    }
    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
        }
        Blend [_SrcBlend][_DstBlend] //源颜色   目标颜色
        //剔除 Off Back Front
        Cull [_Cull]
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma shader_feature _ _MASKENABLE_ON
            #pragma shader_feature _ _DISTORENABLE_ON
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float2 uv2:TEXCOORD1;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D _DistorTex;
            float4 _DistorTex_ST;

            sampler2D _MaskTex;
            float4 _MaskTex_ST;

            fixed4 _Color;
            half _Intensity;
            float _MainUVSpeedX;
            float _MainUVSpeedY;

            float _MaskUVSpeedX;
            float _MaskUVSpeedY;

            float _DistorUVSpeedX;
            float _DistorUVSpeedY;
            float _Distort;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);

                //_Time.xyzw;  //y(t)  x(t/2)  z(t*2) w(t*3)
                o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex)+float2(_MainUVSpeedX,_MainUVSpeedY)*_Time.y;
                //o.uv.xy=v.uv*_MainTex_ST.xy+_MainTex_ST.zw+(float2(_MainUVSpeedX,_MainUVSpeedY)*_Time.y);

                o.uv.zw=TRANSFORM_TEX(v.uv,_MaskTex)+float2(_MaskUVSpeedX,_MaskUVSpeedY)*_Time.y;
                o.uv2=TRANSFORM_TEX(v.uv,_DistorTex)+float2(_DistorUVSpeedX,_DistorUVSpeedY)*_Time.y;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col;
                float2 distort;
                distort=i.uv.xy;
                //UV扭曲
                #if _DISTORENABLE_ON  //变体约束
                fixed4 distorTex=tex2D(_DistorTex,i.uv2);
                distort=lerp(i.uv.xy,distorTex,_Distort);
                //遮罩
                #endif
                col = tex2D(_MainTex, distort);
                #if _MASKENABLE_ON
                fixed4 maskTex=tex2D(_MaskTex,i.uv.zw);
                col*=maskTex;
                #endif
                //混合
                col*=_Color*_Intensity;
                return col;
            }
            ENDCG
        }
    }
}
  • [Enum (UnityEngine.Rendering.CullMode)]_Cull("Cull",int)=0unity,提供的特性;
  • [Enum (UnityEngine.Rendering.BlendMode)]_SrcBlend("Src Blend",int)=0,控制源颜色;
  • [Enum (UnityEngine.Rendering.BlendMode)]_DstBlend("Dst Blend",int)=0,控制目标颜色;
  • Cull [_Cull] :遮罩剔除(Off/Fornt/Back)双面显示(off)一般Back;
  • Blend [_SrcBlend][_DstBlend] //源颜色 目标颜色;混合模式;
  • lerp(float a,float b,x);线性插值;
  • 实现的扭曲效果来自对uv操作;
Shader "Unlit/HeatDistort03"
{
    Properties
    {
        _DistortTex ("DistortTex", 2D) = "white" {}
        _Distort("SpeedX(X) SpeedY(Y) Distort ",vector)=(0,0,0,0)
    }
    SubShader
    {

        Tags { "Queue"="Transparent" }
        Cull off
        GrabPass
        {
            "_GrabTex"
        }
        Pass
        {
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata{
                float4 vertex : POSITION;
                float2 uv:TEXCOORD0;
            };
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos:SV_POSITION;
                float4 screenUV:TEXCOORD1;
            };
            sampler2D _GrabTex;
            sampler2D _DistortTex;
            float4 _DistortTex_ST;
            fixed4 _Distort;
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.uv,_DistortTex)+_Distort.xy*_Time.y;
                //透视除法
                o.screenUV= ComputeScreenPos(o.pos);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //裁剪空间下屏幕坐标(像素坐标) _ScreenParams总像素
                float2 screenUV= i.pos.xy/_ScreenParams.xy;
                fixed4 distorTex=tex2D(_DistortTex,i.uv);
                float2 uv=lerp(screenUV,distorTex,_Distort.z);
                fixed4 grabTex=tex2D(_GrabTex,uv);
                return grabTex;
            }
            ENDCG
        }
    }
}
  • ComputeScreenPos(pos)获取屏幕UV;
  • 屏幕uv=像素坐标/总像素;(1080*1920:总像素);
  • _Time时间:x(t/2) y(t) z(2*t) w(3*t) 配合动画特效使用;

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表