2015年6月13日 星期六

Unity render order

基本上Unity render的順序主要由三個地方來依序檢查:

  1. Camera Depth: camera render 順序,Depth越小代表越先畫,而Depth越大的Camera,一律蓋在Camera Depth小的object上面。
    image 
    那Camera會畫哪些東西由Culling Mask決定,所以每個gameObject所選的那些Layer層,只是Camera用來Group哪些gameObject該畫,哪些不該畫。
    image
  2. Render Queue: 代表gameObject在當前Camera內畫的順序,RenderQueue越小的越先畫,而後畫的一定都蓋在先畫的上面。可由Shader或Material指定。
    預設都由Shader指定,Material的RenderQueue會直接以Shader指定的作為預設。
    http://docs.unity3d.com/Manual/SL-SubShaderTags.html
    也可由程式抓到gameObject.render的Material來指定自己的RenderQueue
  3. http://docs.unity3d.com/ScriptReference/Material-renderQueue.html
  4. Transform position的z值: 當以上1和2都相同的話,則就比對Z值。那Z值誰大誰小造成誰先畫,則看你Camera朝向的方向了。反正通常越靠近鏡頭的越先畫。

通常一般UI或3D object其實都可以使用相同的RenderQueue去畫,再調Z值就好。 可是像有些Particle System希望一定要蓋到UI上,而且Unity的Particle System不能控制Particle要移動多少Z值,所以常常穿插在UI或3D object中間,造成閃爍問題(因為Z值靠太近)。這種時候一定要有個Script動態可以去調整RenderQueue,才可以蓋在所有東西的上面。

那目前許多公司都用NGUI(3.x版),雖然每個UIWidget都是用它自己所謂的Widget depth來調整,但是它事實上還是自已用RenderQueue來管理,可以使用它的Drawcall Tool來看它每個Panel底下所畫的Widget的RenderQueue
imageimage

沒有留言:

張貼留言