Unity Shader学习-3.光照模型

光照是3D游戏中一个必不可少的部分,场景氛围的渲染需要光照来表现:

巫师3.jpg

上面是巫师3中的夜景,如果没有光的画整个表现力将会降低很大的一个层次,这一节我们将了解光照的形成过程以及各个光照模型。

一、光源:

1.光形成图像的过程

先来了解一下光线从产生到形成我们眼中图像的过程:

光形成图像

这当中涉及到光的反射、折射,最后光进入人眼,形成了图像,这就是光形成图像的过程。

2.光源的相关要素

1.矢量:

光源是一个矢量,他具体位置和方向,例如Unity中的方向光、点光源,都具备矢量的性质。

2.量化:

下面是维基百科中关于光强的介绍

辐照度:辐照度表示各种频率辐射的总量。物理学者时常也会分开检验辐射频谱的每一单独频率。假设对于入射于曲面的辐射做这动作,则称这辐射为光谱辐照度(spectral irradiance),国际单位制的单位为W/m2。在光学和激光物理学中,辐照度也被叫做光强。

地面上一块平面的总辐照度等于“直接辐照度”与“漫辐照度”的代数和,光强与光和物体表面的夹角有关,具体会在下面介绍。

光强与夹角相关

3.光的吸收与散射

光线发射出来与物体相交后,会有两个结果,一个是散射另一个是吸收

  • 散射:只改变光线方向,而不改变光线密度和颜色。散射根据光线改变后的方向分为两种,若光线散射到物体内部的现象则称为折射,而散射到物体外部的现象则称为反射
  • 吸收:只改变光线的密度和颜色,而不改变光线方向。
光的吸收/散射

从上图中我们可以看到光从发射到与物体表面相交后的各种情况,光线有的被吸收有的被反射有的发生了折射。其中的蓝色光线表示漫反射,而黄色光线表示高光反射。在光照模型中我们会使用不同部分来表示光线的这几种情况:

  • 高光反射(Specular):表示物体表现是如何直接反射光线的
  • 漫反射(Diffuse):表示光线如何被折射及吸收后反射的

通常用出射度表示出射光线的数量和方向,出射度辐照度之间是存在线性关系的。

4.着色

着色指的是根据材质属性、光源属性,使用一个公式去计算沿某个观察方向的光线出射度的过程,这个公式我们也将之称为光照模型

5.各向异性与各向同性

各向异性 (anisotropy ) 与 均向性 相反,是指在不同方向具有不同行为的性质,也就是其行为与方向有关。如在物理学上,沿着材料做不同方向的量测,若会出现不同行为,通常称该材料具有某种“ 各向异性 ” ,这样的材料表面称为各向异性表面( anisotropic surface )。

光照模型中也存在着各向同性和各向异性的区别,例如Lambert漫反射模型是各向同性的,无论我们从哪个方向进行观察,物体表面的光照表现都是不变的,而Phong光照模型中的高光反射则是各向异性的,物体表面的光照表现会随着观察角度的变化而变化。

二、光照模型

现实世界的光照是非常复杂的,若要准确的模拟,整体计算量会非常的大,这在游戏渲染中是不现实的,而光照模型则提供了一种性价比较高的方案,它是一种经验模型,是对真实场景进行理想化和简化后的模型,可以模拟光从发射到与物体相交再到人眼中的效果。

计算机图形学第一定律:如果它看来是对的,那么它就是对的

现实世界中的光照,分为两种直接光照间接光照

  • 直接光照:表示直接从光源发射出来照射到物体表面后,光线经过物体表面的一次反射后直接进入摄像机

  • 间接光照:表示光线从光源发射出来后,经过不止一次的物体反射后进入摄像机

标准光照模型

光照模型有不同种类,而游戏引擎中往往只使用一个光照模型,我们称之为标准光照模型。一般光照模型会包含以下几个要素:

  • 自发光(Emission):用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。
  • 环境光(Ambient):在现实世界中无论多么黑暗,世界都会有一些光亮(月光、远处的光)在照亮物体,环境光就是用于模拟无论什么情况都会给物体颜色的这种情况。
  • 漫反射(Diffuse):模拟一个发光物体对物体的方向性影响,面向光的一面会比另一面更亮。
  • 高光(Specular):模拟有光泽物体表面上的亮点,其颜色更倾向于光的颜色而不是物体表面的颜色。

标准光照模型只关心直接光照,下面说一下标准光照模型的历史。

1.Lambert模型

