1. 程式人生 > >Unity3D遊戲製作 移動平臺上的角色陰影製作

Unity3D遊戲製作 移動平臺上的角色陰影製作

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

本系列文章由 Amazonzx 編寫,歡迎轉載,轉載請註明出處。

http://blog.csdn.net/amazonzx/article/details/7973740

 

本文將重點介紹兩種目前在移動平臺上的主流陰影製作技術,同時也會簡單介紹兩種移動平臺上相對較為高階的動態陰影生成方法。

由於目前主流使用Unity3.x在移動平臺上並不支援陰影的動態生成技術,所以目前最普遍流行同時價效比也最高的陰影生成方法有以下兩種:

 

1、  簡單貼圖法

所謂簡單貼圖法即是直接在角色的角底附加一個陰影半透明貼圖,並讓其跟隨角色一起運動,一般是將該陰影Object成為角色模型的子物體,該種陰影生成效果如下:

 

陰影的Inspector檢視如下:

 

其中ShadowComponent

是控制陰影的一個指令碼,與其生成無關,故不再這裡介紹。影響該應用生成的主要有兩個部分,一個是Shadow網格,另外一個則是渲染所需要的材質“No Name”。需要注意的是,Shadow網格是一個平面,但不建議使用Unity自身生成的Plane,因為Unity生成的面數較多,可通過3DMax等建模工具來自行建模,如下所示:

 

對於材質,最重要的則是Shader的書寫,我將其列在下方,以方便大家使用:

 

[csharp] view plain copy print
?
  1. Shader "iPhone/SimpleShadow"  
  2. {  
  3.     Properties  
  4.     {  
  5.         _MainTex ("MainTex", 2D) = "" {}  
  6.     }  
  7.   
  8.     SubShader  
  9.     {  
  10.         Tags { "Queue" = "Transparent" }  
  11.   
  12.         Pass  
  13.         {  
  14.             Blend SrcAlpha OneMinusSrcAlpha  
  15.               
  16.             Color [_clrBase]  
  17.               
  18.             Cull Off  
  19.             Lighting Off  
  20.             SetTexture [_MainTex] { combine texture, one - texture }  
  21.         }  
  22.     }  
  23. }  
Shader "iPhone/SimpleShadow"{ Properties {  _MainTex ("MainTex", 2D) = "" {} } SubShader {  Tags { "Queue" = "Transparent" }  Pass  {   Blend SrcAlpha OneMinusSrcAlpha      Color [_clrBase]      Cull Off   Lighting Off   SetTexture [_MainTex] { combine texture, one - texture }  } }}


通過以上設定即可生成最簡單的陰影效果,大家可以通過自己設定指令碼來控制陰影的移動和變化等等。

 

但是,該陰影生成方法有一個明顯的“硬傷”,即該陰影只能適用於平坦的地面,一旦地面凹凸不平或有遮擋物,則會出現“穿幫”的效果,如下圖所示,該方法生成的陰影對腳下的正方體完全沒有影響,所以為了解決這種問題,投影生成法應運而生。

 

 

2、  投影生成法

該方法本質上來說是一種貼花(Decal)技術,即設定一個投影器,然後將陰影貼圖投射到你想展現陰影的地方,該方法的優點在於投影效果不取決於被投影區域的幾何形狀,即被投影區域可以任意凹凸的曲面,也可以處理各種障礙物。該方法生成的陰影效果如下:

 

下面我就具體介紹一下該陰影的生成方法:

(1)           通過“GameObject->Create Empty”來建立一個空的物體,並取名為“Shadow Projector”。

 

(2)           通過“Component->Effects->Projector”在該空物體上加入Projector元件,並通過平移、旋轉和調整引數達到如下效果:

 

 

(3)           然後在Material選項中拖入已經準備好的材質,即可投影出陰影,效果如下:

 

