您的位置:首页 > 其它

镜面高光

2016-04-15 09:56 316 查看
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
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: