常用光照模型汇总:Lambert/Phong/Blinn-Phong光照模型

最近在钻研Unity3D Shader中的各种渲染效果,自然涉及到各种光照模型的使用,还记得三年前Computer Graphic课有讲过,不得不感慨How time fly...废话少说,进入正题:

Lambert漫反射光照模型属于经验模型,主要用来简单模拟粗糙物体表面的光照现象,此模型假设物体表面为理想漫反射体(也就是只产生漫反射现象,也成为Lambert反射体),同时,场景中存在两种光,一种为环境光,一种为方向光,然后我们分别计算这两种光照射到粗糙物体表面所产生的光照现象,最后再将两个结果相加,得出反射后的光强值。
首先是计算环境光的公式:
I_ambdiff = K_d * I_a;
其中,K_d为粗糙物体表面材质对光的反射系数,这个系数由程序编写者在宿主程序中给出,I_a为环境光的光强,也就是环境光的颜色数值,一般是一个float3型的变量。
然后是计算方向光的公式:
I_ldiff = K_d * I_l * cosa;
其中I_l为方向光的光强,也就是其颜色值,一般是float3型的变量。这个公式与计算环境光的不同,对于环境光,我们不关心它的方向,因为环境光也没有方向,它给予物体的光照在各个顶点处均是一样的。而方向光则需要关注其方向,例如一个聚光灯,灯从不同的角度来照射物体所产生的效果也是不一样的,光线方向越靠近法线,漫反射出来的光就越强,反之则越弱。公式中的a就是光线方向与顶点法线的夹角,同时要注意,入射光的方向在这里定义为顶点到光源位置。但是计算cosa会比较麻烦,所以在这里要变换一下公式,方便程序的书写。假设N为顶点的单位法向量,L为入射光的单位法向量(再次提醒一下,L的方向是由顶点指向光源的)这样,由向量的点积公式可得:cosa = N﹒L,所以计算方向光的公式就变为:
I_ldiff = K_d * I_l * (N﹒L);
综上,得出漫反射后的光强为:
I_diff = K_d * I_a + K_d * I_l * (N﹒L);
下面给出使用Cg语言的Lambert漫反射光照模型顶点着色程序:

struct vertex_In
{
   float4 in_Position : POSITION;
   float4 in_Normal   : NORMAL;
};
struct vertex_Out
{
   float4 out_Position : POSITION;
   float4 out_Color    : COLOR0;
};
void main_v(vertex_In
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值