【Unity Shader入门精要】— Unity中的基础光照

内容会持续更新,有错误的地方欢迎指正,谢谢!

引言

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

标准光照模型

应用最普遍的光照模型。它把进入到摄像机的光线分成4部分,每部分使用一种方法计算它的贡献度:
a、自发光(emissive):大多数物体都不用添加自发光。
b、高光反射(specular):当光线照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
c、漫反射(diffuse):当光线照射到表面时,该表面会向每个方向散射多少辐射量。
d、环境光(ambient):其他所有间接光照。

逐像素光照和逐顶点光照:
在顶点着色器中计算公式,叫逐顶点光照;也可以在片元着色器中计算,叫逐像素光照。逐像素光照中,我们以每个像素为基础,得到它的法线(可以是顶点法线插值得到的,也可以是法线纹理采样得到的),然后进行光照计算。
逐顶点光照也被称为高洛德着色(Gouraud shading),逐顶点光照中,我们在每个顶点上计算光照,然后会在渲染图元时进行线性插值,最后输出成像素颜色。
由于顶点数目往往远小于像素数目,因此逐顶点光照的计算量往往小于逐像素光照。但逐顶点光照是线性插值出来的,当光照模型中有非线性计算(例如计算高光反射)时,逐顶点光照会出问题。而且对顶点颜色的差值也会使图元内部的颜色总是暗于顶点处的颜色,会有可能产生明显的棱角现象。

补充一点:移动平台在光照处理上的各种限制,我们要尽量避免实时光影,实用中有各种技术,比如烘焙,光照贴图,或者各种用纹理效果实现光照的效果,如果非要用,要用尽量简单的光照模型,逐顶点光照等。

漫反射的实现

漫反射光照模型,又叫兰伯特光照模型。

实践1:逐顶点光照(效果不好)
结果:在背光面与向光面交界处有一些锯齿。
这里写图片描述

实践2:逐像素光照(效果一般)
结果:可以得到更加平滑的光照效果,但还是有个问题:光照无法达到的区域,模型外观通常是全黑的。
这里写图片描述

实践3:使用半兰伯特模型(效果完美)
结果:完美!
这里写图片描述
依次为:逐顶点漫反射光照、逐像素漫反射光照、半兰伯特光照的对比效果

高光反射的实现

高光反射光照模型,又叫Phong光照模型。

实践1:逐顶点光照(效果不好)
结果:高光部分明显不平滑。
原因:高光反射部分的计算是非线性的,而在顶点着色器中计算光照再进行插值的过程是线性的,破坏了原计算的非线性的关系。
这里写图片描述

实践2:逐像素光照(效果一般)
结果:可以得到更加平滑的高光效果。
这里写图片描述

实践3:使用Blinn-Phong光照模型(效果完美)
结果:完美!Blinn-Phong光照模型的高光反射部分看起来更大、更亮一些,在实际渲染中,绝大多数情况都会选择Blinn-Phong光照模型。
这里写图片描述
依次为:逐顶点的高光反射光照、逐像素的高光反射光照(Phong光照模型)和Blinn-Phong高光反射光照的对比效果

使用Unity内置的函数

我们经常需要光源方向,视角方向等信息。而手动计算这些信息很麻烦。Unity为我们提供了内置函数。
这里写图片描述 有了它们我们就方便多了,今后我们会用它们代替计算,有一点需要注意,它们不保证归一化,所以我们要手动归一化。