[引擎]之六:渲染原理和在Unity3D中的应用分析(花屏处理)

在Unity3D的使用过程中,项目中有可能出现花屏现象。并且,有可能是偶现或者必现的,但这真的是个bug,可以被解决的。
参考**《3D游戏编程大师技巧》3.2.1帧缓存和视频系统和3.2.3缓存交换**,先搞清楚原理,再对照出现的现象进行分析。

文章目录

      • (1) 相机渲染原理
      • (2) Unity3D中的应用分析和花屏现象处理
        • (1) ClearFlags与颜色缓存和深度缓存的对应

(1) 相机渲染原理

硬件中会分配一块区域,作为帧缓存,当然,如果是双缓冲的话,会分配两块。主缓冲区用于显示,副缓冲区可以进行离屏渲染。最终,副缓冲区中的内容会被复制到主缓冲区,显示出来。
另外一项功能是锁定内存。在访问这些内存和读写缓存时,需要先对内存进行锁定,读写完成之后,解除对内存的锁定。主缓存和副缓存只在锁定期间有用,并且,不能认为在下一次锁定时,缓存地址仍然是相同的。这是硬件的一种特征,它可能会移动帧缓存

缓存交换的过程为:

清除缓存用于清屏。一般用黑色来清除。主缓存用来显示,所以,一般只清除副缓存;之后将新的要显示的东西写入副缓存,然后执行主副缓存的交换,最后显示在显示器上。

(2) Unity3D中的应用分析和花屏现象处理

在Unity3D中与上述直接相关的组件是Camera。
Camera组件中的设置,与上述的对应关系为:

(1) ClearFlags与颜色缓存和深度缓存的对应

在第一个步骤清除中,涉及到两项,一项是颜色缓存,另外一项是深度缓存。在**《3D游戏编程大师技巧》**中,默认都是直接清除了的。上文说过,清除颜色缓存就是给颜色缓存的赋一个值,一般用黑色。深度缓存是为了做像素的zTest。但是Unity3d中,Camer的ClearFlags是可以来选择是否清除颜色缓存,和是否清除深度缓存的。

ClearFlag 颜色缓冲区 深度缓冲区
|  SkyBox 		|改变,设置为skyBox的颜色|  不改变   |
|  SolidColor    |改变,设置为BackGround颜色 |  不改变  |
|DepthOnly     |  不改变 | 改变,清空深度缓冲  |
|Don't Clear    |  不改变 | 不改变  |

如果项目中有多个相机,并且ClearFlags设置不当,会导致花屏。详情请看这里:Unity3d花屏处理。

####(2) Viewport Rect与渲染区域的对应

Viewport Rect的默认值为:
viewport rect
Unity文档里面说,取值范围是0-1。

X Y 相机渲染区域的起点

W H 为相机渲染输出到屏幕上的的百分比,取值范围是[0,1]。

在实际应用中,比如,不同分辨率的平面下(已经全面屏手机的适配),为了显示同样比例的画面,可以修改viewport Rect,只渲染手机屏幕的一部分。非渲染区域显示成黑边。
这种情况下,如果你只有一个相机,它只渲染输出了屏幕的一部分,所以,非渲染的那部分,由于硬件帧移动的特性,其他部分的值是随机的,有可能导致花屏,并且是一定区域(相机没有渲染的区域)的花屏。
这个时候简单粗暴的解决方法就是,添加一个depth最小、渲染全部区域的ClearFlag设置为SolidColor的相机。让这个相机每帧总是先将屏幕设置为solidColor。
####(3) 其他花屏情况
综上所述,出现了花屏的情况,从写入到帧缓冲的时候除了问题。可以对照第一节的内容,从原理入手进行分析。

之前也遇到过多线程渲染和开启Unity的某些渲染设置的时候遇到花屏的现象,可以对照原理分析一下。一般使用简单粗暴相机解决法就可以了(v)。

以上。

你可能感兴趣的:(引擎,unity)