我們看到,場景中不僅生成了陰影,同時角色的身體也“變黑”了,這是因為投影器的“Ignore Layers”設定為“Nothing”的緣故,我們將可忽略層設為角色的層“Player”,則可使角色不再被投影,效果如下:

 

(4)           最終的Shadow ProjectorInspector檢視如下:

 

其中材質所用到的shader為:

[csharp] view plain copy print ?
  1. Shader "Projector/Multiply" {  
  2.    Properties {  
  3.       _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }  
  4.       _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }  
  5.    }  
  6.   
  7.    Subshader {  
  8.       Tags { "RenderType"="Transparent-1" }  
  9.       Pass {  
  10.          ZWrite Off  
  11.          Fog { Color (1, 1, 1) }  
  12.          AlphaTest Greater 0  
  13.          ColorMask RGB  
  14.          Blend DstColor Zero  
  15.          Offset -1, -1  
  16.          SetTexture [_ShadowTex] {  
  17.             combine texture, ONE - texture  
  18.             Matrix [_Projector]  
  19.          }  
  20.          SetTexture [_FalloffTex] {  
  21.             constantColor (1,1,1,0)  
  22.             combine previous lerp (texture) constant  
  23.             Matrix [_ProjectorClip]  
  24.          }  
  25.       }  
  26.    }  
  27. }  
Shader "Projector/Multiply" {   Properties {      _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }      _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }   }   Subshader {      Tags { "RenderType"="Transparent-1" }      Pass {         ZWrite Off         Fog { Color (1, 1, 1) }         AlphaTest Greater 0         ColorMask RGB         Blend DstColor Zero   Offset -1, -1         SetTexture [_ShadowTex] {            combine texture, ONE - texture            Matrix [_Projector]         }         SetTexture [_FalloffTex] {            constantColor (1,1,1,0)            combine previous lerp (texture) constant            Matrix [_ProjectorClip]         }      }   }}

 

通過以上的步驟,我們即可實現投影式的陰影生成方法。與第一種方法一樣,可以設定一些特定指令碼來控制該陰影的移動以及變化等等。另外,需要注意的一點是“Ignore Layers”選項的設定,原則上是儘量去掉那些不需要被投影的層,從而來減少不必要的計算量。

上述兩種方法是目前移動平臺上的主流陰影生成方法,優點是生成簡單,使用方便、計算量較小,但缺點同樣突出,即該陰影是假的,並不是真的物體投射陰影,所以真實感並不強。下面我就介紹兩種目前可以在移動平臺上使用的實時動態陰影生成方法,不過在這篇中我們只介紹陰影效果,並不介紹具體的實現技術和生成方法,留待以後高階教程中講解。

 

3、 Shadow Map方法

雖然Unity目前並不支援在移動裝置上生成動態陰影,但同樣可以通過RenderTexture來生成簡單的Shadow Map,效果圖如下所示:

 

我們看到所生成的陰影存在鋸齒,這是由於Shadow Map解析度不夠所致,你可以通過增加RenderTexture的解析度來減少鋸齒的影響,如下圖所示,當然這樣做的同時也會帶來一定的渲染消耗。

 

4、  環境遮擋方法

該方法取自於遊戲《Shadow Gun》,通過分析物體的近似環境遮擋資訊來實時生成動態陰影,效果如下圖所示:

       

其生成方法大致為如下三步:

首先在角色腳底生成一個顯示陰影的網格。

 

其次,根據分別在角色的跨步以及兩腿處生成三個圓球,通過這三個圓球來計算底面的環境遮擋(Ambient Occlusion)資訊。

 

最後,根據計算所得AO資訊來動態細分網格,這樣就可以生成最終的AO陰影。

 

小結

綜上所述,本文已經給出了移動平臺上角色陰影的兩種基本渲染方法及其Shader實現,在這裡我並沒有去分析每種渲染效果的原理,而僅是從實際出發,直接給出對應的簡單實現方法。如果想要對陰影的生成方法進行深入理解,可以Google搜尋其原理進行了解。對於後兩種真實的動態陰影生成方法,我將在後續的blog中進行詳細更新。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述

