【UnityShader】透明效果和渲染順序

Unity 中實現透明效果的方法:
  1. 透明度測試;
  2. 透明度混合;
深度緩衝

深度緩衝,根據深度緩存中的值來判斷該片元距離攝像機的距離,當渲染一個片元時,需要把它的深度值和已經存在於深度緩衝中的進行比較(如果開啓了深度測試),如果它的值距離攝像機更遠,說明這個片元不應該被渲染到屏幕上(有物體擋住了它);否則,這個片元應該覆蓋掉此時顏色緩衝中的像素值,並把它的深度值更新到深度緩衝中(如果開啓了深度寫入)。

渲染的順序

渲染引擎一般都會先對物體進行排序,在渲染。渲染的順序:

  1. 先渲染所有不透明的物體,並開啓它們的深度測試和深度寫入。
  2. 把半透明物體按它們距離攝像機的遠近進行排序,然後按照從後往前的順序渲染這些半透明物體,並開啓它們的深度測試,但是關閉深度寫入。
Unity Shader的渲染順序

Unity爲了解決渲染順序的問題提供了渲染隊列。SubShader中 Queue 標籤來決定我們的模型將歸於哪個渲染隊列,Unity在內部使用一系列整數索引表示每個渲染隊列,且索引號越小表示越早被渲染。

名稱 序列索引號 描述
Background 1000 這個渲染隊列會在任何其他隊列之前被渲染,通常使用該隊列來渲染那些需要繪製在背景上的物體
Geometry 2000 默認的渲染隊列,大多數物體都是用這個隊列,不透明物體使用這個隊列
AlphaTest 2450 需要透明度測試的物體使用這個隊列
Transparent 3000 這個隊列中的物體在Geometry和AlpahTest物體渲染後,再按從後往前的屬性進行渲染,任何使用透明度混合的物體都應該使用該隊列
Overlay 4000 該隊列用於實現一些疊加效果。任何需要在最後被選入的物體都應該使用該隊列
在關閉深度寫入的情況下,渲染順序變得非常重要

A(黃色)是半透明物體,B(紫色)是不透明物體

  • 如果先渲染B,由於B是不透明物體,不透明物體開啓深度測試與深度寫入,而此時深度緩衝中沒有數據,會把B的值寫入深度緩衝和顏色緩衝,然後渲染A,透明物體仍然進行深度測試,發現A距離攝像機更近,會使用A的透明度和顏色緩衝中的B的顏色進行混合,得到半透明效果。
  • 如果先渲染A,由於A是透明物體,開啓深度測試但不進行深度寫入,把A寫入顏色緩衝,但是不寫入深度緩衝。然後渲染B,B開啓深度測試與深度寫入,此時深度緩衝中沒有數據,那麼會直接用B寫入深度緩衝和顏色緩衝,把A的顏色覆蓋掉。從視覺上看,B出現在A的前面,這是錯誤的。

A和B都是半透明物體

  • 先渲染B,把B寫入顏色緩衝,但是不寫入深度緩衝。然後渲染A,會使用A的透明度和顏色緩衝中的B的顏色進行混合,得到正確半透明效果。
  • 先渲染A,把A寫入顏色緩衝,但是不寫入深度緩衝。然後渲染B,會使用B的透明度和顏色緩衝中的A的顏色進行混合,這樣混合結果會完全反過來,看起來好像B在A的前面,得到錯誤半透明效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章