刚开始学shader ,写一下笔记。
一、常用shader
1、Standard Surface Shader:(标准表面着色器) 是一种基于物理法人着色器,以模拟现实真实的方式来模拟材质与灯光之间的关系,可以很轻易的表现出各种金属反光效果,同时此种Shader的书写逻辑也更符合人类的思维模式。
2、Unlit Shader:最基本的顶点片断着色器,不受光照影响的Shader,多用于特效、UI上的效果制作。
3、Image Effect Shader:也是顶点片断着色器,只不过是针对后处理而定制的模版,后处理是什么呢?Bloom(也有人叫Glow/泛光/辉光等说法)、调色、景深、模糊等,这些基于最终整个屏幕画面而进行再处理的Shader就是后处理。
二、属性类型(shader脚本中定义在Properties模块中的)
1、Color颜色
_Color("ColorValue", Color) = (1,1,1,1)
[HDR]_Color("ColorValue", Color) = (1,1,0,1)
变量名:_Color
显示名称:ColorValue (显示在面板上)
类型:Color
默认值:(1,1,1,1) [0-1]之间的浮点数 rgba
2、Int整数
_Int("IntValue", Int) = 1
3、Float浮点数
_Float("FloatValue", Float) = 0.5
_Float("FloatValue", Range( 0 , 1)) = 0.5
[PowerSlider(3)]_Float("FloatValue", Range( 0 , 1)) = 0.5
[IntRange]_Float("IntValue", Range( 0 , 1)) = 1
第二种情况显示float的范围在0-1
4、Vector四维数
_Vector("VectorValue", Vector) = (0,0,0,0)
5、2D纹理
_MainTex("2D纹理", 2D) = "white" {}
[NoScaleOffset]_MainTex("2D纹理", 2D) = "white" {}
[Normal]_MainTex("2D纹理", 2D) = "white" {}
第三种情况是法线贴图
6、3D纹理
_MainTex("3D纹理", 3d) = "" {}
7、Cube立方体纹理
_MainTex("Cube纹理", CUBE) = "" {}
三、shader整体框架
Shader "Custom/SinShader"
{
Properties
{
_Color("Color", Color) = (1,1,1,1) //接收外部材质
}
SubShader
{
Pass
{
CGPROGRAM //开始
#pragma vertex vert //定点着色器 入口函数
#pragma fragment frag//片段着色器 入口函数
ENDCG //结束
}
}
}
四、第一个shader(SinShader)
Shader "Custom/SinShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {} //水波图片接收
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert //顶点着色器入口函数
#pragma fragment frag//片段着色器入口函数
#include "UnityCG.cginc" //负责引用unity封装的相关库函数
struct appdata //数据结构(目前只用到这两种)
{
float4 vertex : POSITION; //POSITION:位置 常用语意修饰之一
float2 uv : TEXCOORD0; //TEXCOORD0:第一套纹理 常用语意修饰之一
};
sampler2D _MainTex; //Properties中定义的变量 如果当前Pass要使用的话,需要再定义一次 2D对应sampler2D
float4 _MainTex_ST; //为了使用 TRANSFORM_TEX函数定义
//负责改变各个顶点的相位 实现水波像正弦函数一样波动
appdata vert (appdata v)
{
appdata o;
//获得点到中心点的距离 ,相当于正弦函数的X值
float dis = distance(v.vertex.xyz, float3(0, 0, 0));
//获得距dist _Time.z一定偏移点的相位,相当于正弦函数的y值
//可以通过修改h的缩放倍数,该波峰波谷的值,以及通过改_Time.z缩放倍数改变波浪的快慢
float h = cos(dis+_Time.z);
//o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
o.vertex = UnityObjectToClipPos(v.vertex);
//将计算好的y值赋值到顶点
o.vertex.y = h;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (appdata i) : SV_Target
{
fixed4 color = tex2D(_MainTex, i.uv); //2D纹理查找 根据uv和贴图计算各个点应该显示什么颜色
return color;
}
ENDCG
}
}
}
五、效果如下
第一次用录gif图,录的不太清楚,可能是电脑问题
六、UVShader
Shader "Custom/UVShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_BlackTex("Texture1",2d) = "white"{}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
sampler _BlackTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float2 uv_offset = float2(_Time.y*0.2,_Time.y*0.2);
fixed4 LightColor= tex2D(_BlackTex, i.uv+uv_offset);
fixed4 col = tex2D(_MainTex, i.uv) +LightColor;
return col;
}
ENDCG
}
}
}
效果:
给鱼添加了水波纹的效果