Unity Shader 之 Properties、SubSha

作者: 土豆写书 | 来源:发表于2018-11-15 01:22 被阅读8次

    一、Shader结构语法

    Shader "ShaderName" 
    {
        Properties{   
                //属性
        }
    
          SubShader{
               Pass{
                 //一次渲染流程
               }
              //Other Pass
        }
    
        //Other SubShader
         Fallback  "VertexLit"
    }
    

    ["ShaderName"]: Shader的名字,一般用“/”控制在材质面板中出现的位置。例如 Custom/MyShader
    [Properties]:: 外部数据入口,通过材质"沟通"。
    [SubShader]:每个Shader可以包含多个SubShader,至少一个。
    [Pass]: 一次完整的渲染流程,允许多个,但是会影响效率。
    [Fallback:]当所有SubShader都不支持的时候,会使用这里指定的Shader。





    二、Properties语法

    Properties{
      Name ("display name", PropertyType) = DefaultValue
      Name ("display name", PropertyType) = DefaultValue
      Name ("display name", PropertyType) = DefaultValue
     //... 其他属性
    }
    

    Name:变量名
    diplay name:显示的名称,出现在材质面板,通常下划线"_"开头
    DefaultValue:默认值
    PropertyType:指定类型,如下表

    属性类型 例子 类别
    Int _level("Leve",Int) =2 数值
    Float _alpha("Alpha",Float)= 0.8 数值
    Range _range("Power",Range(0,0,5.0))=3.0 数值
    Color _Color("Color",Color)=(1,1,1,1) 数值
    Vector _Vector("VECTOR" ,Vector) = (1,4,7,8) 数值
    2D _2D("Texture2D纹理",2D)=""{} 纹理
    3D _3D("Texture3D纹理",3D)="black"{} 纹理
    Cube _Cube("Cube",Cube)="White"{} 纹理





    三、SubShader语法

    SubShader{
           Tags{"TageName1"="Value1"    "TageName2"="Value2"}//[Tage] 标签(可选)
           Cull //[RenderSetup] 状态(可选)
           Pass{//一次完整的渲染流程
           }
         //Other Pass
    

    [Tages]:是一个键值对,键和值都是字符串类型,如何、何时渲染这个对象。
    [RenderSetup]: 设置显卡的渲染状态,例如混合、深度测试。
    [Pass]:渲染流程,允许定义多个,每次渲染都会逐个流程执行。为了避免性能下降,尽量使用最少数目的Pass。

    SubShader [Tage] 说明 例子
    Queue 控制渲染顺序,保证所有透明物体在不透明物体后面渲染 Tags{"Queue" = "Transparent"}
    RenderType 着色器分类 Tags{"RenderType"="Opaque"}
    DisableBatching SubShader指明是否使用批处理 Tags{"DisableBatching "="True"}
    ForceNoShadowCasting 是否投射阴影 Tags{"ForceNoShadowCasting"="True"}
    IgnoreProjector 是否受到Projector影响,通常用于半透明物体 Tags{"IgnoreProjector "="True"}
    CanUseSpriteAtlas 用于Sprite时,请设置为"False" Tags{"CanUseSpriteAtlas" = "False"}
    PreviewType 指明材质如何预览,"Plane"或者"SkyBox" Tags{"PreviewType "="Plane"}
    SubShader[RenderSetup] 设置指令 解释
    Cull Cull Back| Front |Off 设置剔除模式:剔除背景|正面|关闭剔除
    ZTest ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always 设置深度测试时使用的函数
    ZWrite ZWrite On|Off 开启/关闭深度写入
    Blend Blend SrcFactor DstFactor 开启并设置混合模式





    四、Pass语法

    Pass{
      Name "MyPassName"//[Name] 可选
      LightMode//[Tags] 可选
      Cull//[RenderSetup] 可选
      //other code
    }
    

    [Name]: Pass的名称,被其他Shader调用时候会用到。
    [Tags]:渲染物体的方式,下面有表格详细说明。
    [RenderSetup]:渲染状态,和SubShader RenderSetup 完全一样。

    Pass[Tags] 说明 例子
    LightMode 定义该Pass在Unity的渲染流水线中的角色 Tags{"LightMode"="ForwardBase"}
    RequireOptions 用于指定当满足条件才执行Pass Tags{”RequireOptions“=”SoftVegetation“}
    • UsePass: 复用其他Shader中的Pass。例如:UsePass "MyShader/MYPASSNAME"
    • GrabPass:抓取屏幕并将结果存储在一张纹理中。





    五、Fallback

    指定最后处理的Shader(以上的SubShader都不能运行的时候), Fallback还会印象阴影投射。
    语法:
    Fallback Off //没有阴影
    Fallback "ShaderName"
    Fallback "VertexLit"
    Fallback "Diffuse"







    最后推介辅助插件
    打开 Visual Studio “工具”→“扩展和更新”→“联机 Visual Studio Marketplace”搜索
    Shader Unity Support
    Visual Studio 2017 Tools for Unity

    鄙人才疏学浅,有出入的地方非常感谢能帮忙指正。:)

    相关文章

      网友评论

        本文标题:Unity Shader 之 Properties、SubSha

        本文链接:https://www.haomeiwen.com/subject/ycbsfqtx.html