4.认识Shaderlab

作者: 一壶开心酒 | 来源:发表于2017-08-13 22:12 被阅读22次

    写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这三种纹理类型默认值通过一字符串和花括号来制定,
    以下是材质面板展示的属性

    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

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