UnityShader(九)Unity中的基础光照(下)

标准光照模型

光照模型有许多种,但在早期游戏引擎中,往往只使用一个光照模型,被称为标准光照模型。

标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。

它的基本方法是,把进入到摄像机内的光线分为四个部分,每个部分用一种方法来计算它的贡献度。

自发光(emissive),这个部分用于描述给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照技术,这些自发光的表面并不会真正地照亮周围地物体,而是它本身看起来更亮了而已。

高光反射(specular),这个部分用于描述当光线从光源照射到模型表面时,该部分会在完全镜面反射方向散射多少辐射量。

漫反射(diffuse),这个部分用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。

环境光(ambient),这个部分用于描述其他所有地简介光照。

自发光

光线可以直接由光源发射进入摄像机而不用经过任何物体反射,标准光照模型使用自发光来计算这个部分的贡献度。

它的计算很简单,就是直接使用了改材质的自发光颜色。

自发光表面往往不会直接照亮周围的表面,它不会被当作是一个光源。

高光反射

(1)Phong模型

这里的高光反射是一种经验模型------不完全符合真实世界中的高光反射现象。用于计算沿着完全镜面反射方向的光线,让物体看起来更有光泽。

计算高光反射我们需要知道:表面法线、视角方向、光源方向、反射方向。我们只要知道前三个矢量(都进行了归一化),反射方向可以通过计算得到,计算公式如下:

r是反射方向、n是法线方向、I是光源方向。

高光反射部分计算公式如下:

其中,mgloss 是材质的光泽度 ,也被称为反光度 。用于控制高光区域的"亮点"有多宽,mgloss 越大,亮点越小。mspscular 是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色。clight 则是光源颜色和强度。同样,这里也需要防止v·r的结果为负数。

(2)Blinn模型

和上述的Phong模型相比,Blinn提出了一个简单的修改方法来得到类似的结果。它的基本思想是,避免计算反射方向r 。为此,Blinn模型引入了一个新的矢量h ,它是通过对v 和I的取平均后再归一化得到的

然后,使用n 和h 之间的夹角进行计算,而非v 和r 之间的夹角,

总结,Blinn模型公式为

这两种模型各有优劣。如果摄像机和光源距离模型足够远的话,Blinn会快于Phong,因为这个时候 v 和 I 都可以看成定值,h将是一个常量。反之Phong可能更快。

漫反射

漫反射是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。在漫反射中视角位置是不重要的,因为反射是完全随机的,但是入射光线的角度是很重要的。

漫反射光照符合兰伯特定律(Lambert's law):反射光线的强度与表面的法线和光源方向之间夹角的余弦成正比。

n 是表面法线,I 是指向光源的单位矢量,是材质的漫反射颜色,是光源的颜色。我们需要防止法线和光源方向的点乘为负值,所以用取最大值函数将其截取到0,可以防止物体被从后面来的光源照亮。

环境光

虽然标准模型重点在于描述直接光照,但是在现实生活中物体可也可以被间接光照所照亮。

间接光照指光线通常会在多个物体间反射,最后进入摄像机。例如在红地毯上放一个浅灰色的小球,那么小球的底部就会有红色,这些红色是由红地毯反射了一部分光线,再反弹到沙发上的。

在标准光照模型中,我们使用环境光来近似模拟间接光照,它通常是一个全局变量,即场景中的所有物体都使用这个环境光。

逐顶点还是逐像素

上述给出了基本光照模型的数学公式,我们在何处计算这些光照模型呢?

通常来讲,我们可以选择在片元着色器中计算,也被称为逐像素光照 ;在顶点着色器中计算,也被称成为逐顶点光照。

逐像素光照

我们会以每个像素为基础得到它的法线(可以是对顶点法线插值得到的,也可以是从法线纹理中采样得到的),然后计算光照模型。这种在面片之间对顶点法线进行插值的技术被称为Phong着色 ,也被称为Phong插值或法线插值着色技术。

逐顶点光照

也被称为高洛德着色。我们在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色。

由于顶点数目往往小于像素数目,因此逐顶点光照计算量往往小于逐像素光照。但是由于逐顶点光照依赖于线性插值得到的像素光照,因此当光照模型中有非线性的计算(如计算高光反射)时,逐顶点光照就会出现问题。

总结

标准光照模型仅仅是一个经验模型,它不完全符合现实世界的光照现象,但是它具有易用性、计算速度和得到的效果都比较好,也被广泛使用。因为广泛使用,它有许多称呼,一些资料会称它为Phong光照模型 ,在Blinn的方法简化下它也被称为Blinn-Phong光照模型。

但这种模型有很多局限性。首先有很多重要的物理现象无法表现,如菲涅尔反射 。其次,Blinn-Phong模型 时各项同性 的,当我们固定视角和光源方向旋转这个表面时反射不会发生任何变化。而有些表面是具有各项异性的。

相关推荐
魔士于安3 天前
unity 丑陋哥布林 哥布林有humannoid 动画没 带动画
unity·游戏引擎·材质·贴图·模型
小贺儿开发4 天前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水4 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员4 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
林川~015 天前
Unity新输入系统使用笔记
unity·input system
小贺儿开发5 天前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
goujunwe5 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~016 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园6 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~016 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api