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) 配合动画特效使用;
本文暂时没有评论,来添加一个吧(●'◡'●)