Unity Shader 入门精要-第二章 Unity Shader基础

声明:这里是个人学习《Unity Shader入门精要》这本书的学习笔记,图片文字都是书上抄下来的(文字精简了一下,图片都是书上照搬的)。并非个人原创作品,仅供学习交流使用。 


  • 3-1 Unity Shader 概述

    • 3-1-1 一对好兄弟:材质和Unity Shader
      • 在unity中我们需要配合使用材质和unity shader 才能达到需要的效果。

        Unity Shader 入门精要-第二章 Unity Shader基础_第1张图片

    • 3-1-2 Unity中的材质
      • unity的可视化材质:

        Unity Shader 入门精要-第二章 Unity Shader基础_第2张图片

    • 3-1-3 unity中的shader
      • 在Unity5.2以及以上版本中,Unity一共提供了4种unity shader 模板:
        • Standard surface shader:包含了标准光照模型的表面着色器模板
        • Unlit shader:不包含光照(但包含雾效)的基本的顶点/片元着色器
        • Image effect shader:为我们实现各种屏幕后处理效果提供了一个基础模版
        • Compare Shader:产生一种特殊的shader文件,利用GPU的并行性来进行一些与常规渲染流水线无关的计算。
      • 设置Unity shader➡️

        Unity Shader 入门精要-第二章 Unity Shader基础_第3张图片

        • 图3-4:
          • Default Map:指定该unity shader使用的默认纹理
        • 图3-5:
          • show generated code:打开一个新的文件,该文件里将显示unity在背后为该表面着色器生成的顶点/片元着色器
          • Compile and show code:下拉列表检查unity shader针对不同图像编程接口

  • 3-2 Unity Shader 的基础:shaderlab

    • 什么shaderlab?
      • 在unity中,所有的unity shader都是使用shaderlab来编写的。Unity Shader 入门精要-第二章 Unity Shader基础_第4张图片

      • 一个unity shader的基础结构如下:Unity Shader 入门精要-第二章 Unity Shader基础_第5张图片
      • 注意⚠️:文本中Properties、SubShader、Fallback等,为shaderlab的语义。这些语义定义了unity shader的结构,从而帮助unity分析unity shader文件,以便进行正确的编译。
  • 3-3 unity shader的结构

    • 3-3-1 给我们的shader起个名字
      • 每个unity shader文件的第一行都需要通过shader语义来指定unity shader的名字。
      • 例如,“myshader”。通过在名字添加斜杠/,控制unity shader 在材质版中出现的位置。
      • Unity Shader 入门精要-第二章 Unity Shader基础_第6张图片
    • 3-3-2 材质和unity shader的桥梁:Properties
      • Properties语义中包含了一系列属性(property),这些属性会出现在材质面板中。Unity Shader 入门精要-第二章 Unity Shader基础_第7张图片
      • Properties常见属性类型:Unity Shader 入门精要-第二章 Unity Shader基础_第8张图片
        • 以下代码给出了一个展示所有属性类型的例子:

         Unity Shader 入门精要-第二章 Unity Shader基础_第9张图片

        • 在该代码下显示出的材质结果:

       Unity Shader 入门精要-第二章 Unity Shader基础_第10张图片

    • 2-3-3 重量级成员:SubShader
      每个unity shader 文件可以包含多个subshader语义块,但至少要有一个
      • 当unity需要加载这个unity shader时,unity会扫描所有的subshader语义块,然后选择第一个能在目标平台运行的subshader。
      • subshader语义块中包含的定义通常如下:

        Unity Shader 入门精要-第二章 Unity Shader基础_第11张图片

        • subshader中定义了一系列Pass以及可选的状态和标签设置。每一个pass定义了一次完整的渲染流程。
      • 状态设置
        • shaderlab提供的渲染设置

          Unity Shader 入门精要-第二章 Unity Shader基础_第12张图片

        • 当在subshader中设置了上述渲染状态时,将会应用到所有的pass。
      • subshader的标签(Tag)
        • Tag是一个键值对(Key/Value Pair),他们是subshader和渲染引擎之间沟通的桥梁。
        • 标签的结构:
        • 标签类型:Unity Shader 入门精要-第二章 Unity Shader基础_第13张图片
      • Pass语义块
        • Pass语义块包含的语义如下:
        • 首先,我们可以在 Pass中定义该Pass的名称,例如:

        • 通过这个名称,我们可以使用SahderLab的UsePass命令来直接使用其他Unity Shader中的Pass。例如:

        • 这样可以提高代码的复用性。
        • 使用UsePass命令时必须使用大写形式的名字。
        • Pass同样可以设置标签,但它的标签不同于SubShader的标签。这些标签也是用于告诉渲染引擎我们希望怎么样来渲染该物体。

          Unity Shader 入门精要-第二章 Unity Shader基础_第14张图片

        • 特殊的Pass:
          • UsePass:可以使用该命令来复用其他Unity Shader中的Pass。
          • GrabPass:该Pass负责抓取屏幕并将结果储存在一张纹理中,以用于后续的Pass处理。
    • 3-3-4:留一条后路:FallBack
      • 紧跟再各个SubShader语义块后面的,可以时一个Fallback指令。它的语义如下:

      • 通常情况下,我们不需要自己专门实现一个Pass,因为Fallback使用的内置Shader中包含了这样一个通用的Pass。因此,为每个Unity Shader正确设置Fallback是非常重要的。

  • 3-4 Unity Shader 的形式

    • 在Unity中,我们可以使用下面三种形式来编写Unity Shader。而不管使用那种形式,真正意义上的Shader代码都需要包含在ShaderLab语义块中,如下图所示:

      Unity Shader 入门精要-第二章 Unity Shader基础_第15张图片

    • 3-4-1 Unity的宠儿:表面着色器
      • 表面着色器(Surface Shader)是Unity自己创在的一种着色器代码类型。
      • 一个非常简单的表面着色器示例代码如下:

        Unity Shader 入门精要-第二章 Unity Shader基础_第16张图片

    • 3-4-2 最聪明的孩子:顶点/片元着色器
      • 在Unity中,我们可以使用CG/HLSL语言来编写顶点/片元着色器(Vertex/Fragment Shader)。它们更加复杂,但灵活性也跟高
      • 一个非常简单的顶点/片元着色器示例代码如下:

        Unity Shader 入门精要-第二章 Unity Shader基础_第17张图片

      • 和表面着色器类似,顶点/片元着色器的代码也需要定义在CGPROFRAM和ENDCG之间。但不同的是,顶点/片元着色器是写在Pass语义块中,而非SubShader内的。
    • 3-4-3 被抛弃的角落:固定函数着色器
      • 对于一些较旧的设备,不支持可编程管线着色器。因此,我们需要使用固定函数着色器(Fixed Function Shader)来完成渲染。这些着色器往往只可以完成一些非常简单的效果。
      • 一个非常简单的固定函数着色器示例代码如下:

        Unity Shader 入门精要-第二章 Unity Shader基础_第18张图片

      • 由于绝大多数CPU都支持可编程的渲染管线,这种固定渲染管线的编程方式已经逐渐被抛弃了。实际上,在Unity5.2中,所有固定函数着色器都会在背后被Unity编译成对应的顶点/片元着色器,因此,真正意义上的固定函数着色器已经不存在了。
    • 3-4-4 选择哪种Unity Shader形式
      • 除非你有非常明确的需求必须要使用固定函数着色器,例如需要在非常旧的设备上运行你的游戏(这些设备非常少见),否则请使用可编程管线的着色器,即表面着色器或顶点/片元着色器。
      • 如果你想和各种光源打交道,你可能更喜欢使用表面着色器,但需要小心它在移动平台的性能表现。
      • 如果你需要使用的光照数目非常少,例如只有一个平行光,那么使用顶点/片元着色器是一个更好的选择。
      • 最重要的是,如果你有很多自定义的渲染效果,那么请选择顶点/片元着色器。
  • 3-6 解答疑惑

    • 3-6-1 Unity Shader不等于真正的Shader
      • Unity Shader并不等同于第二章所讲的Shader。在Unity中,Unity Shader实际上指的就是一个ShaderLab文件。
      • 在Unity Shader(或者说是ShaderLab文件)里,我们可以做的事情远多于一个传统意义上的Shader。
        • 在传统的Shader中,我们仅可以编写特定类型的Shader,例如顶点着色器、片元着色器等。而在Unity Shader中,我们可以在同一个文件里同时包含需要的顶点着色器和片元着色器代码。
        • ·在传统的Shader 中,我们无法设置一些渲染设置,例如是否开启混合、深度测试等,这些是开发者在另外的代码中自行设置的。而在 Unity Shader中,我们通过一行特定的指令就可以完成这些设置。
        • 在传统的Shader 中,我们需要编写冗长的代码来设置着色器的输入和输出,要小心地处理这些输入输出的位置对应关系等。而在 Unity Shader中,我们只需要在特定语句块中声明一些属性,就可以依靠材质来方便地改变这些属性。而且对于模型自带的数据(如顶点位置、纹理坐标、法线等),Unity Shader也提供了直接访问的方法,不需要开发者自行编码来传给着色器。
      • 可以说,Unity Shader提供了一种让开发者同时控制渲染流水线中多个阶段的一种方式,不仅仅是提供Shader代码。
    • 3-6-2 Unity Shader和CG/HLSL之间的关系
      • 对于表面着色器和顶点/片元着色器,我们可以在Shader Lab内部嵌套CG/HLSL语言来编写这些着色器代码。这些CG/HLSL代码是嵌套在CGPROCRAM和ENDCG之间的。
      • 通常,CG的代码片段是位于Pass语义块内部的,如下图所示:

        Unity Shader 入门精要-第二章 Unity Shader基础_第19张图片

      • 可以说,从本质上来讲,Unity Shader只有两种形式:顶点/片元着色器和固定函数着色器(在Unity 5.2 以后的版本中,固定函数着色器也会在背后被转化成顶点/片元着色器,因此从本质上来说Unity中只存在顶点/片元着色器)。
      • 正如在3.1.3节中看到的一样,我们可以在 Unity Shader 的导入设置面板上查看这些编译后的代码,查看这些代码有助于进行Debug或优化等。

        Unity Shader 入门精要-第二章 Unity Shader基础_第20张图片

      • 但当发布游戏的时候,游戏数据文件中只包含目标平台需要的编译代码,而那些在目标平台上不需要的代码部分就会被移除。例如,当发布到 Mac OS X平台上时,DirectX对应的代码部分就会被移除。

目录

3-1 Unity Shader 概述

3-2 Unity Shader 的基础:shaderlab

3-3 unity shader的结构

3-4 Unity Shader 的形式

3-6 解答疑惑


你可能感兴趣的:(Unity,Shader,入门精要,unity,游戏引擎)