本系列文章由 Amazonzx 編寫,歡迎轉載,轉載請註明出處。

http://blog.csdn.net/amazonzx/article/details/7973740

 

本文將重點介紹兩種目前在移動平臺上的主流陰影製作技術,同時也會簡單介紹兩種移動平臺上相對較為高階的動態陰影生成方法。

由於目前主流使用Unity3.x在移動平臺上並不支援陰影的動態生成技術,所以目前最普遍流行同時價效比也最高的陰影生成方法有以下兩種:

 

1、  簡單貼圖法

所謂簡單貼圖法即是直接在角色的角底附加一個陰影半透明貼圖,並讓其跟隨角色一起運動,一般是將該陰影Object成為角色模型的子物體,該種陰影生成效果如下:

 

陰影的Inspector檢視如下:

 

其中ShadowComponent是控制陰影的一個指令碼,與其生成無關,故不再這裡介紹。影響該應用生成的主要有兩個部分,一個是Shadow網格,另外一個則是渲染所需要的材質“No Name”。需要注意的是,Shadow網格是一個平面,但不建議使用Unity自身生成的Plane,因為Unity生成的面數較多,可通過3DMax等建模工具來自行建模,如下所示:

 

對於材質,最重要的則是Shader的書寫,我將其列在下方,以方便大家使用:

 

[csharp] view plain copy print ?
  1. Shader "iPhone/SimpleShadow"  
  2. {  
  3.     Properties  
  4.     {  
  5.         _MainTex ("MainTex", 2D) = "" {}  
  6.     }  
  7.   
  8.     SubShader  
  9.     {  
  10.         Tags { "Queue" = "Transparent" }  
  11.   
  12.         Pass  
  13.         {  
  14.             Blend SrcAlpha OneMinusSrcAlpha  
  15.               
  16.             Color [_clrBase]  
  17.               
  18.             Cull Off  
  19.             Lighting Off  
  20.             SetTexture [_MainTex] { combine texture, one - texture }  
  21.         }  
  22.     }  
  23. }  
Shader "iPhone/SimpleShadow"{ Properties {  _MainTex ("MainTex", 2D) = "" {} } SubShader {  Tags { "Queue" = "Transparent" }  Pass  {   Blend SrcAlpha OneMinusSrcAlpha      Color [_clrBase]      Cull Off   Lighting Off   SetTexture [_MainTex] { combine texture, one - texture }  } }}


通過以上設定即可生成最簡單的陰影效果,大家可以通過自己設定指令碼來控制陰影的移動和變化等等。

 

但是,該陰影生成方法有一個明顯的“硬傷”,即該陰影只能適用於平坦的地面,一旦地面凹凸不平或有遮擋物,則會出現“穿幫”的效果,如下圖所示,該方法生成的陰影對腳下的正方體完全沒有影響,所以為了解決這種問題,投影生成法應運而生。

 

 

2、  投影生成法

該方法本質上來說是一種貼花(Decal)技術,即設定一個投影器,然後將陰影貼圖投射到你想展現陰影的地方,該方法的優點在於投影效果不取決於被投影區域的幾何形狀,即被投影區域可以任意凹凸的曲面,也可以處理各種障礙物。該方法生成的陰影效果如下:

 

下面我就具體介紹一下該陰影的生成方法:

(1)           通過“GameObject->Create Empty”來建立一個空的物體,並取名為“Shadow Projector”。

 

(2)           通過“Component->Effects->Projector”在該空物體上加入Projector元件,並通過平移、旋轉和調整引數達到如下效果:

 

 

(3)           然後在Material選項中拖入已經準備好的材質,即可投影出陰影,效果如下:

 

我們看到,場景中不僅生成了陰影,同時角色的身體也“變黑”了,這是因為投影器的“Ignore Layers”設定為“Nothing”的緣故,我們將可忽略層設為角色的層“Player”,則可使角色不再被投影,效果如下:

 

