Unity ShaderLab(1)-基本光照模型

一、基本光照模型公式

 颜色 = 环境光 + 漫反射光 + 镜面反射光

 

二、环境光

Ka是一个三维向量,成员的范围是0至1。代表了某个位置对于全局环境光的各个分量的衰减比率;

GlobalAmibent是三维RGB颜色;

 

三、漫反射光

Kd:物体对于反射光线的衰减系数;

lightColor:灯光颜色;

L:从物体某一点指向光源的单位向量;

N:物体表面的单位法向量;

 

四、镜面反射光

Ks为物体对于反射光线的衰减系数;

Shininess:为高光指数,具体是 pow(dot(V,R), shininess);

高光指数反映了物体表面的光泽程度。Shininess越大,反射光越集中,当偏离反射方向时,光线衰减的越厉害,只有当视线方向与反射光线方向非常接近时才能看到镜面反射的高光现象,此时,镜面反射光将会在反射方向附近形成亮且小的光斑;Shininess 越小,表示物体越粗糙,反射光分散,观察到的光斑区域小,强度弱。

 

Unity ShaderLab代码

#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f {
    float4 pos : POSITION;
    float3 normal:TEXCOORD1;
    float4 vertex:COLOR;
};

v2f vert(appdata_base v)
{
    v2f o;
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

    o.normal = v.normal;
    o.vertex = v.vertex;

    return o;
}

fixed4 frag(v2f IN) : COLOR
{
    //Ambient Color
    fixed4 col = UNITY_LIGHTMODEL_AMBIENT;

    //Diffuse Color
    float3 N = UnityObjectToWorldNormal(IN.normal);
    float3 L = normalize(WorldSpaceLightDir(IN.vertex));
    float diffuseScale = saturate(dot(N, L));

    col += _LightColor0 * _MainColor * diffuseScale;

    //Specular Color
    float3 V = normalize(WorldSpaceViewDir(IN.vertex));
    float3 R = 2 * dot(N, L)* N - L;
    float specularScale = saturate(dot(R, V));

    col += _SpecularColor * pow(specularScale, _Shininess);

    float3 wpos = mul(unity_ObjectToWorld, IN.vertex).xyz;

    //compute 4 points lighting
    col.rgb += Shade4PointLights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
        unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
        unity_4LightAtten0, wpos, N);

    return col;
}

 

引用内容:https://www.cnblogs.com/bluebean/p/5298110.html

转载于:https://www.cnblogs.com/yugo/p/10938606.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值