Shaders Overview

    Unity中有三种编写Shader的方式:

表面着色器(Surface Shaders)

    如果你的Shader需要灯光和阴影的作用,Surface Shaders是最佳选择。使用Surface Shaders可以很容易写出代码简洁,内容复杂的Shader——它是集成在Unity光照管道中的一个高级抽象。大多数的Surface Shaders自动支持前向(forward)和延迟(deferred)光照。你写的Surface Shaders最终是从两条途径中产生的,一部分是Cg/HLSL代码,更多的代码是从里面自动生成的。

    如果你的Shader不用光照做任何事情,就不要使用Surface Shaders。对于图像效果(Image Effects)和很多特殊效果(special-effect)的Shader,Surface Shaders并不是最合适的选择,因为它们会毫无理由的进行大量的光照计算。

顶点和片段着色器(Vertex and Fragment Shaders)

    Vertex and Fragment Shaders是必要的,如果你的Shader不需要和光照交互,或者你需要非常炫的效果时,Surface Shaders是不能处理的。这种编写Shader程序的方式,是实现你需要效果最灵活的方式(即使Surface Shaders会自动转换成Vertex and Fragment Shaders),但那是有代价的:你必须写更多的代码,而且很难使它和光照产生交互。这些Shader脚本也是使用Cg/HLSL编写的。

固定功能着色器(Fixed Function Shaders)

    Fixed Function Shaders是为那些不支持可编程Shader的旧硬件编写的。为了保证运行在旧硬件设备或简单移动平台上的游戏能够合理的渲染一些内容,可能会将Fixed Function Shaders作为你酷炫的Vertex and Fragment Shaders的第n级回退(fallback)使用。Fixed Function Shaders是完全使用ShaderLab语言编写的,它和微软的.FX文件或NVIDIA的CgFX很想。

ShaderLab

    无论选择上面的哪种方式,实际Shader代码的内容总是被包装在ShaderLab之中,ShaderLab是用来组织Shader结构的。它看起来就像这样:

Shader "MyShader" {
    Properties {
        _MyTexture ("My Texture", 2D) = "white" { }
        // other properties like colors or vectors go here as well
    }
    SubShader {
        // here goes the 'meat' of your
        // - surface shader or
        // - vertex and fragment shader or
        // - fixed function shader
    }
    SubShader {
        // here goes a simpler version of the SubShader above that can run on older graphics cards
    }
}

    建议你先去ShaderLab reference里面了解下ShaderLab语法的基本概念,然后在阅读后面的教程。