Shader "Custom/Single_Texture"
{
Properties//属性
{
_MainTex("Main Tex",2D) = "white"{}//贴图代替漫反射颜色
_Color("Tex Color",Color) = (1,1,1,1)//贴图颜色:与贴图uv坐标下的像素点颜色混合
//_Diffuse("_DiffuseColor",Color) = (1,1,1,1)//漫反射颜色
_Specular("_Specular", Color) = (1, 1, 1, 1)//高光颜色
_Gloss("_Gloss", Range(10, 200)) = 20//高光参数
}
SubShader
{
Pass
{
Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量
CGPROGRAM
//在CG声明属性
sampler2D _MainTex;//ShaderCG中的关键字
float4 _MainTex_ST; //主贴图的缩放与偏移“属性名称固定”_MainTex_ST.xy缩放属性;_MainTex_ST.zw偏移属性
fixed4 _Color;//与贴图叠混合颜色
//fixed4 _Diffuse;
fixed4 _Specular;
int _Gloss;
#include "Lighting.cginc"//引入UNITY内置文件,获取光照变量 _LightColor0.rgb;光源颜色
#pragma vertex vert//声明顶点函数
#pragma fragment frag//声明片原函数
struct a2v//应用向顶点函数传递参数
{
float4 vertex:POSITION;//模型空间顶点坐标
float3 normal:NORMAL;//模型空间法线方向
float4 texcoord :TEXCOORD0;//获取纹理坐标
};
struct v2f//顶点函数向片原函数传递参数
{
float4 svPos:SV_POSITION;//顶点函数返回值:剪裁空间中的顶点坐标-系统直接使用
float3 worldNormal : TEXCOORD0;//顶点函数向片原函数传递世界坐标下的法线方向
float4 worldView:TEXCOORD1;//顶点函数向片原函数传递世界坐标下的顶点坐标
float2 uv:TEXCOORD2;
};
v2f vert(a2v v)//顶点函数将顶点从模型空间转到世界空间,返回值在世界坐标系下的顶点坐标
{
v2f f;//声明传参结构体,并对其中的值赋值
f.svPos = UnityObjectToClipPos(v.vertex);
f.worldNormal = UnityObjectToWorldNormal(v.normal);
f.worldView = (UnityObjectToWorldNormal(v.vertex), 0);
//f.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;//将纹理坐标传递到片原函数 * 乘上主贴图缩放属性 + 加上主贴图的偏移属性
f.uv = TRANSFORM_TEX( v.texcoord,_MainTex);//内置宏直接获取缩放+偏移后的纹理坐标。
return f;//返回结构体
}
fixed4 frag(v2f f) :SV_Target//片原函数,返回值为输出到像素颜色值的缓存
{
//计算漫反射
fixed3 normalDir = normalize(f.worldNormal);//法线方向
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(f.worldView));//光源方向
fixed3 texColor = tex2D(_MainTex, f.uv.xy)*_Color.rgb;//获取纹理坐标下贴图像素点的颜色*与外部属性控制的贴图颜色混合
fixed3 diffuse = _LightColor0.rgb * texColor * max((dot(normalDir,lightDir) * 0.5 + 0.5), 0);//fixed3 harfLambert =dot(f.wordNormalDir, lightDir)*0.5+0.5;//半兰伯特光照模型:直射光颜色 * (cos夹角(光与法线)*0.5+0.5):使背光面不完全为黑色
//计算高光反射
//fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
fixed3 viewDir = normalize(WorldSpaceViewDir(f.worldView));//实视线方向
fixed3 harfDir = normalize(viewDir + lightDir);//视角与平行光的平分方向
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir, harfDir),0), _Gloss);//BP模型://Blinn-Phong光照模型Specular = 直射光*pow(max(cos夹角,0)*高光参数) ,夹角:法线与x方向夹角,x:平行光与视野方向的平分项。
fixed3 tempColor = diffuse + specular + UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;//漫反射+高光+环境光*纹理,相加混合(环境光与纹理混合:使强光下的纹理仍保持清晰)
return fixed4(tempColor,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
Shader-纹理贴图
2020-08-20