第二章的内容比较杂乱,所以打算分几次来记录。
第一个着色器
下面是一个最简单的表面着色器:
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"
}
此着色器使用的光照模型和Unity5中的默认标准着色器一样,但是只对材质的颜色进行了控制。
如图中所示,左边材质使用的就是代码块中的shader。右边使用的是默认的Standard的材质。由于白色不明显,所以特意全部设置为纯红色。
表面着色器的光照模型和输出结构体
表面着色器中提供了不同的光照模型可供选择,此外还可以定义个性化的光照模型。但是,不同的光照模型所使用的表面着色器的输出结构体不同。因为不同的光照模型需要不同的参数进行计算,而输出结构体的作用就是把这些参数传入光照模型中。如果光照模型和输出结构体不对应会报错。
以下是Unity提供的表面着色器光照模型所对应的结构体。
struct SurfaceOutput
{
fixed3 Albedo;
fixed3 Normal;
fixed3 Emission;
fixed Alpha;
half Specular;
fixed Gloss;
};
struct SurfaceOutputStandard
{
fixed3 Albedo;
fixed3 Normal;
half3 Emission;
fixed Alpha;
half Occlusion;
half Smoothness;
half Metallic;
};
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo;
fixed3 Normal;
half3 Emission;
fixed Alpha;
half Occlusion;
half Smoothness;
fixed3 Specular;
};
对第一部分shader代码中的光照模型和结构体替换后,得到了上面图中的对比。至少以我的感触来说是没又觉得有什么不同,而之所以最右面的Unity默认材质球和第一部分图片中的样子不一样,是因为默认材质球中有对Smoothness = 0.5的设置,将其调为0以后即为上图效果。