渐变纹理
可以使用渐变纹理来控制漫反射光照的结果
新的改变
Shader "Custom/RampTextureShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_RampTex ("Ramp Tex", 2D) = "white" {} //渐变纹理
_Gloss ("Gloss", Range(8,255)) = 20
_Specular ("Specular", Color) = (1,1,1,1)
}
SubShader {
Pass{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Color;
sampler2D _RampTex;
float _Gloss;
fixed4 _Specular;
float4 _RampTex_ST;
struct a2v{
float3 normal:NORMAL;
float4 vertex:POSITION;
float4 texcoord:TEXCOORD0;
};
struct v2f{
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos:TEXCOORD1;
float uv:TEXCOORD2;
};
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.vertex,_RampTex);
return o;
}
fixed4 frag(v2f o):SV_Target{
//把法线转换到世界空间并归一化
fixed3 worldNormal = normalize(o.worldNormal);
//获得灯光信息并转换到世界空间并归一化
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(o.worldPos));
//得到环境光信息
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
//半伯特公式计算漫反射
fixed halfLambert = 0.5 * dot(worldNormal,worldLightDir) + 0.5; //把范围映射到[0,-1]
fixed3 diffuseColor = tex2D(_RampTex,fixed2(halfLambert,halfLambert)).rgb * _Color.rgb; //纹理映射获得漫反射颜色
fixed3 diffuse = _LightColor0.rgb * diffuseColor;
//计算高光
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(o.worldPos));
fixed3 halfDir = normalize(worldLightDir + viewDir);
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal,halfDir)),_Gloss);
return fixed4(ambient + diffuse + specular,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}