感觉这一章讲的有些抽象,有点难看下去,我写的顺序和书中的有些出入,但是融入了我自己的一些理解,边写边整理一下自己的思路吧。
第9章 更复杂的光照
我们前几章中主要关心的是模型本身(材质)是什么样子的,所以示例都只有一个平行光。而这一章关注的是模型与光源之间的交互,因此我们要考虑到多个模型以及多个不同种类光源的情况。
-
Unity的渲染路径:前向渲染、延迟渲染、顶点照明渲染。
Unity 5.0以后顶点照明渲染就被抛弃了。 -
Unity中处理光源的方式:逐顶点处理、逐像素处理、球谐函数(SH)处理。
效果最好的是逐像素处理,但是计算效率最低,因此不能每个光源都使用逐像素处理方式。渲染路径给出了每个光源采用何种处理方式的规则。 -
前向渲染:对每一个物体执行n个Pass,n为逐像素光源的个数;
延迟渲染:对每一个物体执行2个Pass;
顶点照明渲染:对每一个物体执行1个Pass。 -
前向渲染:通常定义一个Base Pass和一个Additional Pass。
Base Pass:用于计算一个逐像素的平行光以及所有逐顶点和SH光源,只执行一次;
Additional Pass:用于计算其他 (n-1) 个影响该物体的逐像素光源,执行 (n-1) 次。 -
在前向渲染中,Unity选择用何种方式处理每一个光源的规则如下:

-
顶点照明渲染:在一个Pass中计算所有影响该物体的光照,全部采用逐顶点方式。效率最高,但是效果最差。
-
延迟渲染:定义两个Pass。
第一个Pass不进行光照计算,只进行深度检测,把可见片元的信息储存到G缓冲区中;
第二个Pass利用G缓冲区中的信息进行光照计算。 -
Unity的光源类型:平行光、点光源、聚光灯和面光源
Unity的光源属性:位置、方向、颜色、强度以及衰减 -
平行光:场景中所有点的方向和强度都一样,没有位置和衰减;
点光源:球体,其衰减可由一个函数定义,但是Unity中为了方便用一张纹理作为查找表得到光线的衰减;
聚光灯:锥形体,衰减函数比点光源略复杂,实现方式同上。
这一章还有一部分内容是讲阴影如何实现的,放到下一篇文章再写。下面总结几个最近比较困扰的问题:
-
对颜色进行操作时,为什么有时候相乘,有时候相加?
在对影响一个物体的不同光进行叠加时使用加法,例如环境光、漫反射、高光反射等效果在一个物体上的叠加,或多个光源对一个物体的影响;在计算一种光的颜色时使用乘法,例如计算漫反射光时我们使用光线颜色乘以物体的漫反射颜色。
在第一种情况下,每一个颜色都对应了某一个光线的强度;在第二种情况下,光源的颜色对应的是光线的强度,但是漫反射颜色代表的是物体对不同颜色的光的反射率,并不没有实际的光线与其对应。 -
渲染队列中Background和天空盒子的关系?
我看到好多资料上说我们可以把天空盒子设置为Background,在所有物体之前渲染;但是在实际应用中,Unity默认天空盒子是在所有不透明物体之后渲染的,可以节约计算资源,我们也可以自己修改。 -
为什么透明混合中渲染顺序会影响最终结果?
在理解前面第八章讲的透明混合的时候,不能把这种透明理解为玻璃的透明,而是应该想象成薄塑料片的感觉,有自己的漫反射颜色,但是也有一定的透明度。
我之前把它想象成玻璃,就很疑惑为什么两个半透明物体的渲染顺序会对最终的效果产生影响,如果是玻璃的话放置顺序应该不会影响观察的结果;但是当成塑料材质就很容易理解了,我们观察到的颜色除了它透过的颜色还有它漫反射的颜色。

网友评论