单张纹理材质实现:
Shader "Custom/SimpleTextureMat"
{
Properties{
//TintColor:色调
_Color("TintColor", Color) = (1.0, 1.0, 1.0, 1.0)
_MianTex("Maintex", 2D) = "white"{}
_Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0)
_Gloss("Gloss", Range(8.0, 256)) = 20
}
SubShader{
Pass{
Tags{
"LightMode" = "ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
#include "UnityCG.cginc"
half4 _Color;
sampler2D _MianTex;
float4 _MianTex_ST;
half4 _Specular;
half _Gloss;
struct a2v{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct v2f{
float4 vertex : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD3;
};
v2f vert(a2v i){
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f, o);
o.vertex = UnityObjectToClipPos(i.vertex);
o.worldNormal = normalize(UnityObjectToWorldNormal(i.normal));
o.worldPos = mul(unity_ObjectToWorld, i.vertex);
o.uv = TRANSFORM_TEX(i.texcoord, _MianTex);
//o.uv = i.texcoord;
return o;
}
half4 frag(v2f i) : SV_TARGET{
half3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
half3 albedo = tex2D(_MianTex, i.uv) * _Color;
half3 diffuse = _LightColor0.rgb * albedo * saturate(dot(i.worldNormal, lightDir));
half3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;
half3 reflectDir = normalize(reflect(-lightDir, i.worldNormal));
half3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
half3 specular = _LightColor0.rgb * albedo * pow(saturate(dot(reflectDir, viewDir)), _Gloss);
return half4(diffuse + ambient + specular, 1.0);
}
ENDCG
}
}
FallBack "Specular"
}
部分代码段分析:
o.uv = TRANSFORM_TEX(i.texcoord, _MianTex);
TRANSFROM_TEX原理为:
ambient(环境光),diffuse(固有色),specular(高光)都可以选择性乘以纹素(Texel) 以达到不同的效果。
ambient,diffuse:
ambient,diffuse,specular:
diffuse,specular: