Shader "Custom/ShaderDiffues-Specular"
{
Properties//属性
{
_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声明属性
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;//模型空间法线方向
};
struct v2f//顶点函数向片原函数传递参数
{
float4 svPos:SV_POSITION;//顶点函数返回值:剪裁空间中的顶点坐标-系统直接使用
float3 worldNormal : TEXCOORD0;//顶点函数向片原函数传递世界坐标下的法线方向
float4 worldView:TEXCOORD1;//顶点函数向片原函数传递世界坐标下的顶点坐标
};
v2f vert(a2v v)//顶点函数将顶点从模型空间转到世界空间,返回值在世界坐标系下的顶点坐标
{
v2f f;//声明传参结构体,并对其中的值赋值
f.svPos = UnityObjectToClipPos(v.vertex);
f.worldNormal = UnityObjectToWorldNormal(v.normal);
f.worldView = (UnityObjectToWorldNormal(v.vertex), 0);
return f;//返回结构体
}
fixed4 frag(v2f f) :SV_Target//片原函数,返回值为输出到像素颜色值的缓存
{
//计算漫反射
fixed3 normalDir = normalize(f.worldNormal);//法线方向
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(f.worldView));//光源方向
fixed3 diffuse = _LightColor0.rgb * _Diffuse * 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;//漫反射+高光+环境光,相加混合
return fixed4(tempColor,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
Shader-漫反射(半兰伯特),高光(BP)混合实现
2020-08-19