表面着色器
表面着色器编译指令就像任何其他着色器一样,表面着色器放置在 CGPROGRAM..ENDCG
代码块内。不同之处在于:
- 它必须放在 SubShader 代码块内,不能在 Pass 内。表面着色器本身将编译为多个通道。
- 它使用
#pragma surface ...
指令来指示自己是表面着色器。
#pragma surface
指令为:
# pragma surface surfaceFunction lightModel [optionalparams]
表面着色器的标准输出结构:
struct SurfaceOutput
{
fixed3 Albedo; // 漫射颜色
fixed3 Normal; // 切线空间法线(如果已写入)
fixed3 Emission;
half Specular; // 0..1 范围内的镜面反射能力
fixed Gloss; // 镜面反射强度
fixed Alpha; // 透明度 Alpha
};
内置标准光照模型:
struct SurfaceOutputStandard
{
fixed3 Albedo; // 基础(漫射或镜面反射)颜色
fixed3 Normal; // 切线空间法线(如果已写入)
half3 Emission;
half Metallic; // 0=非金属,1=金属
half Smoothness; // 0=粗糙,1=平滑
half Occlusion; // 遮挡(默认为 1)
fixed Alpha; // 透明度 Alpha
};
标准镜面反射光照模型:
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo; // 漫射颜色
fixed3 Specular; // 镜面反射颜色
fixed3 Normal; // 切线空间法线(如果已写入)
half3 Emission;
half Smoothness; // 0=粗糙,1=平滑
half Occlusion; // 遮挡(默认为 1)
fixed Alpha; // 透明度 Alpha
};
例子:
Shader "Custom/test9"
{
Properties
{
_Color ("Color",Color) = (0,0,0,0) //漫反射颜色
_MainTex ("Texture",2D) = "White"{} //纹理贴图
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
struct Input
{
float2 uv_MainTex;
};
float4 _Color;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb * _Color.rgb; //cube既有颜色又有材质贴图
}
ENDCG
}
FallBack "Diffuse"
}
法线贴图:
Shader "Custom/test9"
{
Properties
{
_NormalMap ("NormalMap",2D) = "bump"{} //凹凸贴图
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
struct Input
{
float2 uv_MainTex;
};
sampler2D _NormalMap;
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Normal = UnpackNormal(tex2D(_NormalMap,IN.uv_MainTex)); //将法线贴图的像素转换为法线
}
ENDCG
}
FallBack "Diffuse"
}