在Shader的编码中,要养成不加空格的习惯,否则会有时候出现一些错误
固定管线着色器:
优点:实现简单
缺点:处理的效果比较差
//设置Shader的路径 Shader "MyFixedShader/FixedShader001"{ //Shader属性(当前材质拥有的属性) Properties{ //在Shader中写属性名称的时候,一般都会在属性名称前加一个_ //(1)属性名称(“(2)属性在面板的名字”,(3)属性类型)=(4)属性初值 _MyFloat("一个浮点数",Float)=1.5 _MyRange("一个范围浮点数",Range(0.5,5)=3 _MyVector("一个四维数",Vector)=(1,0,0,1) _MyColor("一个颜色",Color)=(1,0,0,1) //二阶贴图:贴图的宽高比是2的n次幂 例如256*256,128*128 //二阶贴图在渲染的时候 Tiling表示缩放 offset表示偏移量 相当于UVRect _My2DTexture("一个2阶贴图",2D)=""{} _MyRectTexture("一个非二阶贴图",Rect)=""{} _MyCubeTexture("一个立方体贴图",Cube)=""{} } //子着色器,可以有多个,一般只有一个子着色器 //每个子着色器相当于一个渲染方案 //当有多个子着色器的时候,会做出选择,既当这个子着色器不能渲染的时候,会选择下一个 SubShader{ //通道:可以通过多通道的方式渲染正面,反面等 Pass{ } } }
在Pass通道中给材质球增加一个颜色
Color(1,0,0,1) //固定颜色 Color[_MainColor]//可调颜色
漫反射:对应的是镜面反射,表面光滑的物体在反射的时候会有光斑,是镜面反射;表面粗糙的物体反射的时候角度是不固定的,会出现漫反射的效果。
镜面反射和漫反射的最大区别是:镜面反射的物体表面比较光滑,有一个高光效果
SubShader{ Pass{ //漫反射需要打开光照 Lighting On //开启镜面反射(默认的是漫反射,需要镜面反射的时候需要打开镜面反射) SeparateSpecular On Material { Diffuse(1,0,0,1)//固定漫反射 Diffuse[_MainColor]//可调漫反射 //当漫反射调成白色,就可以看出环境光的效果 Ambient[_AmbientColor]//可调环境光颜色 Emission[_EmissionColor]//自发光颜色,强度比较高 //下面是镜面反射 //高光颜色 Specular[_SpecularColor] //光泽度(range)调整光泽度的时候一般都先关闭自发光(自发光的强度高,影响效果) Shininess[_Shininess] } } }
设置多边形剔除(一般都是通过多通道进行剔除,剔除后的效果是正面和反面的颜色不同)
Pass{ //剔除正面 Cull Front } Pass{ //剔除反面 Cull Back } //不剔除 //Cull Off
渲染队列(Render Queue):既渲染的先后顺序
一般的,距离摄像机越远的物体越先渲染,越近的物体最后渲染。但有时候需要一个物体在任何情况下都最后去渲染,不想任何物体挡住,这时候就需要在Shader里面手动的设置渲染队列
在使用渲染队列的时候,需要关闭深度测试(深度测试和深度缓存(ZWrite On/Off)默认都是开启的)
SubShader{ //设置渲染队列 Tags{"Queue"="BackGround+500"} //关闭深度测试 ZText Off }
Alpha透明混合:当前材质球遇到其他一些材质,会出现的透明的效果
Pass{ //开启透明混合 Blend SrcAlpha OneMinusSrcAlpha //开启顶点光照 Lighting On Material{ Diffuse[_Color] } }
其他的混合:乘法的混合颜色较深,加法的混合颜色较浅
Blend One One:一种相加的混合。没有透明通道,调节透明度没有作用,背面透明,正面是正常颜色,当与其他物体混合的时候,颜色会发生变化
Blend One OneMinusDstColor:柔和相加混合。与其他物体混合的时候,只会和比该物体先渲染的物体进行混合。
Blend DsrColor Zero:乘法混合,混合后的颜色比较深
Blend DsrColor SrcColor:二倍乘法混合,比乘法混合颜色稍浅
Pass{ // Blend One One }
在材质球上添加一些图片后渲染
Primary指的是前面写的漫反射和镜面反射,自发光等
Previous:在纹理的贴图在渲染的时候可能有很多张贴图,要想融合以前的贴图,就需要在这张贴图的基础上再加一张贴图,Privious指的是当前这张贴图与上一张贴图进行的混合。
Constant:在纹理上加一个颜色的混合
SubShader{ Pass{ Color[_MainColor] SetTexture[_MainTexture]{ constantColot[_MainColor] //当需要图片只跟一个颜色进行混合的时候用到constant combine Constant-Texture //combine Primary+Texture Double }可以用作给一个角色换皮肤,中间有一个平滑的过渡 // SetTexture[_MainColor]{ constantColor[_LerpColor] combine Texture lerp(Constant) Previous } } }
设置完Shader后,用脚本实现代码如下:
public class SkipLerp : MonoBehaviour { private MeshRenderer meshRenderer; ptivate float targetAlpha = 0; private float speed = 3f; void Awake(){ meshRender = GetComponent<MeshRenderer>(); } void Update(){ if(Input.GetButtonDown(0)){ if(targetAlpha ==0){ targetAlpha = 1; }else{ targetAlpha = 0; } //获取插值颜色 Color currentColor = meshRenderer.material.GetColor("_LerpColor"); //计算下一帧的Alpha值 float currentAlpha = Mathf.Lerp(currentColor.a, targetAlpha, Time.deltaTime*speed); //设置新的Alpha currentColor.a = currentAlpha; //设置新的颜色值 meshRenderer.material.SetColor("_LerpColor"); } } }
AlphaText:每个像素的透明度是不一样的,同通过Alpha测试可以调节渲染什么样的透明度
在项目中可以在死亡动画结束后进行融解,然后再销毁(需要纹理贴图有一个透明度的区别)
Pass{ //表示当前纹理大于_AlphaRange的进行渲染 AlphaText Greater[_AlphaRange] }