製作demo時有沒有遇到過,急需大量角色資源,但又無從下手的煩惱?
www.dota2.com/workshop/requirements
V社早已公開《Dota2》的模型,模型骨骼貼圖一應俱全,可以直接用他的資源來進行demo製作。
左邊是unity內渲染,右邊是《Dota2》展示界面。
看似一切美好,下載模型貼圖,扔到unity,網上找個DotaShader,貼圖一貼,轉為人形骨骼,就可以隨意套動作庫。
然而這個想法,讓我經歷了一周的噩夢。
先總結下我這一周的感想:
他給的貼圖問題很大,需要睜大眼睛看清楚。國內對《Dota2》渲染寫的文章,就沒一個是對的。官方沒有發shader,需要從網上犄角旮旯處拼湊。《Dota2》用魔改BlinnPhong模擬PBR效果,有點吃力不討好下面開始正文。
|1.《Dota2》貼圖問題
先看一下原始貼圖資源。
一個材質球有接近20張貼圖。平均一個角色3個材質球,多的時候有6個。
首先檢查一下貼圖,你會發現一堆問題。
法線上有某個uv的水印(大概是2u,但是模型內沒有2u)。某些貼圖uv是反過來的(紅圈處),而且不是每個角色都這樣。你以為這就完了?下了多個角色後會發現,有些法線是DX有些是OpenGL。
貼圖上有亂七八糟的信息?uv有問題?不同人物的貼圖命名規範還不一樣?
怕不是valve派實習生用截幀工具抓出來的資源,真有你的啊G胖。
|2.國內網站上關於《Dota2》渲染文章的錯誤
官方提供的文檔只有一個。
http://wiki.polycount.com/w/images/8/85/Dota2ShaderMaskGuide.pdf
後來修改了一版。
https://support.steampowered.com/kb/3081-QUXN-6209/dota-2-workshop-item-shader-masks
很多人寫的文章只包含四五張圖片,對幾張不理解的mask和warp圖絕口不提。
更有甚者能毫無根據得腦補一套算法,也是厲害。
關鍵最終渲染不好看。
我在了解到網上沒有現成shader後,揭開了SubstancePainter 和 Marmoset Toolbag的Dota2Shader。興致衝衝,以為找到了光明。結果看了兩宿後才知道,他們只是為自家軟體做的,很多參數上來就power個256次,而且還缺很多貼圖。
所以我根據以往經驗來推斷Dota2Shader。
|3.我來拼湊shader
先把熟悉的貼圖拿出來
然後把Warp和條狀貼圖拿出來,這些貼圖之後再說。
剩下四個。
分別是RimMask,specularExponent ,specularMask,tintByBaseMask。
從名字可以看出來,他們分別和菲涅爾,高光形狀,高光顏色有關。Mask是乘上去,Exponent是指數(power的冪)。
菲涅爾 * RimMask
BlinnPhong^Exponent * SpecularMask
Lerp(固有色,自選高光顏色,Tint),相當於在製造pbr的specular貼圖。
specular貼圖在standard裡用的是Lerp(0.04, 固有色, 金屬度),有興趣的可以試一試,長的差不多。不過這個顏色可以自己調。
左邊是金屬度轉的,右邊是tint轉的
好,大部分素材都集齊,回頭看一下我印象裡光照模型。
直射光 / 環境光的漫反射 / 鏡面反射一共四項。
先看directDiffuse也就是直射光漫反射。
他用到了halfLambert + DiffuseWarp,具體效果如上圖。
用這個方法可以實現一點點假3s效果。
其次,他使用DiffuseWarpMask當作UV的V,用於在一個材質球內使用多種顏色的DiffuseWarp。
注意DiffuseWarp要改為sRGB和UVClamp。
看藍胖皮膚側面偏紫,土貓更是有紅綠兩層顏色。
indirectDiffuse就當一個顏色,加上去解決。
最麻煩的是兩個specular。
我在遊戲內一直想找光滑度特別高,能反射旁邊環境的材質,也就是反射球indirect specular。
在unity內,長這樣。
然後我對比了下遊戲內,沒有發現任何一個角色有反射球內容。《Dota2》最接近黑色光滑金屬的龍騎,也沒有反射球內容。
而且打開角色資源內的CubeMap會發現,他只有周邊和底部有亮色。
於是我推斷,《Dota2》內是不是沒有傳統的direct specular和indirect specular,而是一個魔改的DOTASpecular!
依靠這個想法,我在substance的《Dota2》中尋找線索。
菲涅爾 * 法線朝上的面 * 自選顏色,這不就是indirect specular嗎。
moba遊戲內,必然存在朝上的面對著天空,朝下的面對著地面。
妙啊,靠rim來模擬環境光。
cubemap不用在反射球,我猜測是加到directSpecular的燈光顏色內,讓高光顏色更加豐富一些。
整理一下,dota光照模型。
其中有一段max(Fresnel(外黑內白),DiffuseWarpMask)。
我的理解是讓主光的高光在模型邊緣處減少,避免高亮的邊緣出現,是一個很主觀的參數。
剩下的幾張warp。
fresnelWarpColor,fresnelWarpRim,fresnelWarpSpec這三張必然和NdotV有關。
顏色很像PBR常用到的F0公式。OneMinus,Pow5 和 帶F0的Fresnel,分別對應三張貼圖,大概吧。
bloom和selfIllumMask1,我猜測和後處理bloom有關。reflectance實在沒猜出和什麼有關。
|4.我的感想
本來想白嫖《Dota2》模型製作demo,結果折騰這麼久的么蛾子。
真想快速使用,套standard材質,把固有色法線金屬度光滑度自發光一貼,啥事沒有。
既然都自定義渲染,就不要太糾結具體過程(說的就是我),只要製作軟體和遊戲內達成一致就好,畫面好壞的最後還是得看美術。
《Dota2》作為一個2013年的遊戲,為了兼容當年低端電腦,使用了很多trick技術。放在現在看,貼圖解析度/模型面數/渲染技術,比手機遊戲標準還低,但是畫面表現還算不錯。
這讓我不禁感慨科技發展。
1.這套渲染不適用於什麼
想模擬現實中的材質,PBR還是有無可比擬的優勢。(主要是高光)
PBR材質不等於寫實風格遊戲。同理,卡通風格遊戲也可以用PBR材質。
槍火重生,守望先鋒等一系列遊戲都是用PBR渲染。只是在模型設計和配色上偏卡通。
槍火重生
2.這套渲染適用於什麼
物理材質無法滿足你,想使用風格化渲染,就可以嘗試各種warp貼圖來定製渲染。
如二次元的渲染。
不過在製作貼圖的軟體上,得配套完善工作流,要不然面對20來張不知所謂的貼圖,任何美術都得崩潰。
最後來一張藍胖鎮樓。