Unity学习笔记02渲染系统
渲染管线(Rendering Pipeline)
着色器(shader):运行于GPU上面的代码,用于执行渲染过程中的具体计算。
就是渲染系统的工作模式
1.传统的Forward(正向)渲染。一般用于移动端游戏开发。
2.较新的Deferred(延迟)渲染。一般用于PC或是Consoles主机开发。
Forward渲染
每个物体受每个灯光的影响,都会在各自的pass中被渲染(每个物体可能会被渲染多次,次数取决于影响物体的光源数目)
优势是速度快,对于硬件要求低
缺陷是,对于光源较多的游戏,渲染效率将会受到影响
如果场景中光源数目可控,为一种快速解决方案
Deferred渲染
将着色和光照计算放到最后来进行(物体经过一次pass之后,表面位置,法线和材质信息渲染到geometry buffer(几何缓存)中,最后将这些纹理和光照pass进行合成)
好处是渲染开销(SetPass calls,在状态中可以查看该数值)取决于光照影响的像素数量,而非光源数量本身。
对于场景中的光源数并无限制,这对于某些游戏比较关键。
需要更强大的硬件支持,当前的手机平台并不支持。
实际操作
project setting-->Quality-->像素光源数量(Pixel Light Count):在这里调整场景中光源数量的限制,光源的影响范围是可以调整的
渲染路径在项目设置-->图形中进行更改
颜色空间
渲染的最终目的就是将屏幕像素填充特定的颜色
1.线性颜色空间(linear color space)
随着真实性更高的基于物理渲染(PBR)的而流行。
直接使用像素的本来颜色,不进行幂函数运算。
在线性空间的运算结果是准确的。
2.传统的伽马颜色空间(gamma color space)
人眼对暗色域的辨识度更强,
图片存储时,对图像中的每个像素做一次幂函数运算。
更多的暗部存储空间,牺牲掉了一些不重要的亮部存储空间。
在显示的时候,使用Gamma校正后,作指数运算,恢复像素颜色。
存在的问题:像素颜色其实不是原来的颜色,而是幂函数。使用幂函数进行光照等计算显然是不正确的,导致最终
的渲染结果有误。(对于追求更加物理精确的场合来说不适用)
在unity中,默认都是伽马颜色空间。在project setting -->player-->其他设置中进行修改。
在纹理属性中,有一个sRGB选项,默认是勾选的(即会做伽马矫正),一般情况下需要勾选,因为大部分图像处理软件使用的是伽马颜色空间。
摄像机
透视相机
类似于真实世界的相机,远小近大效果
正交相机
取消透视效果,适用于物体检视,特定类型游戏
摄像机属性
清除标志Clear Flags
:共有四个选项
1.默认选项,天空盒(skybox)
2.纯色(solid color),会把不渲染的位置(无物体的地方)渲染成指定的纯色
3.只渲染深度(Depth only)
4.Don't clear
投影Projection
有透视投影和平行投影,透视投影更接近人眼所熟悉的规则
视野Filed of Views
有宽角(广角),窄角(长焦)镜头
裁剪面Cilpping Planes
摄像机前面的横截面大小,有远近两个可以调整数值,物体不在此范围的在游戏视图中会被裁剪掉。
渲染路径Rendering path
在此处可以为摄像机设置特定的渲染路径。
灯光
点光源:最简单的光源,没有方向只有位置,照射半径,光强。(类似于灯泡)
聚光灯:模拟从无限小的点发出的光线,光线集中于指定的锥形区域或者特定方向的光束,有位置,光照半径,光锥角度,光强。(适合路灯,手电筒之类的)
平行光:用来模拟太阳光,照亮同一角度上的所有物体,亮度与对象和光源的距离无关。
面积光:是一种区域光,表现实际光源的发光尺寸。发光区域越大,光照越柔和,也更加真实。目前不支持实时面光源,需要预计算。
光源的强度(Intensity)属性可以影响其对场景的照亮程度。
剪影(Cookie):给光照加一个遮罩,主要是用来实现一些简单的光照效果。
光源也支持类似于摄像机的快速对齐视图。
实时阴影
1.可以反映物体在三维空间中的位置关系
2.阴影可以反映接收体的形状
3.阴影可以表现出当前视点看不到的信息
4.通过阴影可以判断光源的数目
分为硬阴影和软阴影(在阴影的边缘能够产生模糊效果,更接近真实效果,但对资源的消耗更大),关于阴影在灯光和被照射的物体属性界面中都可进行调整。(还可以选择物体是否接收阴影)
材质(Material)
1.材质确定了物体表面应该如何被渲染
2.材质和纹理,着色器密切相关
3.可以调整各种参数信息来得到不同的渲染结果
着色器(Shader)
是小脚本程序,以光照和材质参数为输入,包含用于计算每个像素颜色的算法
纹理(Texture)
是图像,用来赋予物体表面更多细节,可以表示颜色,反射,粗糙度等细节
三者之间的关系
1.材质可以使用一个特定的着色器
2.着色器决定了材质中可用的选项或者参数
3.着色器还定义了所要使用的纹理
4.shader+texture=material
基于物理的着色(Physically Based Shading):用来模仿真实世界中的光和材质的交互结果(基于物理的方式完成计算,非常真实),unity中已经内置。
一些属性
在project窗口中右键新建材质,在材质的属性窗口中,反射率(Albedo)选项可以选择纹理。
法线贴图(Normal Map):影响物体表面的法线(法线会影响到很多东西)分布,一般选择与纹理对应的贴图。
当添加了法线贴图和高度贴图后,调整材质的平滑度(Smoothness)时,镜面反射效果变得更加明显了。
Rendering Mode (渲染模式)
1.Opaque,默认模式
2.Cutout,镂空渲染模式(此模式可以调整Alpha阈值,即不透明度)
3.Fade,用来模拟可以消隐掉的物体,比如魔法效果
4.Transparent,用来模拟玻璃的之类的透明效果
Emission(发射):用来决定是否让材质自发光。
Tilling:当材质平铺到物体表面时的平铺的密度
offset(偏移):纹理坐标的偏移
全局光照明系统(GI)
模拟真实世界中光照的多次反射效果。
目前只用于静态物体,需要进行预计算,有两种方式,一是烘焙GI,将场景中光的多次反射效果存储下来,二是实时GI,将所有可能的光照反射信息保存,光源可变。
限制条件:只能作用于静态物体(动态物体可以使用光照探针来近似全局光照效果),实时GI仍然会增加计算量,受限平台最好使用烘焙GI。
探针(Probe)
1.复杂的光照和反射需要进行预先计算,因此只能用于静态物体中。
2.使用探针可以将空间中的预计算信息保存。
3.动态物体使用附近的探针上的信息,使得动态物体也具备了类似静态物体的光照或反射效果
光照探针
用于全局光照明系统,探针保存光照信息
新建探针)在层级窗口右键-->light-->Light Probe Group
反射探针
用于保存空间中不同区域的反射信息,用来得到物体表面的反射效果
新建探针)在层级窗口右键-->light-->Reflection Probe
???
在反射探针的Box Projection属性勾选之后,渲染出现全局光照明的效果,之前不知是否成功,原因未知。