Lambert是理想的漫反射模型,他表现的材质较为均匀,不能反映粗糙度带来的变化。

Diffuse

同等数量的光照射的面积越小,单位表面积收到的光的能量越多,这个原则也构成了Lambert定律

Lambert定律:反射光照的强度与表面法线和光源方向夹角的余弦值成正比

漫反射模型

因此Lambert对应的公式为:

C(result) = n · i · (C(light)·C(diffuse))

其中n向量表示表面法线,i向量表示光与表面交点指向光源的向量,C(light)表示光的颜色,C(diffuse)表示漫反射的系数。

2.Phong(冯氏光照模型)(1975)

冯氏光照模型引入了高光来增强渲染真实感,从下图可以看到,他引入了观察者视角这一参数,反射向量R与视角向量V的夹角决定了高光的强度。

Phong = Ambient(环境光)+ Diffuse(漫反射) + Specular(高光)

Phong

从上图可以看到,Phong氏光照模型由三个部分组成:环境光、漫反射、高光反射。其中的Diffuse在上面已经讲过了,而Specular(高光反射)则是一个与用户视线相关的值,通过反射光线的向量视线方向的点积来影响高光的值,如果反射光线与视线方向的夹角越小,则高光的作用越大。同时还加入了一个发光值(Shiness),来控制高光扩散程度。下面是Phong模型的数学展示图。

Phong光照模型

C(Specular) = (C(light)·C(Specular))·pow(max(0, V·R), shiness)
其中C(light)表示光的颜色,C(Specular)表示高光反射的系数,shiness则表示发光值。下面看下不同的发光值对Phong的影响,可以看到发光值越大,散射得越少,高光点越小

不同的发光值

Phong模型是在片段着色器中实现的,而在早期的光照着色器中,开发者在着色器中实现冯氏光照,这种模型Gouraud模型,下面是这两者的区别。

  • Phong模型:在片段着色器中实现,效果好,效率相对低
  • Gouraud模型:在顶点着色器中实现,效果差,效率相对高
Phong&Gouraud

3.Blinn-Phong(1977)

Phong模型效果不错,性能也较高,但是,如果光源在靠近视野的位置的话就会出现反射向量与视线向量的夹角大于90度,从上面的Specular公式可以知道,Phong模型不允许两向量的点积值小于0,也就是不允许他们的夹角大于90度。

光源在靠近视野的位置

上面这种情况会导致镜面区域边缘迅速减弱并截止,如下图远处的暗处:

迅速减弱 截止

1977年James F. Blinn引入了Blinn-Phong着色,它扩展了我们目前所使用的Phong着色。Blinn-Phong模型很大程度上和Phong是相似的,不过它稍微改进了Phong模型,使之能够克服我们所讨论到的问题。

Blinn-Phong

Blinn-Phong中引入了半程向量这一概念,半程向量h是视线向量与光线方向向量的和归一化后的结果,将这个值与表面法线进行点乘得到结果。

h = normalize(lightdir + viewdir)
C(Specular) = (C(light)·C(Specular))·pow(max(0, h·n), shiness)

引入半程向量来计算镜面反射后,我们再也不会遇到Phong着色的截止问题了,下面是对比图:

Phong & Blinn-Phong

可以看到截止的问题已经消失了,整个过渡更加的真实。

Unity实现对应光照模型

To be continued...

参考

[1]https://zh.wikipedia.org/wiki/辐照度
[2]http://www.cnblogs.com/mengdd/archive/2013/08/05/3238123.html
[3]http://learnopengl-cn.readthedocs.io/zh/latest/02%20Lighting/02%20Basic%20Lighting/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 版本记录 前言 OpenGL 图形库项目中一直也没用过,最近也想学着使用这个图形库,感觉还是很有意思,也就自然想着...
    刀客传奇阅读 6,045评论 0 2
  • 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是以目前我们所拥有的处理能力无法模拟的。因此OpenGL的...
    IceMJ阅读 1,962评论 1 6
  • 一、Surface Output (表面着色器的标准输出结构)Surface Shader的标准输出结构-第一要素...
    CarlDonitz阅读 920评论 0 1
  • 一.标准光照模型OpenGL与Direct3D提供了几乎相同的固定功能光照模型。什么是固定功能光照模型?在过去只有...
    karma085阅读 3,618评论 0 2
  • 给予 父母给予我生命 书籍给予我知识 食物给予我能量 朋友给予我交际 工作给予我成长 生活给予我成熟 经常在唱诵给...
    Panda盼子阅读 248评论 4 0