Unity 之Camera 屬性Clear Flags 淺談

Unity 之Camera 屬性Clear Flags 淺談

Camera 作為Unity中最為重要的元件,充當著整個遊戲世界大門的作用,只有有了它,使用者才能看到遊戲,可以說是遊戲玩家的虛擬世界之眼睛。

作為開發者,首先就要徹底理解Camera的所有屬性與作用,只有這樣才能已最恰當的方式,將遊戲呈獻給玩家,讓玩家毫不出戲、身臨其境的遊戲。

學習Uinty半年時間,一直在使用Camera,但是對有些屬性還是一知半解。今天就將所有的理解寫出來,方便別人也方便自己。對於其中有問題的,不理解的,後續也方便補充。

其中 每一個屬性,我都將先列出Ceeger聖典上的說法,然後那個上面難免有很多不好理解的說法,我再用紅字談談自己的想法
這裡寫圖片描述
Clear Flags

Each Camera stores color and depth information when it renders its view. The portions of the screen that are not drawn in are empty, and will display the skybox by default. When you are using multiple Cameras, each one stores its own color and depth information in buffers, accumulating more data as each Camera renders. As any particular Camera in your scene renders its view, you can set the Clear Flags to clear different collections of the buffer information. This is done by choosing one of the four options:

每個相機在渲染時會儲存顏色和深度資訊。螢幕的未繪製部分是空的,預設情況下會顯示天空盒。當你使用相機時,每一個都將自己的顏色和深度資訊儲存在緩衝區中,還將積累大量的每個相機的渲染資料。當場景中的任何特定相機進行渲染時,你可以設定清除標記以清除緩衝區資訊的不同集合。可以通過下面四個四個選項之一來完成

Skybox 天空盒
This is the default setting. Any empty portions of the screen will display the current Camera’s skybox. If the current Camera has no skybox set, it will default to the skybox chosen in the Render Settings (found in Edit->Render Settings). It will then fall back to the Background Color. Alternatively a Skybox component can be added to the camera

這是預設設定。螢幕上的任何空的部分將顯示當前相機的天空盒。如果當前的相機沒有設定天空盒,它會預設在渲染設定(Render Settings )選擇天空盒(在 Edit->Render Settings可以找到)。它將會變回背景色。另外天空盒元件可以新增到相機上。

我們觀察屬性會發現,屬性Clear Flags下面緊跟著屬性Background,這個就是當Camera也沒有Skybox元件,也沒有設定系統天空盒時,用來顯示的純色。關於系統天空盒,在Unity 5.0中已經變更位置了。在Window->Light中可以找到。

Solid Color 純色
Any empty portions of the screen will display the current Camera’s Background Color.

任何空部分,螢幕顯示為當前相機的背景色。

Depth Only 僅深度
If you wanted to draw a player’s gun without letting it get clipped inside the environment, you would set one Camera at Depth 0 to draw the environment, and another Camera at Depth 1 to draw the weapon alone. The weapon Camera’s Clear Flags should be set to to depth only. This will keep the graphical display of the environment on the screen, but discard all information about where each object exists in 3-D space. When the gun is drawn, the opaque parts will completely cover anything drawn, regardless of how close the gun is to the wall.

如果你想繪製一個玩家的槍,又不讓它內部環境被裁剪,你會設定深度為0的相機繪製環境,和另一個深度為1的相機單獨繪製武器。武器相機的清除標誌(Clear Flags )應設定 為depth only。這將保持環境的圖形顯示在螢幕上,但會丟棄所有關於每個物件在三維空間中的位置的資訊。當槍被繪製出來,不透明的部分將完全覆蓋任何已繪製的事物,而不管槍到牆之間如何接近(我的註釋:橫線部分我在後面將單獨解析)

這裡邊有幾個知識點:內部環境裁剪(Clipped inside the environment),深度(depth)

clipped inside ths environment:這個說的是Camera的另一個屬性Clipping Planes,這個屬性包含兩個值Near/Far。舉個簡單的例子,比如人眼睛,距離人眼睛太近的物體看不清、距離人眼睛太遠的物體看不到,這就是Near、Far了。看下圖
這裡寫圖片描述
你看,這個觀賞樹的近端可以看完整,遠景也OK。這個時候Clipping Planes Near == 0.3 Far == 1000
這裡寫圖片描述
再看,近端丟了一塊,遠景也丟了。這個時候Near == 3 Far == 6

