Unity引擎学习笔记-Camera(一)

时间:2024-05-20 12:52:21

 (PS:这只是个人学习笔记,不是教程,如果有一天开放,仅供参考,如有指正,感激不尽)

在实习项目的开发中,遇到需要使用多相机渲染的问题,主要使用了相机组件的两个属性,Clear Falgs和Culling Mask;即清除标记和遮罩剔除。

  Clear Flags:清除标记,用来决定哪些部分被清除 有四种模式(Skybox,Solid Color,Depth Only,Don't Clear)

                             Skybox:空白处显示天空盒,若没有天空盒,则显示默认底色(白色);

                             Solid Color:空白处显示指定的静态颜色;

                             Depth Only:深度模式,仅清除深度缓存区; 

                             Don't Clear:不清除任何深度缓存和颜色 ;

 

 Culling Mask:通过选择图层信息呈现对象组

现在详细说说我对清除标记的理解,不一定到位,如有大神指正,感激不尽。在我看来,清除标记至少与渲染管线的两个步骤有关:深度测试和颜色混合。屏幕上每一个像素都至少有两个信息,颜色信息和深度信息,当新的一帧的像素信息在屏幕呈现之前,先会将上一帧的缓存信息清除某些部分(或者不清除任何信息),然后和剩下的信息做深度测试和颜色混合得到最终结果(还有其他步骤,这里只讨论着两个),把结果放在帧缓存区并显示在屏幕上。

首先前两个选项,Skybox,以及Solid Color,比较好理解,就是每一帧在绘制之前,先清空深度缓存和颜色缓存,然后与已有的天空盒信息或者固定的颜色信息做深度测试和颜色混合,得到结果放入帧缓存并呈现。

着重讲后面两个选项,Depth Only,这个选项的意思是仅清理深度信息,由于上一帧的缓存中深度缓存区被清理,那么新的信息就无法做深度测试,直接通过和颜色缓存区的颜色信息做颜色混合;然后放入缓存区并呈现。

下面有个例子:通过Culling Mask实现Camra1,Camera2,Camera3分别只渲染Cube(红色透明),Shpere(绿色不透明),Capsule(银灰色透明);三个相机的Transform完全一致,三个相机的Clear Flags 都为Depth Only,三个相机的深度值分别是1,2,3(注意相机的深度值和帧缓存中的深度信息并无直接联系,相机的深度值中只表示多相机场景的渲染先后顺序关系,深度值小的先渲染);

Unity引擎学习笔记-Camera(一)

可以看到虽然虽然Cube在其他两个物体前面,但是由于它最先被渲染的,所以仍然被显示在后面。而从透明的物体的重叠部分可以看出,颜色混合并没有出现什么问题。

 

现在保持其他相机的属性不变,只将Camera3的ClearFlags改为Don't Clear;为了便于观察,将Capsule和Cube色改为不透明

Unity引擎学习笔记-Camera(一)

这个结果验证了我的想法,Camera1最先渲染;然后是Camera2,由于Camera2在呈现前,把Camera1渲染后所存放的深度信息清理,Camera2所有的像素都直接通过深度检测,所以看起来Sphere在Cube 前面,而由于Camera3的ClearFlag为Don't Clear

渲染时没清理任何信息,那每个像素的深度显示都是正常的;

       

  现在将三个相机ClearFlags都改成Don't Clear,为了便于观察深度关系三个物体都充叠 ,吧Cube的材质颜色改为不透明,

 Capsule改为透明

Unity引擎学习笔记-Camera(一)                  

      可一看到深度信息和颜色混合都是正常的。但是把ClearFlags改为Don't Clear是不建议的。因为在运行状态下会出现涂屏的效果,这是由于每一帧的图像信息都被显示出来了。

Unity引擎学习笔记-Camera(一)