欢迎光临散文网 会员登陆 & 注册

Shader入门精要学习-基础光照

2022-05-27 11:11 作者:YONCE1999  | 我要投稿

什么是光照模型

根据材质属性,光源信息,使用一个等式去计算沿着某个观察方向出射光线的数量和方向(出射度)的过程,也称为光照模型。不同的光照模型有不同的目的,例如粗糙表面和金属表面。

如何计算光照模型

在光学里,我们使用辐照度来量化光,计算光照模型时,必须要知道一个物体表面的辐照度,通常情况下,可以使用光源方向l和表面法线n之间的夹角的余弦值得到(l与n之间的点积成正比)

标准光照模型

标准光照模型只关心直接光照(经过物体表面一次反射后进入到摄像机的光线),其计算方法是把进入摄像机内的光线分为四个部分,每个部分使用一种方法来计算他的贡献度。

    1.自发光:Cmissive表示,给定一个方向,物体表面本身会朝该方向发射多少辐射量。

    2.高光反射: Cspecular表示,给定光源,完全镜面反射方向散射多少辐射量

    3.漫反射:Cdiffuse, 描述光线照射到模型时,该表面会朝每个方向散射多少辐射量

    4.环境光:Cambinet,描述其他所有的间接光照

漫发射计算

漫发射光照符合兰伯特定律,反射光线的强度和表面法线和光源方向之间的夹角的余弦值成成正比

计算公式: 光源颜色 * 物体漫反射材质颜色 *  max(表面法线  点乘 光源方向)

为了防止点乘结果为负需要取最大值,防止物体被从后面来的光源照亮。

高光反射计算

    这里的高光发射是一种经验模型,可以用于计算看上去有光泽的材质,例如金属,并不完全符合真实世界中的高光反射。计算高光发射需要表面法线,视角方向,光源方向,反射方向的单位矢量。

计算公式: 直射光颜色 * pow(max(dot(当前点的反射光方向,当前点到摄像机的方向),0),高光反射参数)

高光反射

逐像素计算or逐顶点计算

在得到光照模型的计算公式之后,就可以着手准备实现基础光照模型,通常我们有两种选择,在片元着色器中计算,即逐像素光照,或者在顶点着色器中计算,即逐顶点光照。

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

逐顶点光照,在每个顶点上计算光照,然后在渲染图元内部进行线性插值,最后输出成像素颜色,由于顶点数目远远小于像素数目,计算量也会比逐像素光照小很多,但是由于逐顶点光照依赖线性插值得到像素光照,当光照模型中有非线性的计算时,就会出现问题。


补充:环境光获取,通过Unity内置变量 UNITY_LIGHTMODEL_AMBIENT可以得到环境光的颜色和强度。



Shader入门精要学习-基础光照的评论 (共 条)

分享到微博请遵守国家法律