Unity3D-InstantOC遮挡剔除

InstantOC(插件)

  • 渲染管线
  1. 图形数据在GPU上经过运算处理,最后输出到屏幕的过程。
  2. 对于显示出来的图形,CPU与GPU的分工
    1. CPU判断需要显示的图形图像
    2. 调用图形API;

               绘制调用(Draw Call):每次引擎准备数据并通知GPU的过程,即每帧调用显卡渲染物体的次数。即下图中的Batches

             Unity3D-InstantOC遮挡剔除_第1张图片

           3.到显卡GPU这,主要做如下处理:

              顶点处理:从CPU接收模型(网格模型)顶点数据,然后做坐标转换。

              图元装配:组装面,即绘制三角面;

              光栅化:计算面上的像素,为着色提供合理的插值参数;

             像素处理:像素着色,写入缓存;

             帧缓存与深度缓存Z-buffer:存储像素的深度信息,像素离摄像机的距离,进的替代远的像素;            

 

  • Occlusion Culling(遮挡剔除)
  1. 即时遮挡剔除(InstantOC):摄像机视角内看不到的物体进行剔除,减少每帧的渲染数量,在送入渲染流水线;

        Unity3D-InstantOC遮挡剔除_第2张图片

       摄像机视野:

        Unity3D-InstantOC遮挡剔除_第3张图片

        Unity3D-InstantOC遮挡剔除_第4张图片

       对上述场景做遮挡剔除,步骤如下:

  1. 首先添加一个层IOC_Layer和一个标签IOC_Tag,将要做动态遮挡剔除的物体加入到该层中和选择该标签中,如下。

         

      2. 将InstantOC中的如下图中的文件拖拽到摄像机上

         

      在属性面板中出现该文件的设置属性,如下

        Unity3D-InstantOC遮挡剔除_第5张图片

 

       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.运行效果(中间被遮挡的不渲染,不可见):

        Unity3D-InstantOC遮挡剔除_第6张图片

       移动一下前面的物体,后面的又出现了,如下:

        Unity3D-InstantOC遮挡剔除_第7张图片

        前后Draw Call对比:可知Batches减少了(30à24),降低了显卡的负担。

        Unity3D-InstantOC遮挡剔除_第8张图片

 

  • LOD(多细节层次Levels of Detail
  1. LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
  2. 通过InstantOC中的如下设置来实现

          

          主要的意思是:一个物体有三个不同精细程度的模型,在0-20距离内,使用精细高的模型,在20-40距离内使用中等精细模型,在40距离以外,使用低精细模型。主要影响下图中的面数和顶点数。

           

          1)添加一个物体作为父对象,有三种不同精细程度的模型作为子对象,并命名为Lod_0Lod_1Lod_2(命名必需为这个)。

           

           2)摄像机添加IOCCam,模型父对象添加盒状碰撞器

            3)改变摄像机的位置,可以看到Mesh Renderer前的勾会改变,有勾的会渲染。

附:
本文章学习至bilibili-没有文明的文明-史上最全Unity3D教程

你可能感兴趣的:(Unity,游戏开发)