Unity3D:Camera的Clear Flags

要理解Clear Flags,首先来看D3D中的IDirect3DDevice9::Clear方法

HRESULT Clear(
  [in]  DWORD Count,
  [in]  const D3DRECT *pRects,
  [in]  DWORD Flags,
  [in]  D3DCOLOR Color,
  [in]  float Z,
  [in]  DWORD Stencil
);
在每帧开始渲染之前,都要调用该方法来清除缓存,参数Flags定义了清理什么类型的缓存。我们可以选择用Color来清理颜色缓存,也可以用Z来清理深度缓存,清理后,颜色缓存中的颜色为Color,深度缓存中的深度为Z。


理解了这个方法,再理解Unity3D中的Clear Flags就很容易了,这不就对应着上述Flags参数吗!

如果Clear Flags为Skybox和Solid Color,在该相机渲染每一帧之前,都会清除深度缓存(清理为多少?应该是最大值1)和颜色缓存(清理为什么颜色?是Skybox和Solor Color中的颜色);

如果Clear Flags为Depth only,那么只会清理深度缓存,而不会清理颜色缓存;要正确理解Depth only,目光不能只盯着Depth。只清理了深度缓存,没清理的是什么?是颜色缓存。

如果Clear Flags为Don’t Clear,那么既不会清理深度缓存,也不会清理颜色缓存,在该相机开始渲染时,深度缓存和颜色缓存中的值保持上一帧渲染结束时的深度缓存区和颜色缓存区中的值。


至于Camera的Depth属性,则决定了当多个Camera存在时Camera之间的渲染顺序。Depth低的Camera先渲染,Depth高的Camera后渲染,这就导致Depth高的Camera会覆盖Depth低的Camera的渲染内容。


下面来考虑常见的双摄像机分别渲染场景和UI的Camera设置思路:

首先,UICamera肯定要覆盖在SceneCamera之上,所以UICamera的Depth为1,SceneCamera为0,这时我们看到的画面只有UICamera拍摄到的内容。

其次,我们还要使UICamera拍摄到的内容堆叠到SceneCamera拍摄内容上。把UICamera的Clear Flags设置为Depth only,那么在渲染完SceneCamera后,再来渲染UICamera时,由于没有清理颜色缓存,因此在UICamera没有拍到的地方,就保留了SceneCamera拍摄的内容。

最后,UICamera拍摄到的物体除了UI控件,可能还会有场景中的其他物体,给UI控件指定统一的tag,再给UICamera设置Culling Mask即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值