Unity3D: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即可。

你可能感兴趣的:(Unity3D:Clear Flags)