zoukankan      html  css  js  c++  java
  • 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]
    }
    

      

      

  • 相关阅读:
    js页面滚动定位
    函数定义
    __proto__和prototype
    数组操作
    mysql中 group_concat函数在oracle中使用
    字符串里有字典转列表
    处理 Unicode转汉字编码问题
    Key没有引号的K-V格式字符串,怎么转换成Json/dict
    httpx
    appium +夜神模拟器
  • 原文地址:https://www.cnblogs.com/xingyunge/p/6770682.html
Copyright © 2011-2022 走看看