Shader "hennysky/SurfaceShader001"
{
Properties
{
_MainColor("主颜色",Color) = (1,1,1,1)
_MainTex("主纹理",2D) = ""{}
_NormalTex("法线纹理",2D) = ""{}
_RimColor("边缘高光",Color) = (1,1,1,1)
_RimPower("边缘高光可调节强度",Range(0.1,9.0))=3.0
}
//--------------------------------【子着色器】----------------------------------
SubShader
{
//-----------子着色器标签----------
Tags { "RenderType" = "Opaque" } //标签:渲染非透明物体
//-------------------开始CG着色器编程语言段-----------------
CGPROGRAM //表面着色器的代码段必须放在CGPROGRAM ENDCG中
//【1】光照模式声明:使用兰伯特光照模式
//shader入口 surf入口函数 Lambert光照模式
#pragma surface surf Lambert
//【2】输入结构 可以通过Input输入结构 把模型的一些数据传送shader语言中
//C# 声明struct new
//input就这一个改变结构体会改变输入
struct Input
{
//四元素的颜色值(RGBA)
float4 color : COLOR;
float2 uv_MainTex;
float2 uv_NormalTex;
float3 viewDir;
};
float4 _MainColor;
float4 _RimColor;
float _RimPower;
sampler2D _MainTex;//主纹理
sampler2D _NormalTex;//法线纹理
//【3】表面着色函数的编写
//IN 是输入的模型的数据 inout (C#中out) SurfaceOutput系统内置的结构体
void surf (Input IN, inout SurfaceOutput o)
{
//反射率
// o.Albedo = float3(0.5,0.8,0.3);//(0.5,0.8,0.3)分别对应于RGB分量
//o.Albedo = _MainColor.rgb;//(0.5,0.8,0.3)分别对应于RGB分量
//而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
//贴图
o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb*_MainColor.rgb;
//法线
o.Normal = UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex));
//自发光 边缘高光(描边)
float rim = 1-saturate(dot(normalize(IN.viewDir),o.Normal));
o.Emission = _RimColor*pow(rim,_RimPower);
}
//-------------------结束CG着色器编程语言段------------------
ENDCG
}
//“备胎”为普通漫反射
Fallback "Diffuse"
}
效果