發表文章

目前顯示的是 1月, 2021的文章

Tree It:免費且功能豐富的捏樹軟體

圖片
    我前陣子在Reddit上面看到有人在Unity的討論區詢問捏樹的軟體,有人推薦了Tree It。我試著使用後發現這套軟體不但功能比Unity內建的捏樹功能豐富且強大。Unity內建的捏樹功能其實滿簡單的,而且有侷限性,並不是很好用。我還有看到一套Unity插件叫做Mtree,不過需要付費 Tree It 雖然不如SpeedTree強大,可是基本要用的功能應有盡有,而且免費。以下我會分享一些我覺得滿實用的功能與一些缺點,然後如果時間允許在下一篇文章我會分享如何將Tree It製作的樹匯入Unity中還帶有風力的頂點動畫。 支援節點的手動編輯 植栽的外型不僅可以靠參數設定生成,也可以手動編輯節點,因此可以控制枝條各個節點的位置、角度等等,甚至能夠截斷枝條,而葉片也可以手動選取刪除。   沒有自訂樹狀階層的功能 跟Unity內建的樹狀階層不同,TreeIt每個檔案階層數目與類別是固定且有限的,只有樹幹>>枝條>>小枝條>>葉片(Mesh)。 然而你可以把捏成的樹當作Mesh使用,捏好後的樹即使被當作Mesh使用風力也能正常計算,所以並不是太大的問題。在TreeIt本身附的範例中可以看到很多是單獨捏出分枝的枝葉的模型然後再將這片枝葉的模型當作Mesh使用,所以實際上階層數目和和種類依然可以自訂,只是與Unity的運作方式不太一樣。   將植栽直接渲染成貼圖 可以將捏好的植栽依照目前的視角渲染成貼圖,貼圖種類跟支援的貼圖一樣,包含顏色、法線、光滑度、透光度四種。 這個功能很好用,除了直接做Billboard之外還能將捏好的枝葉渲染成貼圖。  雖然圖中沒有顯示,但是這套軟體會自動處理邊緣的Dilate(Padding)。     手動調節面數 沒有自動生成LOD的功能,但是有刪減面數(Poly Reduction)的功能,枝葉也能調節段數。   更豐富的參數控制 控制枝葉的形狀、生成位置等等參數控制比Unity內建的捏樹功能更多能控制的細節。   貼圖集(Texture Altas) 可以把多個同種類的貼圖打包成一張,Unity內建的捏樹功能會自動化不能自己設定。   烘焙於頂點色的Ambient Occlusion(AO) 雖然此軟體找...

Unity:嘗試製作可相交的視差遮蔽貼圖Shader (Parallax Occlusion Mapping Shader with Pixel Depth Offset)

圖片
  警告,本文只是分享摸索的過程,並不是完善的技術文。     視差貼圖(Parallax Mapping)是一種改進後的凹凸貼圖的技術,可以用極少的面數模擬複雜模型的表面凹凸,因為介紹視差貼圖這個技術的文章很多了此處就不詳細介紹,本文只大概說明使用視差貼圖要怎麼讓模型與一般的物件產生正確的陰影投射和相交的效果。  一般的視差貼圖的做法是依照切線空間的視線相量位移貼圖採樣的UV座標而產生立體感,物件本身的幾何形狀並未更改,因此各個像素的深度也是原有形狀的位置,因此相交時無論畫面上的物體因為視差貼圖產生凹凸的樣貌為何,相交還是依照原有的幾何形狀,而接收物件陰影投射亦有相同狀況。(如下圖) Unity中的HDRP中內建的Lit Shader提供的像素深度位移(Pixel Depth Offset)的功能,可以讓各個像素的深度位置依照視差貼圖位移的量產生位移,進而讓視差貼圖凹凸的效果也能對應到物件的相交上。(如下圖) 需要提到的是Unreal引擎的Shader也有同個功能,但無論是Unity和Unreal引擎的做法我都無法取得夠詳細的資料,雖然Unity的Lit Shader可以找到原始碼,但是太複雜了,目前暫時還是沒有辦法理清做法。 (゚∀。) 為了產生正確的物件相交與陰影投射勢必要計算出正確的深度,那麼怎麼計算正確的深度呢?我的做法就是直接將像素的世界空間座標依照凹凸的位移量計算出位移後的世界座標,然後再計算剪裁空間的座標,然後就得出深度了。 需要說的是我採用的視差貼圖技術是視差遮蔽貼圖(Parallax Occlusion Mapping,POM) ,原先是在Shader Graph中用Custom Function節點製作的,結果如下方的影片。   參考了Unity的做法,使用的是高度圖而非深度圖,因此高度(深度)最低為0,最高為1,需要特別注意。 取得視差位移後的深度首先第一步是求出視差位移後的高度(深度)。這個很簡單,回傳位移後的UV時一並回傳目前的高度(深度),如下圖可以看到高度最低至最高由0到1的灰階漸層。 一旦取得高度後便可以取得世界空間的座標位移量,算法如下。 offsetDistance在本文中指的都是最大的凹凸位移量。 float3 worl...