(4)           最終的Shadow ProjectorInspector檢視如下:

 

其中材質所用到的shader為:

[csharp] view plain copy print ?
  1. Shader "Projector/Multiply" {  
  2.    Properties {  
  3.       _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }  
  4.       _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }  
  5.    }  
  6.   
  7.    Subshader {  
  8.       Tags { "RenderType"="Transparent-1" }  
  9.       Pass {  
  10.          ZWrite Off  
  11.          Fog { Color (1, 1, 1) }  
  12.          AlphaTest Greater 0  
  13.          ColorMask RGB  
  14.          Blend DstColor Zero  
  15.          Offset -1, -1  
  16.          SetTexture [_ShadowTex] {  
  17.             combine texture, ONE - texture  
  18.             Matrix [_Projector]  
  19.          }  
  20.          SetTexture [_FalloffTex] {  
  21.             constantColor (1,1,1,0)  
  22.             combine previous lerp (texture) constant  
  23.             Matrix [_ProjectorClip]  
  24.          }  
  25.       }  
  26.    }  
  27. }  
Shader "Projector/Multiply" {   Properties {      _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }      _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }   }   Subshader {      Tags { "RenderType"="Transparent-1" }      Pass {         ZWrite Off         Fog { Color (1, 1, 1) }         AlphaTest Greater 0         ColorMask RGB         Blend DstColor Zero   Offset -1, -1         SetTexture [_ShadowTex] {            combine texture, ONE - texture            Matrix [_Projector]         }         SetTexture [_FalloffTex] {            constantColor (1,1,1,0)            combine previous lerp (texture) constant            Matrix [_ProjectorClip]         }      }   }}

 

通過以上的步驟,我們即可實現投影式的陰影生成方法。與第一種方法一樣,可以設定一些特定指令碼來控制該陰影的移動以及變化等等。另外,需要注意的一點是“Ignore Layers”選項的設定,原則上是儘量去掉那些不需要被投影的層,從而來減少不必要的計算量。

上述兩種方法是目前移動平臺上的主流陰影生成方法,優點是生成簡單,使用方便、計算量較小,但缺點同樣突出,即該陰影是假的,並不是真的物體投射陰影,所以真實感並不強。下面我就介紹兩種目前可以在移動平臺上使用的實時動態陰影生成方法,不過在這篇中我們只介紹陰影效果,並不介紹具體的實現技術和生成方法,留待以後高階教程中講解。

 

3、 Shadow Map方法

雖然Unity目前並不支援在移動裝置上生成動態陰影,但同樣可以通過RenderTexture來生成簡單的Shadow Map,效果圖如下所示:

 

我們看到所生成的陰影存在鋸齒,這是由於Shadow Map解析度不夠所致,你可以通過增加RenderTexture的解析度來減少鋸齒的影響,如下圖所示,當然這樣做的同時也會帶來一定的渲染消耗。

 

4、  環境遮擋方法

該方法取自於遊戲《Shadow Gun》,通過分析物體的近似環境遮擋資訊來實時生成動態陰影,效果如下圖所示:

       

其生成方法大致為如下三步:

首先在角色腳底生成一個顯示陰影的網格。

 

其次,根據分別在角色的跨步以及兩腿處生成三個圓球,通過這三個圓球來計算底面的環境遮擋(Ambient Occlusion)資訊。

 

最後,根據計算所得AO資訊來動態細分網格,這樣就可以生成最終的AO陰影。

 

小結

綜上所述,本文已經給出了移動平臺上角色陰影的兩種基本渲染方法及其Shader實現,在這裡我並沒有去分析每種渲染效果的原理,而僅是從實際出發,直接給出對應的簡單實現方法。如果想要對陰影的生成方法進行深入理解,可以Google搜尋其原理進行了解。對於後兩種真實的動態陰影生成方法,我將在後續的blog中進行詳細更新。