在unity使用多个相机-及其重要性

参考:在unity使用多个相机-及其重要性

一帧的渲染中,可以有很多个相机进行渲染,相机渲染的物体由视锥体以及层级遮罩等决定,相机渲染的顺序由相机的深度及其加载到场景中的顺序决定;每个场景渲染的结果都是保存到硬件的缓冲区中的,它们共用一个缓冲区,所以每次开始渲染前都要设置对之前缓冲区中的数据如何处理,一帧的渲染结果由所有相机的处理结果所决定;

下面多相机协作最重要的三个因素:

layer mask概念,通过分层来将一些后期效果等限制到某一层进行处理,比如做Bloom效果,如果在场景相机中添加了UI层,那么UI层也会参与Bloom效果,这肯定是不对的,需要设置正确的Culling Mask选项 ;

每一个相机的layermask包含的物体,需要全部渲染完成后,才会进入到下一个相机开始渲染;每一个相机都是一个完整的drawing,它们之间是同步的(顺序由depth决定),而每一个相机都会有把自己的渲染结果放入相应的缓冲区,下一个camera渲染之前可以决定对上一个相机的结果做如何处理(这就是clearflag的作用),最终的结果就是渲染得到的一帧画面;另外:如果一个物体既在A相机遮罩下又在B相机遮罩下,那它就会被重复渲染两次;

depth,决定相机的渲染顺序,间接决定了游戏对象的渲染顺序;

ClearFlag:清除标志类型

  • depth only,只清除深度,意味着该相机渲染的颜色会直接覆盖到之前的颜色缓冲之上,而不考虑之前的深度;unity中对此选项应用比较广泛的,比如UI的渲染,通过设置分层、设置好depth only、并将UI相机的深度大于场景相机的深度来实现UI显示在场景最前方;有时会希望在UI层前渲染3D模型,这就需要重新设置相机深度,将其放在ui相机之后进行渲染;
  • don't clear,通常和自定义shader一起使用;它在效果上可以理解为不清除之前缓冲区对应场景中的所有物体,并将之前场景与当前场景合并为一个场景继续渲染;

使用多个相机:

  • 切换相机,默认情况下一个相机渲染其视图以覆盖整个屏幕(可见摄像机是depth属性值最大的相机);通过禁用一台摄像机并从脚本中启用另一台摄像机,可以使用另一台摄像机提供场景的不同视图;例如在俯视图视图和第一人称视图等不同角度视图之间切换;
  • 将相机的渲染结果渲染到RenderTexture实现小地图、后视镜等功能;

注意多个相机的管理,最好放置到同一个父物体下方便统一管理;