1.求出入射光向量
2.顶点法线向量
3.根据CG函数求出 反射光
4.反射光与视向量点积 求出镜面高光的系数 乘以对应颜色值
Shader "Custom/test1" {
properties
{
_SpecularColor("SpecularColor",color)=(1,1,1,1)
_shininess("shininess",range(4,64)) = 8
}
SubShader {
pass
{
Tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float _shininess;
struct v2f{
float4 pos:POSITION;
fixed4 col:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
float3 N = normalize(v.normal);
float3 L = normalize(_WorldSpaceLightPos0);
N = mul(float4(N,0),_World2Object).xyz;
N = normalize(N);
//漫反射
float ndot =pow(saturate(dot(L,N)),_shininess);
//环境光
o.col = _LightColor0*ndot+UNITY_LIGHTMODEL_AMBIENT;
//镜面高光
//1.求出入射光
float3 I = -WorldSpaceLightDir(v.vertex);
//2.求出法线
float3 wN = UnityObjectToWorldNormal(v.normal);
//3.计算反射
float3 R = reflect(I,wN);
//4.计算视向量
float3 V = WorldSpaceViewDir(v.vertex);
//5.归一求点积
R = normalize(R);
V = normalize(V);
float specularScale = saturate(dot(R,V));
o.col+=_SpecularColor*specularScale;
return o;
}
fixed4 frag(v2f IN):COLOR
{
//光照计算放在片段程序中,交接顶点会变得比较平滑
return IN.col;
}
ENDCG
}
}
}
948

被折叠的 条评论
为什么被折叠?



