【《Unity着色器和屏幕特效开发秘笈》】学习整理:第二章(1)

    第二章的内容比较杂乱,所以打算分几次来记录。

第一个着色器

    下面是一个最简单的表面着色器:
Shader "MyShader/Diffuse"
{
    Properties{
        _Color("Color", Color) = (1, 1, 1, 1)
    }

    SubShader{
        Tags { "RenderType" = "Opaque" }

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        struct Input{
            float2 uv_MainTex;
        };

        fixed4 _Color;

        void surf(Input IN, inout SurfaceOutputStandard o)
        {
            o.Albedo = _Color.rgb;
        }
        ENDCG
    }
    FallBack "Diffuse"
}   //end shader
    此着色器使用的光照模型和Unity5中的默认标准着色器一样,但是只对材质的颜色进行了控制。

着色器对比

    如图中所示,左边材质使用的就是代码块中的shader。右边使用的是默认的Standard的材质。由于白色不明显,所以特意全部设置为纯红色。

表面着色器的光照模型和输出结构体

    表面着色器中提供了不同的光照模型可供选择,此外还可以定义个性化的光照模型。但是,不同的光照模型所使用的表面着色器的输出结构体不同。因为不同的光照模型需要不同的参数进行计算,而输出结构体的作用就是把这些参数传入光照模型中。如果光照模型和输出结构体不对应会报错。

    以下是Unity提供的表面着色器光照模型所对应的结构体。
//使用Lambert和BlinnPhong光照模型时的输出结构体
struct SurfaceOutput
{
    fixed3 Albedo;     //表示材质的漫反射颜色
    fixed3 Normal;     //如果切面法线
    fixed3 Emission;   //表示材质自发光颜色
    fixed Alpha;       //表示透明度
    half Specular;     //表示高光亮度,取值范围0到1
    fixed Gloss;       //表示光泽度(光强度)
};
//使用Standard光照模型时的输出结构体
struct SurfaceOutputStandard
{
    fixed3 Albedo;
    fixed3 Normal;
    half3 Emission;    //需要注意此处与SurfaceOutput中的类型的不同
    fixed Alpha;
    half Occlusion;    //表示遮挡率,默认是1
    half Smoothness;   //表示光滑度,0表示粗糙,1表示光滑
    half Metallic;     //金属性,0表示非金属,1表示金属
};
//使用StandardSpecular光照模型时的输出结构体
struct SurfaceOutputStandardSpecular
{
    fixed3 Albedo;
    fixed3 Normal;
    half3 Emission;
    fixed Alpha;
    half Occlusion;
    half Smoothness;
    fixed3 Specular;    //表示表示高光颜色,
                        //与SurfaceOutput结构体中的Specular属性不同,
                        //这里可以指定一种颜色,而非单一值。
};

材质对比

    对第一部分shader代码中的光照模型和结构体替换后,得到了上面图中的对比。至少以我的感触来说是没又觉得有什么不同,而之所以最右面的Unity默认材质球和第一部分图片中的样子不一样,是因为默认材质球中有对Smoothness = 0.5的设置,将其调为0以后即为上图效果。

猜你喜欢

转载自blog.csdn.net/EverNess010/article/details/77185535