超牛链AI Logo

超牛链博客: 读书|骑行|笔记分享
user
老王不响
@关于博主
2016-03-03

Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model) 8 mins read


关于光照模型

所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式

现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propagation Model),目的为了得出移动信号的传播损耗。当时是基于普通的PC实时运算,非常非常耗时--如北京五环内的传播模型渲染GIS图用了超过20分钟。

 

光照模型来源有2类:

  • 一类是基于学术论文的算法,如Lambert模型、Phong模型.
  • 另一类基于算法的变种--在实际生产实践中修正得到的模型,如HalfLambert模型、BlinnPhong模型.

 

光照模型公式:

surfaceColor = emissive + ambient + diffuse + specular

          物体表面的颜色是自发光(emissive)、环境反射(ambient)、漫反射(diffuse)和镜面反射(specular)等光照作用的总和。   每种光照作用取决于表面材质性质(例如亮度和材质颜色)和光源的性质(例如光的位置和颜色)。

一般而言,光照模型只考虑漫反射镜面反射

 

光照模型分类

当光照射到物体表面时,一部分被物体表面吸收,另一部分被反射,对于透明物体而言,还有一部分光穿过透明体,产生透射光。被物体吸收的光能转化为热量,只有反射光和透射光能够进入眼睛,产生视觉效果(物体呈现的亮度和颜色)。   所以,物体表面光照颜色由入射光、物体材质,以及材质和光的交互规律共同决定。

另外,光与物体最基本的交互方式就是反射,遵循反射定律:反射光与入射光位于表面法向两侧,对理想反射面(如镜面),入射角等于反射角,观察者只能在表面法向的反射方向一侧才能看到反射光

 

 

Unity内置光照模型

在Unity表面着色器(Surface Shader) ,Unity内置了2个光照模型,对于大部分场景选择使用即可。

源码路径:C:\Program Files\Unity\Editor\Data\CGIncludes\Lighting.cginc

Lambert 漫反射

fixed4 LightingLambert (SurfaceOutput s, UnityGI gi)

     粗糙的物体表面向各个方向等强度地反射光,这种等同地向各个方向散射的现象称为光的漫反射(diffuse reflection)。   产生光的漫反射现象的物体表面称为理想漫反射体,也称为朗伯(Lambert)反射体。Lambert 模型较好地表现了粗糙表面上的光照现象,如石灰粉刷的墙壁、纸张、黑板等。

 

BlinnPhong 镜面反射 (Jim Blinn 1977)

它是以Phong模型为基础的,效果是能让高光更加柔和,更平滑;但是真实感还没Phong模型强,主要是这个模型运算速度要快,即运算效率高。

fixed4 LightingBlinnPhong (SurfaceOutput s, half3 viewDir, UnityGI gi)

一个光滑物体被光照射时, 可以在某个方向上看到很强的反射光,这是因为在接近镜面反射角的一个区域
内,反射了入射光的全部或绝大部分光强,该现象称为镜面反射。诸如金属材质的反射光泽。  镜面反射认为光强与反射光线和视线的夹角相关。

其中在OpenGL 和Direct3D 渲染管线中,Blinn-Phong 就是默认的渲染模型。

 

一些光照模型概念:

  • Fresnel菲涅尔反射:在观察水面的时候,垂直看下去,清澈见底,看远处的水面,向镜子一样,这个就是菲涅尔效应。菲涅尔效应可以说是无处不在,不同的材质效果不同而已。
  • 镜面反射的颜色通常是材料的颜色而不是光源的颜色。
  • 塑料使用白色的镜面高光,漫反射成分大而镜面反射成分小。
  • 金属的反射一般发生在表面,漫反射分量很小,有时甚至可以忽略,粗糙度的值m也很小。
  • Cook-Torrance 模型: 用模型模拟了金属和塑料材质,考虑到了入射角变化时发生的颜色偏移。
  • Bank BRDF光照模型:BRDF就是双向反射分布函数的意思,它描述了入射光线在某个反射角度的反射光的相对能量。所以给定不同的BRDF函数,就能实现不同的光照效果,如各向异性光照效果--金属表面拉丝等效果。

参考文档:

2016-03-03
老王 加冕为王
老王,工作了19年的软件工程师、连续创业者、Blogger(since 2013),微软.net MVP获得者(2015~2016)、 Unity3D UVP获得者 (2017)。 曾任上市公司研发主管、知名外企Social Media Marketing 。 现专注于Instagram、SEO等海外社交媒体营销技术研究与实践。 四十而立的我,有2个可爱的宝宝,喜好骑行、读书、木工, 尤其喜好历史、科幻书籍。
友情链接
超牛链 260天前 2024年3月6日 15:16

占领沙发,期待老朋友的精彩发挥

最新文章

一路东北, 转眼二十年

一路东北, 转眼二十年了,最后一次回眸长春,是2004...

人道中年,悲欣交集

中年人的生活 各自欢乐, 又或一地鸡毛,简言之:【悲...

80后爱玩的PC游戏:红警、秦殇 —快乐呀。

记得非典—2003年那会,周末一到,大学宿舍里面,吃完...

超牛链AI:Ollama本地LLM LangChain RAG小试--算力为王

算力为王时代: CPU --> GPU

GPU这...

热门文章

骑行故事初心--自由的御风而行

2023年,三年疫情过后第一个春天,我开始了骑行: 空...

Unity3D for VR 学习(7): 360°全景照片

    在VR应用中,有一个相对简单的虚拟现实体验,那...

C#程序员整理的Unity 3D笔记(六):Git源码管理

对程序员而言,写的代码用源码管理系统管理起来,非常方便...

《一句顶一万句》 遇见一个能说的上话的人不易

2024年 甲辰龙年春节假期,我看了2本小说,茅盾文学...

相关【技术杂谈】文章

查看所有相关【技术杂谈】文章
搭建Squid3 密码账号IP代理

上文中,说明了 Squid3 IP Proxy 隐藏原IP,这里就搭建Squid 3密码账号IP代理进行整理,涉及...

不用插件,js脚本显示星号密码

不用插件,js脚本显示星号密码

以前,我是用Chrome插件做这个这的--显示星号密码的。 今天,分享一个不用插件...

执行MySQL报错

今天新采购了柒比贰WordPress主题,安装主题时候报错: MySQL命令行使用sql语句进行建表时,MySQL...