学习unity shader有两个月了,最近的两个月总是有一些工程项目,占用我大量的学习时间,因此总是停停学学。今天虚拟校园工程开好完成了,就有时间吧自己学到的shader,总结一下。
这是两个_jianbian纹理图片:
实现的效果如下:
代码如下
Shader "Custom/katongMyLihModel" {
properties{
_MainTex("主要纹理",2D)="white"{}
_Detial("细节纹理",2D)="white"{}
_Bump("法线贴图",2D)="white"{}
_jianbian("渐变纹理",2D)="white"{}
_RimColor("边缘颜色",Color)=(0.1,0.3,0.5,1)
_RimPower("发光强度",Range(0.1,3))=0.5
}
SubShader{
Tags{"RenderType"="Opaque"}
CGPROGRAM
#pragma surface surf MyLightModel
sampler2D _jianbian;
inline fixed4 LightingMyLightModel(SurfaceOutput s,fixed3 lightDir,fixed atten){
//简单的漫反射 法线和灯光点积
fixed diff=dot(s.Normal,lightDir);
//增强光强
diff=diff*0.5+0.5;
//获得渐变颜色条
half3 ramp=tex2D(_jianbian,float2(diff,diff)).rgb;
//定义变量
half4 yanse;
//_LightColor0内置的灯光颜色变量
yanse.rgb=s.Albedo*_LightColor0.rgb*ramp*atten*2;
yanse.a=s.Albedo;
return yanse;
}
struct Input{
float2 uv_MainTex;
float2 uv_Bump;
float2 uv_Detial;
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _Bump;
sampler2D _Detial;
float4 _RimColor;
float _RimPower;
void surf(Input IN,inout SurfaceOutput o){
o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;
//细节纹理
o.Albedo*=tex2D(_Detial,IN.uv_Detial).rgb*2;
//法线贴图
o.Normal=UnpackNormal(tex2D(_Bump,IN.uv_Bump));
//normalize()单位向量,视角方向和法线求点积,返回【0,1】一个数值,用1减去。是为了角度越大,rim值越大,光线越多。
fixed rim=1-saturate(dot(normalize(IN.viewDir),o.Normal));
//幂运算
rim=pow(rim,_RimPower);
//发光
o.Emission=_RimColor.rgb*rim;
}
ENDCG
}
}