纹理一开始的作用是用以定义物体的颜色,但后面发现纹理可以存储任何表面属性。比如说,使用渐变纹理来控制漫反射光照的结构。在很多卡通风格的渲染中都使用了该技术。
_RampTex实际上是一个一维纹理,因此纹理坐标的u和v方向我们都使用了halfLambert
Shader "MyShader/rampTexture"
{
Properties
{
_RampTex("RampTex",2D)="white"{}
_Diffuse("diffuse",Color) = (1,1,1,1)
_Specular("specular",Color) = (1,1,1,1)
_Gloss("gloss",Range(1,256)) = 5
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
sampler2D _RampTex;
fixed4 _Diffuse;
float4 _Specular;
float _Gloss;
struct v2f
{
float4 vertex:SV_POSITION;
float3 worldNormal:TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
//o.uv = v.texcoord.xy*_RampTex_ST.xy + _RampTex_ST.zw;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
//环境光
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
//漫反射
float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
float halfLambert = saturate(dot(worldLight, i.worldNormal)*0.5 + 0.5);
float3 diffuse = _Diffuse.rgb*tex2D(_RampTex,float2(halfLambert, halfLambert)).rgb*_LightColor0.rgb;
//blinn Phong高光反射
//float3 reflectDir = normalize(reflect(-worldLight, i.worldNormal));
float3 viewDir = normalize(_WorldSpaceCameraPos - UnityObjectToWorldDir(i.vertex));//mul(unity_ObjectToWorld, i.vertex)
float3 halfDir = normalize(_WorldSpaceLightPos0.xyz + viewDir);
float3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(halfDir, i.worldNormal)), _Gloss);
float3 temp = diffuse + ambient + specular;
return fixed4(temp, 1);
}
ENDCG
}
}
}