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

Unity学习笔记02渲染系统

2021-11-29 20:37 作者:挽秋_z  | 我要投稿

渲染就是通过计算机的运算,将三维场景最终转换成屏幕画面。

渲染管线(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属性勾选之后,渲染出现全局光照明的效果,之前不知是否成功,原因未知。



Unity学习笔记02渲染系统的评论 (共 条)

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