Shader基础(固定管线着色器)

在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]
}

  

  

原文地址:https://www.cnblogs.com/xingyunge/p/6770682.html