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

来源:互联网 发布:北风网大数据 编辑:程序博客网 时间:2024/06/03 04:09
    第二章的内容比较杂乱,所以打算分几次来记录。

第一个着色器

    下面是一个最简单的表面着色器:
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以后即为上图效果。
阅读全文
0 0
原创粉丝点击