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

  

  

Shader基础(固定管线着色器)的更多相关文章

  1. Shader开发之三大着色器

    固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader &qu ...

  2. (译)Minimal Shader(最小的着色器)

    (原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basi ...

  3. OpenGL 4.0的Tessellation Shader(细分曲面着色器)

    细分曲面着色器(Tessellation Shader)处于顶点着色器阶段的下一个阶段,我们可以看以下链接的OpenGL渲染流水线的图:https://www.opengl.org/wiki/Rend ...

  4. 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但

    片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.

  5. Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合

    一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...

  6. (原)Unreal渲染模块 管线 - 着色器(1)

    @author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...

  7. Unity3D学习笔记(三十四):Shader着色器(1)

    一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似.   GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模 ...

  8. 第二章 Unity Shader基础

    [TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...

  9. 编写Unity3D着色器的三种方式

    不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...

随机推荐

  1. tpc资料汇总

    官方资料 TPC官网  http://www.tpc.org/ 配置文档 大家一起来测试,benchmark起来(MySQL下的TPC-C,TPC-H,TPC-W)  http://www.itpub ...

  2. 学习笔记:webpack

    http://wiki.jikexueyuan.com/project/webpack-handbook/ Webpack 中文指南 http://www.itzjt.cc/2017/04/09/we ...

  3. 16.纯 CSS 创作一个渐变色动画边框

    原文地址:https://segmentfault.com/a/1190000014785816 感想:边框是伪元素::after来的: HTML代码: <div class="box ...

  4. 转:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而 ...

  5. django之urlresolver

    >>> from django.utils.regex_helper import normalize >>> bits=normalize(r'^static/( ...

  6. <面试> PHP 常见算法

    排序算法 1. 冒泡排序(数组排序) 基本思想:对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样每遍历一次,最小的数值就 ...

  7. 选择、操作web元素-2

    11月3日 等待web元素的出现 例子:百度搜索松勤网,点击操作后不等待页面刷新,下面选择页面元素的时候,该元素还是未出现 sleep方案的弊病:固定的等待时间,导致测试用例执行时间很长 为什么cli ...

  8. fb发布打包外部资源

    将资源放在src文件夹下面即可 然后在打包那就会看到资源,勾上即可

  9. 树莓派安装centos7

    引用:https://blog.csdn.net/elesos/article/details/80514659 1,格式化 https://www.sdcard.org/downloads/form ...

  10. Redis使用认证密码登录

    Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...