4.认识Shaderlab

写shader我们需要和unity提供的一种专门为unityshader服务的语言——ShaderLab。该语言是unity提供的渲染抽象层

一个unityshader基本结构如下
Shader"custom/myshader"{
    Properties{
        //属性
    }
    SubShader {
        //显卡A使用的子着色器
    }
    SubShader {
        //显卡B使用的子着色器
    }
    FallBack "VertexLit"
}
属性Properties
Properties {
        // Numbers and Sliders
        _Int ("Int", Int) = 2
        _Float ("Float", Float) = 1.5
        _Range("Range", Range(0.0, 5.0)) = 2.0
        // Colors and Vectors
        _Color ("Color", Color) = (1,1,1,1)
        _Vector ("Vector", Vector) = (5, 3, 6, 1)
        // Textures
        _2D ("2D", 2D) = "" {}
        _Cube ("Cube", Cube) = "white" {}
        _3D ("3D", 3D) = "black" {}
    }

声明这些属性是为了在材质面板中能够方便的调整材质属性,属性的名字通常有一个下划线开头,引号里面的是在材质面板显示的名字,对于int float range默认值是一个数字,对于color,vector是一个四维向量。2D,CUbe,3D这三种纹理类型默认值通过一字符串和花括号来制定,
以下是材质面板展示的属性

4.认识Shaderlab_第1张图片
01.png

Subshader

每一个unityshader可以包含多个subshader,但至少有一个,unity会根据不同显卡显示不同的subshader,
基本结构:

    SubShader {
        Tags 
        Randersetup 
        Pass {
            
        }
    }

subshader中定义了一些可选的渲染状态和标签设置,meigepass定义了一次完整的渲染流程,pass过多渲染性能下降,

  1. 状态和标签也可以在pass中声明,不同的是subshader中一些标签设置时特定的
  2. 状态设置如果在subshader中设置,那将作用于所有的pass
  • 渲染状态设置
渲染状态设置名称 指令 含义
cull back,front,off 剔除模式背面。正面,关闭
ZTest LessGreater,LEqual,GEqual,Equal,NotEqual,Always 设置深度测试时使用的函数
ZWrite On,Off 开启关闭深度写入
Blend SrcFactor DstFactor 开启并设置混合模式

当subshader设置了上述渲染状态时,将会应用到所有pass,

  • 标签

subshader的标签是一个键值对,

标签类型 含义 eg
Queue 控制渲染顺序 Tags { "Queue" = "Geometry" }
RenderType 将shaders分类为多个预定义组,Unity可以运行时替换符合特定RenderType的所有Shader。 Tags { "RenderType"="Opaque" }
DisableBatching 禁用批处理 Tags { "RenderType"= “True”
ForceNoShadowCasting 强制无阴影投射 Tags { "ForceNoShadowCasting"= “True”
IgnoreProjector 忽略投影 Tags { "IgnoreProjector"= “True”
CanUseSpriteAtlas 可以使用Sprite图集 Tags { "CanUseSpriteAtlas"= “True”
PreviewType 预览类型 Tags { "PreviewType"= “Plane”
Pass

结构如下:

        Pass {
            Name
            Tags
            RenderSetup
        }

pass同样可使使用标签,

标签 含义 eg
LightMode 定义该pass在渲染流水线中的角色 Tags { "LightMode"="ForwardBase" }
RequireOptions 指定满足某些条件执行该pass Tags { "RequireOptions "="SoftVegetation" }
Fallback

告诉unity、如果上述subshader都不能执行,那就执行这个低级的shader
点击关注我的微博,给大家带来欢乐

你可能感兴趣的:(4.认识Shaderlab)