渲染管线:
定义:图形数据在CPU上经过运算处理,最后输出到屏幕的过程
1. 顶点处理:接收模型顶点数据、坐标系转换
2. 图元装配:组装面、连接相邻的顶点,绘制为三角面
3. 光栅化:计算三角面上的像素,并为后面着色阶段提供合理的插值参数(以及深度值)
4. 像素处理:对每个像素区域进行着色、写入到缓存中
5. 缓存:一个存储像素数据的内存块,最重要的缓存是帧缓存与深度缓存
• 帧缓存:存储每个像素的色彩(缓冲)
• 深度缓存 Z—buffer:前后排序(深度信息,物体到摄像机的距离)
Draw Call绘制调用:每帧调用显卡渲染物体的次数
一.Occlusion Culling遮挡剔除:
定义:当物体被送进渲染流水线之前,
将视锥以内看不到的物体进行剔除,减少每帧的渲染量,提高渲染性能
例一:unity自带的Occlusion Culling(用碰撞实现的)很消耗GUP
步骤:
1.在Window中找到并点击Occlusion Culling
2.把需要进行渲染剔除的物体勾选为Static
3.在右边的Occlusion中选中Object->Occlusion Areas点击Create new Occlusion Areas
4.在Object中点击Bake,和在Bake中点击Bake
5.点击Visuslization和移动相机就可以查看效果了
效果展示:(相机没有看到的物体自动把MeshRander隐藏了)
实例二:用InstantOC(使用射线)检测物体
步骤
下载:AssetStore中下载InstantOC_Dynamic_Occlusion_Culling__LOD_v2.0.0.unitypackage插件
百度云链接:链接:http://pan.baidu.com/s/1jHPrAfG 密码:v0yr
1.创建层
2.为游戏物体指定层(将参与遮挡剔除)与标签(将自动附加 IOClod脚本)
3.物体添加碰撞器Collider组件(通过射线去检测物体)
4.摄像机附加脚本IOCcam
属性
确保剔除物体显示正常的阴影。Layer mask:参与遮挡剔除的游戏对象层。
IOC Tag:将为指定标签的游戏对象自动添加IOClod脚本对象。
Samples:每帧摄像机发射的射线数目。数量多剔除效果 好,但性能开销大。通常在150—500之间。
Rays FOV:射线视野,应大于摄像机视野Field of View。
View Distance:视图距离,射线长度。将影响摄像机Clipping Planes –Far 数值。
Hide Delay:延迟隐藏,当物体被剔除时延迟的帧数,建 议50—100之间。
•PreCullCheck:检查采集信息,建议勾选,可以提高剔除 效率。
•RealtimeShadows:实时阴影,如果场景需要实时阴影, 建议启用,
注意:(物体需要添加Box Collider组件)
缺点:需要消耗额外CUP
适用:存在大量被遮挡的物体时使用
BUG:Realtime Shadows——使用会显示材质丢失
优点:减少渲染压力,优化GPU显示
效果图:
标记的物体没有被遮挡时
标记的物体被遮挡了
二.LOD多细节层次:
定义:根据物体模型的节点在显示环境中所处的位置 和重要度,决定物体渲染的资源分配,降低非重要物体的面数 和细节度,从而获得高效率的渲染运算。(降低非重要物体(远距离物体)的顶点数 (近精模 远简模))
步骤
1.创建层
2.创建空物体并将模型添加到其中,命名为:Lod_0 Lod_1 Lod_2
3.为父物体指定层与标签
4.父物体或子物体添加碰撞器组件
5.摄像机附加脚本IOCcam
属性
Lod1 distance:摄像机到物体距离小于当前距离时,使 用Lod_0模型。
Lod2 distance:摄像机到物体距离大于Lod1且小于当前 距离时,使用Lod_1模型,大于当前值使用Lod_2模型。
LodMargin:LOD边缘,如果物体在LOD各阶段过渡时发 生闪烁,尝试提高当前值。
缺点:消耗CPU判断距离、占用内存、需要三个模型(付费的不需要三个)
适用:高面模型比较多、有远近变化
性能优化:
CPU、渲染、内存
实例:
三.GI(Global Illumination)全局光照:
•简称GI,即全局光照。
•能够计算直接光、间接光、环境光以及反射光的光照系统。
•通过GI算法可以使渲染出来的光照效果更为真实丰富。
直接光照
定义:从光源直接发出的光,通过Light组件实现。
Type 类型:灯光对象的当前类型
--DirectionalLight 平行光:平行发射光线,可以照射场 景里所有物体,用于模拟太阳。
--PointLight 点光源:在灯光位置上向四周发射光线,可 以照射其范围内的所有对象,用于模拟灯泡。
--SpotLight 聚光灯:在灯光位置上向圆锥区域内发射光 线,只有在这个区域内的物体才会受到光线照射,用于模拟探照灯。
--Area Light区域光:由一个面向一个方向发射光线,只照射该区域内物体,仅烘焙时有效,用在光线较为集中的区域。(仅烘焙用,极耗性能)
Range 范围:光从物体的中心发射的范围。仅适用于点光源和聚光灯。
Spot Angle 聚光角度:灯光的聚光角度。只适用于聚光灯。
Color 颜色:光线的颜色。
Intensity强度:光线的明亮程度。
Culling Mask 选择遮蔽层: 选择要照射的层Layer。
练习:为场景添加光源
阴影(直接光照)
•Shadow Type 阴影类型:Hard 硬阴影、Soft 软阴影(软阴影较硬阴影更消耗性能 )
--Strength 硬度:阴影的黑暗程度。
--Resolution分辨率:设置阴影的细节程度。
--Bias 偏移:物体与阴影的偏移。
•GameObject通过Mesh Renderer 组件启用/禁用阴影
--Cast / Receive Shadows 当前物体是否投射/接收阴影。
--Off 不投射阴影,On 投射阴影,Two Sided 双面阴影,
Shadows Only 隐藏物体只投射阴影
•阴影剔除:设置显示阴影的距离
Edit->Project Settings->Quality->Shadows Disdance
Tips:光可以设置阴影、物体可以选择是否渲染阴影、阴影剔除可以选择渲染的距离
间接光照
定义:物体表面在接受光照后反射出来的光。
•通过Light 组件中Bounce Intensity 反弹强度控制。
•可以通过Scene 面板Irradiance 模式查看间接光照。
Tips:只有标记LightmapingStatic 的物体才能产生间接反弹光照。(要把物体设置为Static——静态——才能使用间接光)
最不好实现,需要消耗大量性能计算(预计算)
环境光照
定义:作用于场景内所有物体的光照
通过Environment Lighting 中Ambient 控制。
来源:天空盒、梯度颜色、颜色
•Ambient Source 环境光源
--Skybox 通过天空盒颜色设置环境光照
--Gradient 梯度颜色
Sky 天空颜色、Equator 地平线颜色、Ground 地面颜色
--Ambient Color 纯色
•Ambient Intensity 环境光强度
•Ambient GI 环境光GI模式
--Realtime实时更新,环境光源会改变选择此项。
--Backed 烘焙,环境光源不会改变选择此项。
反射光照
定义:根据天空盒或立方体贴图计算的作用于所有物体的反射效果
通过Environment Lighting 中Reflection 控制。
•Reflection Source 反射源
--Skybox 天空盒
Resolution 分辨率Compression 是否压缩
--Custom 自定义
Cubemap立方体贴图
•Reflection Intensity 反射强度
•Reflection Bounces 使用Reflection Probe 后允许不同游戏对象间来回反弹的次数。
烘焙GI:
烘焙:Lightmap
原定义:当场景包含大量物体时,实时光照和阴影对游戏性能有很大影响。使用烘焙技术,可以将光线效果预渲染成贴图再 作用到物体上模拟光影,从而提高性能。适用于在性能较 低的设备上运行的程序。
简述:将光线效果预渲染成贴图再作用到物体上模拟光影,从而提高性能,适合在性能较低的设备上使用
Tips:手游一般用烘焙GI)
烘焙后的贴图保存在Unity同目录下
步骤
1. 游戏对象设置为LightmapingStatic。
2. 设置Light组件Baking属性。
3. 启用Lighting 面板的Baked GI。
4. 点击Build按钮。(如果勾选Auto 编辑器会自动检测场 景的改动修复光照效果)
例:
根据上面的步骤:
游戏对象(Cube/Sphere)设置为LightmapingStatic。
创建两个SpotLight聚光灯光源
一个光源的Mode设置为Baked之后在Window Lighting-->Settings中设置
移动该光源下的Sphere可以知道 该Sphere的阴影固定在了Plane上,这是因为Baked仅烘焙时起作用,之后就是一张Texture3D贴图(你可以把该光源删除,理解更容易)
另一个光源的Mode改为Mixed测试
移动下面的Sphere查看其特性
•Light 组件Baking 属性:烘焙模式
--Realtime仅实时光照时起作用。
--Baked仅烘焙时起作用。
--Mixed 混合,烘焙与实时光照都起作用。
•可以通过Scene 面板Baked 模式查看光照贴图。
Baked GI
•Baked Resolution:烘焙光照贴图分辨率,建议比实时GI 分辨率高10倍。
•Baked Padding:光照贴图中各形状间距,取值2到200。
•Compressed:是否压缩光照贴图,压缩则提高性能,缩小容量,但画质会降低。
•Ambient Occlusion:环境遮挡表面的相对亮度,值越高 遮挡处和完全曝光处区别越大,建议为1。
•Final Gather:选中后提高烘焙质量,但会消耗更多时间。
•Atlas Size:光照贴图尺寸。
General GI
•常规GI设置,同时适用于实时GI与烘焙GI。
•Directional Mode 定向模式:
--Non– Directional 无定向模式,使用1种光照贴图存储 光照信息。
--Directional 定向模式,使用2种光照贴图存储光照信息, 相比之下效果更好,但空间占用更大。
--Direction Specular 定向反射模式,使用4种光照贴图存 储光照信息,效果最好,但占用空间最大。
•除无定向模式外必须运行在GLES2.0与SM2.0以上的设备。
GLES 指OpenGL ES 针对移动端,从iPhone5s 开始支持;
SM 指ShaderModel 针对PC 端,目前大部分显卡支持。
•Indirect Intensity 最终间接光照、反射光照的强度。1为默 认强度,小于1则减低强度,大于1则增大强度。
•Bounce Boost 增强间接光照。
•Default Parameters 高级GI参数。
--Default 默认
--Default –HighResolution高分辨率
--Default –LowResolution低分辨率
--Default –VeryLowResolution非常低的分辨率
烘焙后会产生LightingData(灯光信息,匹配图片)
光照贴图
批处理
1、DrawCall(绘制调用Draw Call):每次引擎准备数据(顶点信息,不是面数信息)并通知GPU的过程。通俗讲,每帧调用显卡渲染物体的次数。CPU每帧调用图形学接口,由图形学接口通知GPU做图形渲染的过程。DrawCall变多,CPU每帧调用的次数变多,帧率(FPS每秒帧数)变少,卡顿现象的。决定一个DrawCall的是资源,一个图片资源放到多个场景物体中不会增加DrawCall。
2、DrawCall位置:游戏运行时看Statics:, 为优化的DrawCall数。Profiler面板中的Total Batches的数据才是准确的DrawCall数。
3、DrawCall的优化(又称为批处理),分为两种:静态(Batching)批处理、动态(Dynamic)批处理。动态批处理:可以将符合批处理原则的模型合并,合并后这些模型的DrawCall为一个。 Batched DrawCalls参与动态批处理的物体数量(合并的DrawCall数量),Bacthes降低DrawCall的两种方式:精灵打包、图集。【注意:贴图不影响DrawCall,一个模型更换贴图DrawCall不变,材质才影响DrawCall,给一个Cube加多维子材质,每个面有一个Standard材质,则场景中因为Cube存在增加6个DrawCall】
3.1动态批处理的条件:并不是所有的模型都可以参与动态批处理,不是所有的模型都符合动态批处理条件。满足动态批处理的条件:
①场景中存在摄像机;
②模型的顶点数在300个顶点以内。
③与材质的Shader有关,如果材质的Shader是单通道,则可以参与动态批处理,如果是多通道,则不参与动态批处理。(一个Pass占用一个DrawCall,至少要开启一个通道才能将模型渲染出来,最基础的是漫反射通道(Base Map占用),如果给模型添加了反射、折射、透明、高光等贴图,则Shader中开启对应通道,则不能开启动态批处理,与模型中材质的个数无关,与每个材质中是否有多通道有关);
④Transform组件中的Scale会影响批处理,Rotate、Position不会影响批处理。模型的缩放在不同的Unity版本中会有影响,如果模型的缩放倍数不是很大的话可以参与批处理,倍数过大可能就不能参与批处理。
⑤如果一个模型标记为静态,无论什么类型的静态,则不能参与动态批处理;
⑥只有用Mesh Renderer渲染显示的模型才能参与动态批处理,Skinned Mesh Renderer渲染显示的模型不能参与动态批处理。
⑦Unity中提供的模型与3Ds Max中的模型不能一同参与动态批处理,即使使用同样的材质。所以项目中不要用Unity自带的模型。只要用同一个材质,即使网格不相同,只要顶点数少于300,也能一同参与动态批处理。
3.2、静态批处理满足的条件:
①模型必须是静态的才可以参与批处理。
②顶点数无要求。
③对通道无要求,多通道也可以参与静态批处理;
④参与灯光烘焙的模型(标记为静态)也可以用静态批处理;
⑤网格渲染组件也必须是Mesh Renderer;
⑥Transform组件也不影响静态批处理(缩放范围别过大即可)。
3.3、遇到模型顶点数很多的时候需要用动态批处理的做法:
①将模型打散成多个子物体,每个子物体的定点数小于300;
②利用多维子材质,给模型的所有子物体赋同一个多维子材质球,每一个材质球的都为单通道的即可。
3.4、当场景中有多类武器,每类武器会同时在场景中存在多个的情况时,就可以利用动态批处理。
3.5、批处理只能降低DrawCall不能降低CPU计算的顶点数。不能光盯着DrawCall的优化,要兼顾顶点的优化,顶点数多CPU计算量同样会上升。
3.3、天空盒占用一个DrawCall,因为天空盒的CubeMap用了一个单通道的Shader。
3.4静态物体不能动态加载。
4、什么情况下需要把小图的标签设置为一个(打包):图片的类型、压缩方式、透明、是否在同一个界面等可以放到一张大图中。如果一张图片在几个界面都用,不如不打包这张图片了,Unity打包策略:尽量将所有图放到一张大图中,图片过多放到多个包中。
5、图集:
6、因为每一个小方格都有单独,单独做成类。
7、读取单个精灵用Load,读取精灵图集用LoadAll。
8、所有数据中,能快速定位数据的为字典集合,比数组快多了。