本文將重點介紹兩種目前在移動平台上的主流陰影製作技術,同時也會簡單介紹兩種移動平台上相對較為高階的動態陰影生成方法。
由於目前主流使用unity3.x在移動平台上並不支援陰影的動態生成技術,所以目前最普遍流行同時價效比也最高的陰影生成方法有以下兩種:
1、 簡單貼圖法
所謂簡單貼圖法即是直接在角色的角底附加乙個陰影半透明貼圖,並讓其跟隨角色一起運動,一般是將該陰影object成為角色模型的子物體,該種陰影生成效果如下:
陰影的inspector檢視如下:
其中shadowcomponent是控制陰影的乙個指令碼,與其生成無關,故不再這裡介紹。影響該應用生成的主要有兩個部分,乙個是shadow網格,另外乙個則是渲染所需要的材質「no name」。需要注意的是,shadow網格是乙個平面,但不建議使用unity自身生成的plane,因為unity生成的面數較多,可通過3dmax等建模工具來自行建模,如下所示:
對於材質,最重要的則是shader的書寫,我將其列在下方,以方便大家使用:
[csharp]view plain
copy
print?
shader "iphone/******shadow"
} subshader
pass
} } }
shader "iphone/******shadow"
} subshader
pass}}}
通過以上設定即可生成最簡單的陰影效果,大家可以通過自己設定指令碼來控制陰影的移動和變化等等。
但是,該陰影生成方法有乙個明顯的「硬傷」,即該陰影只能適用於平坦的地面,一旦地面凹凸不平或有遮擋物,則會出現「穿幫」的效果,如下圖所示,該方法生成的陰影對腳下的正方體完全沒有影響,所以為了解決這種問題,投影生成法應運而生。
2、 投影生成法
該方法本質上來說是一種貼花(decal)技術,即設定乙個投影器,然後將陰影貼圖投射到你想展現陰影的地方,該方法的優點在於投影效果不取決於被投影區域的幾何形狀,即被投影區域可以任意凹凸的曲面,也可以處理各種障礙物。該方法生成的陰影效果如下:
下面我就具體介紹一下該陰影的生成方法:
(1)通過「gameobject->create empty」來建立乙個空的物體,並取名為「shadow projector」。
(2)通過「component->effects->projector」在該空物體上加入projector元件,並通過平移、旋轉和調整引數達到如下效果:
(3)然後在material選項中拖入已經準備好的材質,即可投影出陰影,效果如下:
我們看到,場景中不僅生成了陰影,同時角色的身體也「變黑」了,這是因為投影器的「ignore layers」設定為「nothing」的緣故,我們將可忽略層設為角色的層「player」,則可使角色不再被投影,效果如下:
(4)最終的shadow projector的inspector檢視如下:
其中材質所用到的shader為:
[csharp]view plain
copy
print?
shader "projector/multiply"
_fallofftex ("falloff", 2d) = "white"
} subshader
pass
alphatest greater 0
colormask rgb
blend dstcolor zero
offset -1, -1
settexture [_shadowtex]
settexture [_fallofftex]
} }
}
shader "projector/multiply"
_fallofftex ("falloff", 2d) = "white"
}subshader
pass
alphatest greater 0
colormask rgb
blend dstcolor zero
offset -1, -1
settexture [_shadowtex]
settexture [_fallofftex] }}
}
通過以上的步驟,我們即可實現投影式的陰影生成方法。與第一種方法一樣,可以設定一些特定指令碼來控制該陰影的移動以及變化等等。另外,需要注意的一點是「ignore layers」選項的設定,原則上是盡量去掉那些不需要被投影的層,從而來減少不必要的計算量。
上述兩種方法是目前移動平台上的主流陰影生成方法,優點是生成簡單,使用方便、計算量較小,但缺點同樣突出,即該陰影是假的,並不是真的物體投射陰影,所以真實感並不強。下面我就介紹兩種目前可以在移動平台上使用的實時動態陰影生成方法,不過在這篇中我們只介紹陰影效果,並不介紹具體的實現技術和生成方法,留待以後高階教程中講解。
3、
shadow map方法
雖然unity目前並不支援在移動裝置上生成動態陰影,但同樣可以通過rendertexture來生成簡單的shadow map,效果圖如下所示:
我們看到所生成的陰影存在鋸齒,這是由於shadow map解析度不夠所致,你可以通過增加rendertexture的解析度來減少鋸齒的影響,如下圖所示,當然這樣做的同時也會帶來一定的渲染消耗。
4、 環境遮擋方法
該方法取自於遊戲《shadow gun》,通過分析物體的近似環境遮擋資訊來實時生成動態陰影,效果如下圖所示:
其生成方法大致為如下三步:
首先在角色腳底生成乙個顯示陰影的網格。
其次,根據分別在角色的跨步以及兩腿處生成三個圓球,通過這三個圓球來計算底面的環境遮擋(ambient occlusion)資訊。
最後,根據計算所得ao資訊來動態細分網格,這樣就可以生成最終的ao陰影。
小結
綜上所述,本文已經給出了移動平台上角色陰影的兩種基本渲染方法及其shader實現,在這裡我並沒有去分析每種渲染效果的原理,而僅是從實際出發,直接給出對應的簡單實現方法。如果想要對陰影的生成方法進行深入理解,可以google搜尋其原理進行了解。對於後兩種真實的動態陰影生成方法,我將在後續的blog中進行詳細更新。
Unity3D遊戲開發
入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...
Unity3d 移動平台中文顯示問題
unity3d在android平台上不能顯示中文,可以通過自定義字型實現.據說unity3d4.x後會支援動態文字顯示 1.先找到乙個字型,以微軟雅黑為例子,在unity3d 專案中新建乙個font資料夾,將字型放到資料夾中.2.選中字型,character選擇為custom set 3.在font...
Unity3D模型製作規範
unity3d模型製作規範 一.單位,比例統一 在建模型前先設定好單位,在同一場景中會用到的模型的單位設定必須一樣,模型與模型之間的比例要正確,和程式的匯入單位一致,即便到程式需要縮放也可以統一調整縮放比例。統一單位為公尺。二.模型規範 所有角色模型最好站立在原點。沒有特定要求下,必須以物體物件中心...