InstantOC(插件)
- 渲染管线
- 图形数据在GPU上经过运算处理,最后输出到屏幕的过程。
- 对于显示出来的图形,CPU与GPU的分工
- CPU判断需要显示的图形图像
- 调用图形API;
绘制调用(Draw Call):每次引擎准备数据并通知GPU的过程,即每帧调用显卡渲染物体的次数。即下图中的Batches。
3.到显卡GPU这,主要做如下处理:
顶点处理:从CPU接收模型(网格模型)顶点数据,然后做坐标转换。
图元装配:组装面,即绘制三角面;
光栅化:计算面上的像素,为着色提供合理的插值参数;
像素处理:像素着色,写入缓存;
帧缓存与深度缓存Z-buffer:存储像素的深度信息,像素离摄像机的距离,进的替代远的像素;
- Occlusion Culling(遮挡剔除)
- 即时遮挡剔除(InstantOC):摄像机视角内看不到的物体进行剔除,减少每帧的渲染数量,在送入渲染流水线;
摄像机视野:
对上述场景做遮挡剔除,步骤如下:
- 首先添加一个层IOC_Layer和一个标签IOC_Tag,将要做动态遮挡剔除的物体加入到该层中和选择该标签中,如下。
2. 将InstantOC中的如下图中的文件拖拽到摄像机上
在属性面板中出现该文件的设置属性,如下
3.设置Layer mask和TAGs分别为IOC_Layer和IOC_Tag
1)Layer mask:参与遮挡剔除的对象层;
2)TAGs:为指定的标签对象自动添加IOClod脚本对象;
3)Sample(采样):
原理:在摄像机视野范围内,随机放出射线,若打到物体上,则该物体需要渲染,若打不到,则取消该物体的Mesh Renderer前的勾(不渲染);
采样:发出的射线的数量,通常设置在150-500之间;
4) Rays Fov:射线视野,应大于摄像机视野Field of View。
5)View Distance:视图距离,射线长度,参照影响摄像机Clipping Planes-Far数值。
6)Hide Delay:延迟隐藏,当物体被剔除时延迟的帧数,建议50-100之间。即发射射线的次数,若每次某物体都不可见,则剔除。
7)PreCull Check:检查采集信息,建议勾选,提高剔除效率;
8)Realtime Shadows:实时阴影,如果场景需要实时阴影,确保剔除物体显示正常的阴影(该功能不稳定)。
4. 为将需要做遮挡剔除的物体添加盒状碰撞器,而不是使用物体的实际的面来做射线碰撞。而是使用盒状的6个面。
遮挡剔除使用情况:在场景中,物体比较密集,遮挡的物体较多时,可以使用遮挡剔除,否则会真加CPU的负担。
5.运行效果(中间被遮挡的不渲染,不可见):
移动一下前面的物体,后面的又出现了,如下:
前后Draw Call对比:可知Batches减少了(30à24),降低了显卡的负担。
- LOD(多细节层次Levels of Detail)
- LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
- 通过InstantOC中的如下设置来实现
主要的意思是:一个物体有三个不同精细程度的模型,在0-20距离内,使用精细高的模型,在20-40距离内使用中等精细模型,在40距离以外,使用低精细模型。主要影响下图中的面数和顶点数。
1)添加一个物体作为父对象,有三种不同精细程度的模型作为子对象,并命名为Lod_0,Lod_1,Lod_2(命名必需为这个)。
2)摄像机添加IOCCam,模型父对象添加盒状碰撞器
3)改变摄像机的位置,可以看到Mesh Renderer前的勾会改变,有勾的会渲染。
附:
本文章学习至bilibili-没有文明的文明-史上最全Unity3D教程