基於Unity引擎的Bent Normal實現

2021-08-25 05:53:28 字數 2329 閱讀 8497

個人主頁:

作者也是u sparkle活動參與者,uwa歡迎更多開發朋友加入u sparkle開發者計畫,這個舞台有你更精彩!

最近半年趕專案的事情一直很忙,好不容易有空做點渲染的東西,於是嘗試了一下 bent normal maps

這是unreal 4.17發布的功能之一,可以拿來解決間接光照漏光。

工具部分 substaince designer已經支援利用高模烘焙bent normal

效果圖對比來自unreal 4文件:

為了實現這個,首先要理解一下思路。gpu gems chap. 17 ambient occlusion 裡面是這麼描述的:

遊戲裡的低模帶上法線代表的是高模的法線,但是這裡其實沒有考慮周圍mesh的遮蔽影響。如果間接光照直接使用普通法線,就可能出現『暗部漏光』的現象。

偷懶的同學可以參考乙份中文介紹 bent normal (

雖然substaince designer可以直接烘焙(話說也可以用ssao後處理,不過弄手遊的暫時就不貪心了…),但出於做著玩的角度,肯定是嘗試在unity裡實現烘焙。

gpu gems裡提到的是:

我腦洞了一下:是否可以用unity的shadowmap來替代可見性計算:

1.生成乙個球狀平行光分布(真正烘焙的時候會比這個密很多)

2.每次從不同角度渲染物體,利用shadow map可以得到每個畫素可見性。有幾個需要注意的地方:

light上用hard shadow,需要的話調整下bias等引數;

不要用screen space shadow;

注意相機位置、模型大小,讓shadow map利用率最高;

ps.我一開始是使用graphics.drawmeshnow直接繪製到rendertexture的,後來發現很多變數引擎不會自動傳過去,最後換了個路子,直接設定 camera.targettexture 然後camera.render 省心多了。

新建一張float的rendertexture,然後blend one one情況下各個角度渲染一遍疊加:如果沒有影子,rgb輸出光源方向,a輸出1計數;最後rgb/a儲存下來即可。

最後生成的結果需要做幾遍dilation 解決邊緣取樣問題。

和sd出的圖比了下,只能說方向上沒問題,但是還有不少細節差距很大。

左:我的方法處理效果

右:substaince designer處理效果

不過好處也是有的:substaince designer 匯出的是 normalized bent normal;我自己生成的時候b通道拿來存了 ao strength,還可以當成 mesh ao 使用。另外就是在unity 裡烘焙確實流程簡單+迭代起來快。 放在自己專案裡比較了下背光時候 diffuse ibl 部分的效果(暫時只用了天光地光),因為法線平滑了很多所以漏光好了很多:

左:沒有bent normal效果

右:bent normal效果

目前的結論是在手遊上可以嘗試使用一下的,反正低配乙個 keyword 關掉就行了。

接下來有精力的話還要好好迭代下預處理烘焙這塊。 unity 這套 baker 方案擴充套件一下其實有非常多二次開發的空間,譬如 ao、normal 等完全可以實現自定義的烘焙(當然另外一條路就是寫c++的 ray tracing 來搞 baker)。

sd/sp/max 等美術 dcc 工具最大問題是 public api 不是很多,如果想定製輸出不是很方便;若只是最終結果的 encode 還好辦,如果想拿中間結果就很費勁。在 unity 裡搞 baker 的最大意義即在於此。

順便po一張圖:三個面光源下,max 裡 vray 烘焙到貼圖和 unity 裡 enlighten 烘焙到貼圖的對比,看上去還是比較有搞頭的(左邊模型鞋子/腰帶上的問題其實是 max 裡**出錯了)。

這樣最大的好處是提高定製性和整合工作流順暢度。

基於Unity3D引擎的Android遊戲優化

最近專案進入收尾階段,之前對專案做了很多優化,mesh合併 減少drawcall和模型骨骼以及物理計算,合併材質球,優化 等等,在ios上還好,但是android上,試過幾款手機,從低端到高階,發現效能還是很差,所以又花了幾天來研究摸索,終於把遊戲效能搞定。記錄下來,留作以後參考。1.更 新不透明貼...

如何測試基於Unity3D引擎的遊戲

由於遊戲的介面是通過遊戲引擎渲染出來的,遊戲介面沒有系統原生的控制項資訊,所以對於遊戲,我們需要接入 poco sdk 才能獲取到遊戲介面中的控制項資訊。下面以unity開發的手遊為例,介紹如何在android和ios平台進行連線。android 平台 這個資料夾轉殖下來。將轉殖下來的unity3d...

Unity遊戲開發 Unity物理引擎

詳細講解unity的物理引擎系統以及物理元件的應用及注意事項。學習剛體rigidbody和碰撞體collider元件的工作方式和應用場景。我們設計了非常高效的教學路徑,讓你快速入門unity物理元件的設定方式及操作流程。同時我們也對所有物理元件進行了非常詳細的講解及實操演示。帶你全面深度了解rigi...