Shader 入门精要笔记(4)

  在Unity中Shader需配合材质使用(Material)一个常见的流程是:1.创建一个材质;2.创建一个Unity Shader,并把它赋值给创建的材质3.把材质赋给要渲染的对象4.在材质面板中调整Unity Shader的属性,得到最终满意的效果.

Shader lab :Unity专门为Shader 服务的语言,它使用了一些嵌套在花括号内部语义来描述Unity Shader文件的结构。包括许多渲染所需的数据,例如 Properties 语义定义着色器所需的各种属性,属性会暴露在Shader面板中。一个Unity Shader的基础结构为:

    Shader "ShaderName"{

          Properties{

                 //属性

                         }

                       SubShader{

                                         //显卡A使用的子着色器

                                         }

                        SubShader{

                                           //显卡B使用的子着色器

                                           }

                                Fallback "VertexLit"

Unity在背后会根据使用的平台吧这些结构编译成真正的代码和Shader文件,开发者只需和Unity Shader 打交道即可

Properties语义块包含一系列属性:

 Properties{

    Name ("display name,PropertyType")  = DefaultValu

    Name ("display name,PropertyType")  = DefaultValu

//更多属性

}

如果我们需要在Shader中访问它们,需使用每个属性的名字(name)。属性的名字通常由下划线开始,显示的名称则是出现在材质面板上的名字。我们还需为每个属性指定它的类型,和默认值。

Shader "Custom/ShaderLabProperties"

 Properties{

 //Number and Slides

        _Int ("Int",Int) = 2

       _Float ("Float",Float) = 1.5

       _Range("Range",Range(0.0,5.0)) = 3.0

//Colors and Vectors

       _Color("Colro",Color) = (1.0,1.0,1.0,1.0)

       _Vertex("Vertex",Vertex)= (2.0,3.0,6.0,1.0)

//Textures

      _2D("2D",2D) = ""{}

      _Cube ("Cube",Cube) = "white"{}

     _3D ("3D",3D) = "Black"{}

}

FallBack "Diffuse"

}

注意:Properties语义块的作用仅是为了让这些属性可以出现在材质面板中。

SubShader :每一个Unity Shader 文件可以包含多个SubShader语义块,但最少1个。当Unity需要加载这个Shadr时会扫描所有SubShader语义块,然后选择一个能够在目标平台上运行的SubShader。如果不支持的话,Unity就会使用FallBack语义指定的Unity Shader。

SubShader语义块包含的定义通常如下:

SubShader{

     //可选的

      [Tags]

      //可选的

       [RenderSetup]

       Pass{

       }

     //Other Passes

}

SubShader中定义了一系列Pass以及可选的状态([RenderSetup])和标签([Tags])设置.每个Pass定义了一次完整的渲染流程,但如果Pass的数目过多,往往会造成渲染性能的下降。因此,我们应尽量使用最小数目的Pass状态和标签同样可以在Pass中声明,SubShader中的一些标签设置是特定的。它与Pass中使用的标签是不一样的,如果我们在SubShader中进行了设置,将会用于所有的Pass。Shaderlab中常见的渲染设置为:Cull 设置指令:Cull Back| Front | Off    解释:设置剔除模式:剔除背面/正面/关闭剔除。ZTst 设置指令: ZTest Less Greater | LEqual | GEqual | NotEqual | Always. 解释: 设置深度测试时使用的函数。 ZWrite 设置指令: ZWrite On | Off 解释:开启/关闭深度写入。 Blend 设置指令: Blend SrcFaactor DstFactor 解释:开启并设置混合模式 。当在SubShader块中设置上述渲染状态时,将会应用到所有Pass,如果不想的话,可以在Pass语义块中单独进行上面设置。SubShader的标签是一个 键值对 它的键和值都是字符串类型。标签结构如下:

Tags{"TagNamel" = "Valuel" "TagName2" = "Valuel2"}

Pass 语义块

 

Pass{

        [Name]

        [Tags]

        [RenderSetup]

         // Other code

       }

在Pass定义该Pass名称

    Name "MyPassName"

通过这个名称,我们可以使用ShaderLab的UsePass命令来直接使用其他Unity Shader 的Pass:

  UsePass  "MyShader/MYPASSNAME"

这样可以提高代码的复用性。Unity内部会把所有Pass 的名称转换为大写字母的表示,在使用Pass命令时必须使用大写形式的名字。

Fallback "name"

//或者

Fallback Off

这是指如果上面所有Pass都不能在设备上运行,那就使用最低级的命令生成Shader.

 

posted @ 2021-08-11 22:19  任葳  阅读(126)  评论(0)    收藏  举报