也就是說距Camera小於Nea距離的物體被裁剪掉、距Camera大於Far距離的物體被裁剪掉。

那麼,怎麼能避免物體被裁剪掉,而且還能離攝像頭Near>=3呢?那就是,把這個景觀樹單獨用另一個攝像頭來顯示。具體,看下一個知識點:

Depth:這個深度,顧名思義,就是攝像機的深度了。當只有一個攝像機時,這個屬性沒有意義。當有大於兩個攝像機時,就牽扯到多個攝像機的前後層疊問題了。Depth值越大,越靠上,也就是越靠外,也就是可以遮擋值較小的攝像機的畫面。比如MainCamera就預設為-1,然後新建攝像機就是0,在上邊。那麼回到剛才景觀樹這個問題,如果想用一個攝像機專門展示景觀樹,而且還在主攝像機中可以看到,那麼Depth必然要大一些,在主攝像機的上面嘍。接下來,我們就來討論Clear Flags 的Depth Only啦:

我們先試著把顯示景觀樹的攝像機的Clear Flags設定為SkyBox或者Solid Color,我們會發現主攝像機鏡頭被天空盒或者純色擋住了。然後將ClearFlags改為Depth only,我們會發現,景觀樹成功的嵌入了主攝像機的其他景色中,渾然天成。根據Depth only字面意思來討論,也就是說,這個時候攝像機的未渲染部分的顯示內容取決於深度,未渲染部分顯示什麼由深度小於本攝像機的內容來決定。

現在回到槍的話題。我做了一個小例子,如圖就是場景,其中有三個Enemy,一個Player(藍色),一個Gun(綠色):
這裡寫圖片描述
,然後先是隻有一個Camera,我們看看效果:
這裡寫圖片描述
看,由於槍離人物太近,導致從人物的視角觀察時,最近的一部分被裁剪掉了。那怎麼辦?我總不能把槍再朝外吧?再朝外就不自然了呢。

那麼我把槍的Layer設定成GunLayer,然後在MainCamera中CullingMask中取消對GunLayer的顯示。然後新建Camera,把深度設定為0(因為MainCamera的深度為-1),Clear Flags設定成Depth only,把CullingMask中只勾選GunLayer,那麼這個新的Camera就只顯示Gun了。調整Camera的位置到適合位置。看效果:
這裡寫圖片描述
人物舉槍的姿勢,很自然吧?

接下來,我將專門解析這段話的含義,覺得上面的翻譯有些不好,我自己嘗試翻譯了下

This will keep the graphical display of the environment on the screen, but discard all information about where each object exists in 3-D space. When the gun is drawn, the opaque parts will completely cover anything drawn, regardless of how close the gun is to the wall.

(設定深度的這個操作)將會保持環境中的圖形顯示的完整,但是,會丟棄所有其他物體在3D空間中存放位置的資訊。當槍被繪製時,它的透明部分會完整的覆蓋其他任何繪製,不管這把槍到低離牆有多的的近。

那麼我理解的意思就是設定成Depth only的Camera中的物體,將會凌駕在其他任何物體上,當然,只能凌駕在Depth比他小的物體上。不受3D位置的前後影響。能夠完整的呈現在觀察者面前。

我做實驗如下:

我先將一個Enemy頂進了槍裡:
這裡寫圖片描述
再來觀察效果:
這裡寫圖片描述
槍還在外面,沒有頂進去。很明顯,其他物體的3D位置資訊沒有體現出來,不然就不是這個效果了。

至此,這個Depth Only,的含義已經很傳神了。

至於Don’t Clear,借用一段翻譯:

Don’t Clear 不清除
該模式不清除任何顏色或深度快取。其結果是,每幀繪製在下一幀之上,造成塗片效果。這不是用於遊戲的典型方式,最好是與自定義著色器一起使用。

我目前的理解和曾實驗看到的效果確實是幀疊加了。確實不是用於遊戲的典型方式。沒有理解之前,暫不討論了。
參考文獻https://blog.csdn.net/narutojzm1/article/details/51291008