本發(fā)明涉及一種游戲角色的頭發(fā)處理方法及系統(tǒng),屬于計(jì)算機(jī)領(lǐng)域。
背景技術(shù):
隨著游戲品質(zhì)的要求提升,人物頭發(fā)的逼真渲染效果將能夠更加凸顯人物模型的真實(shí)頭發(fā)效果,讓人物渲染上變得更加生動(dòng)和栩栩如生。一般游戲在處理人物頭發(fā)上采用最簡(jiǎn)單的漫反射貼圖加高光貼圖的處理技術(shù)。
采用漫反射加高光通道的技術(shù)基本流程圖如下,請(qǐng)參考圖1:
漫反射通道采用入射光線(xiàn)和法線(xiàn)的點(diǎn)積來(lái)計(jì)算漫反射的顏色,高光通道采用半角向量(入射光線(xiàn)和視線(xiàn)的中間平均值)和法線(xiàn)的點(diǎn)積來(lái)計(jì)算物體的鏡面反射高光。
通過(guò)上面的流程圖可以看出以上方案存在以下3點(diǎn)缺陷:
(1)高光貼圖僅僅包含了像素上高光信息,如果再增加像素上的鏡面光滑程度的信息,就可以在頭發(fā)上的細(xì)節(jié)處刻畫(huà)地更加細(xì)膩些。
(2)在手游上出于性能上的考慮往往是不添加實(shí)時(shí)光而是采用烘焙光照貼圖的方式,這種方式使得頭發(fā)并不能表現(xiàn)出真實(shí)光照下的光影效果,使得頭發(fā)渲染變得不怎么真實(shí)。即便是添加了實(shí)時(shí)像素光,然而大部分情況下光源是用來(lái)照射場(chǎng)景物體,設(shè)定是不動(dòng)的光源,這樣方向固定不變的光源對(duì)頭發(fā)的照射反射渲染出來(lái)的高光效果可能不是我們想要看到的。
(3)頭發(fā)是偏向大部分不透明,少部分透明的物體,頭發(fā)的末尾處應(yīng)該用半透明混合的方式處理表現(xiàn)效果才夠更加真實(shí)逼真,然而采用舊方案并沒(méi)有對(duì)這一層上做任何處理。
Unity每次在準(zhǔn)備數(shù)據(jù)并通知GPU渲染的過(guò)程稱(chēng)為一次drawcall。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)的不足,本發(fā)明的技術(shù)方案提供了一種游戲角色的頭發(fā)處理方法及系統(tǒng),用于實(shí)現(xiàn)頭發(fā)表現(xiàn)效果上的更加逼真渲染和具有層次感,及半透明混合導(dǎo)致渲染穿插的高效處理。
本發(fā)明的技術(shù)方案包括一種游戲角色的頭發(fā)處理方法,其特征在于,該方法包括:A.創(chuàng)建模擬光源,并將頭發(fā)模型自身顏色及明暗信息繪制到漫反射貼圖中,對(duì)頭發(fā)模型的高光貼圖與模擬光源進(jìn)行疊加處理;B.對(duì)所述步驟A得到的頭發(fā)模型的透明部分及非透明部分使用雙通道進(jìn)行渲染;C.對(duì)所述步驟B進(jìn)行渲染后頭發(fā)模型進(jìn)行穿插處理,包括執(zhí)行網(wǎng)格分割,并對(duì)頭發(fā)模型進(jìn)行動(dòng)態(tài)渲染。
在一個(gè)優(yōu)選的實(shí)施方案中,所述步驟A還包括:S21,使用著色器為頭發(fā)模型前后分別創(chuàng)建對(duì)應(yīng)的模擬光源,并對(duì)經(jīng)過(guò)模擬光源照射后的頭發(fā)模型執(zhí)行漫反射貼圖的計(jì)算;S22,獲取有角色頭發(fā)模型的高光貼圖,同時(shí)對(duì)高光通道的填充值進(jìn)行編輯,根據(jù)所述步驟S21得到的漫反射貼圖,進(jìn)一步執(zhí)行高光貼圖的顏色與漫反射貼圖顏色的疊加。
在一個(gè)優(yōu)選的實(shí)施方案中,所述步驟S22還包括:其中對(duì)高光通道的填充值編輯包括對(duì)紅通道依舊填充高光的值,對(duì)綠通道填充鏡面光澤度的值,對(duì)藍(lán)通道填充異向遮罩值。
在一個(gè)優(yōu)選的實(shí)施方案中,所述步驟B還包括:S31,使用通道一對(duì)頭發(fā)模型的非透明部分進(jìn)行鏤空渲染處理;S32,使用通道二對(duì)頭發(fā)模型的半透明部分進(jìn)行濾出,進(jìn)而執(zhí)行渲染。
在一個(gè)優(yōu)選的實(shí)施方案中,所述步驟S31還包括:獲取頭發(fā)模型像素值,對(duì)頭發(fā)模型像素值進(jìn)行判定,若頭發(fā)模型像素值低于預(yù)設(shè)閾值,則刪除該頭發(fā)模型像素,刪除后的頭發(fā)模型像素不參與后續(xù)鏤空渲染,其中閾值可以自定義設(shè)置。
在一個(gè)優(yōu)選的實(shí)施方案中,所述步驟S32還包括:獲取頭發(fā)模型像素值,對(duì)頭發(fā)模型像素值進(jìn)行判定,若頭發(fā)模型像素值高于預(yù)設(shè)閾值,則刪除該頭發(fā)模型像素,刪除后的頭發(fā)模型像素不參與后續(xù)渲染,其中閾值可以自定義設(shè)置。
在一個(gè)優(yōu)選的實(shí)施方案中,其中的步驟B還包括:所述步驟S31、S32均使用渲染雙面執(zhí)行渲染處理,并且在渲染過(guò)程中不剔除頭發(fā)模型的陰影。
在一個(gè)優(yōu)選的實(shí)施方案中,所述步驟C還包括:S81,對(duì)將頭發(fā)模型分割為前模型和后模型;S82,實(shí)時(shí)計(jì)算前模型與游戲中虛擬攝像機(jī)的距離D2、衣服模型到虛擬攝像機(jī)的模型D1;S83,比較D1與D2的大小,若D2比D1小,則把前模型的渲染隊(duì)列設(shè)置為比RQ1大,若D2比D1大,則把前模型的渲染隊(duì)列設(shè)置為比RQ1小,其中RQ1為衣服模型渲染隊(duì)列。
本發(fā)明的技術(shù)方案還包括根據(jù)上述任意方法的一種游戲角色的頭發(fā)處理系統(tǒng),其特征在于,該系統(tǒng)包括:渲染準(zhǔn)備模塊,用于創(chuàng)建模擬光源,并將頭發(fā)模型自身顏色及明暗信息繪制到漫反射貼圖中,對(duì)頭發(fā)模型的高光貼圖與模擬光源進(jìn)行疊加處理;渲染執(zhí)行模塊,對(duì)所述渲染準(zhǔn)備模塊得到的頭發(fā)模型的透明部分及非透明部分使用雙通道進(jìn)行渲染;渲染穿插處理模塊,用于對(duì)所述渲染執(zhí)行模塊進(jìn)行渲染后頭發(fā)模型進(jìn)行穿插處理,包括執(zhí)行網(wǎng)格分割,并對(duì)頭發(fā)模型進(jìn)行動(dòng)態(tài)渲染。
本發(fā)明的有益效果為:
(1)頭發(fā)表現(xiàn)效果上的更加逼真渲染和具有層次感。頭發(fā)上通過(guò)添加幾個(gè)假光來(lái)模擬真實(shí)光源,不僅節(jié)省了真實(shí)光源帶來(lái)的性能消耗,而且也能夠處理具體的光源效果,通過(guò)調(diào)整前向光和后向光可以表現(xiàn)出頭發(fā)的層次感。頭發(fā)上光照貼圖添加鏡面光澤度信息,在高光上進(jìn)一步處理高光的計(jì)算公式,使得高光表現(xiàn)更加逼真細(xì)膩。頭發(fā)上使用最少的兩個(gè)pass來(lái)渲染出頭發(fā)的雙面和半透明效果。
(2)半透明混合導(dǎo)致渲染穿插的高效處理。半透明混合導(dǎo)致的穿插問(wèn)題,為了避免實(shí)時(shí)三角形排序,采用分割網(wǎng)格和實(shí)時(shí)動(dòng)態(tài)根據(jù)攝像機(jī)位置修改渲染隊(duì)列,很高效地處理好了頭發(fā)渲染穿插的問(wèn)題。
附圖說(shuō)明
圖1所示為現(xiàn)有技術(shù)方案的流程圖;
圖2所示為根據(jù)本發(fā)明實(shí)施方式的總體流程圖;
圖3所示為根據(jù)本發(fā)明實(shí)施方式的雙通道渲染流程圖;
圖4所示為根據(jù)本發(fā)明實(shí)施方式的穿插渲染流程圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)描述。本發(fā)明的游戲角色的頭發(fā)處理方法及系統(tǒng)適用于游戲動(dòng)畫(huà)圖像的開(kāi)發(fā)。
圖2所示為根據(jù)本發(fā)明實(shí)施方式的總體結(jié)構(gòu)圖。
第一部分:角色頭發(fā)渲染準(zhǔn)備。具體如下(1)-(2)所示,包括:
(1)人物頭發(fā)上本身的顏色和明暗里相關(guān)的信息按每個(gè)像素繪制到漫反射貼圖里??紤]到實(shí)時(shí)光性能消耗較大的因素,于是在shader(著色器)中添加一個(gè)假光充當(dāng)真實(shí)光源,為假光添加光的顏色(_LightColor)、光的方向向量(_LightDir)及光的強(qiáng)度(_LightIntensity)。在游戲中渲染其他物體也可以添加一個(gè)假光,這樣在游戲中可以通過(guò)全局修改shader里的_LightDir和_LightIntensity的值,來(lái)模擬真實(shí)光照的效果。比如在游戲中天空突然出了一道閃電,那么可以將閃電到物體的方向向量賦值到_LightDir上,并調(diào)高光的強(qiáng)度來(lái)模擬閃電發(fā)出閃光的效果。
在shader中計(jì)算漫反射顏色為rgb = s.Albedo * _LightColor * NdotL * atten * _LightIntensity;其中NdotL是光的方向向量與法線(xiàn)的點(diǎn)積,即NdotL = saturate(dot(s.Normal, _LightDir))。
為了在人物頭發(fā)上表現(xiàn)地更加有層次感,即不同的光照下表現(xiàn)出來(lái)的光源效果。為了模擬這樣的效果,需要再shader中再添加兩個(gè)假光,分別是前向光和后向光,前向光用來(lái)對(duì)照射物體的前面部分,后向光用來(lái)照射物體的后面部分。顏色上的疊加和前面的計(jì)算公式一樣,比如前向光的方向_FrontLightDir,光的顏色_FrontLightColor,光的強(qiáng)度_FrontLightIntensity,這樣算得出的前向光顏色
rgb = s.Albedo * _FrontLightColor * saturate(dot(s.Normal,_FrontLightDir)) * _FrontIntensity。
這樣在頭發(fā)上通過(guò)添加一個(gè)全局的假光和兩個(gè)前向光和后向光,就可以在游戲中全局地控制頭發(fā)的光影效果和表現(xiàn)出頭發(fā)的層次感。
(2)為了更好地表現(xiàn)頭發(fā)的高光效果,這里對(duì)高光貼圖做進(jìn)一步地處理。高光貼圖的紅通道依舊填充高光的值,綠通道填充鏡面光澤度的值,藍(lán)通道填充異向遮罩值。測(cè)試結(jié)果這里的藍(lán)通道填充純白色即可。高光的計(jì)算公式如下:
Fixed HdotA=dot(S.Normal,h);
Float aniso=max(0,sin(radians((HdotA+_AnisoOffset)*180)))
Float spec=pow(aniso,s.Gloss*_Gloss)*s.Specular
其中h即是半角向量(光的方向向量與視線(xiàn)的中間平均值),即h = normalize(normalize(_LightDir)+ normalize(viewDir))。引入_AnisoOffset用來(lái)控制高光的區(qū)域,通過(guò)調(diào)整這個(gè)值可以調(diào)整高光在頭發(fā)上的位置。s.Gloss即是高光貼圖的綠通道值,s.Specular即是高光貼圖高光值,通過(guò)以上的公式就算出了高光值。
最終高光顏色rgb = spec * _SpecularColor * atten * SpecularIntensity。這里乘以自定義的高光顏色和高光強(qiáng)度。該高光顏色最終與上面計(jì)算出來(lái)的三個(gè)假光疊加出來(lái)的顏色再進(jìn)一步疊加,就是頭發(fā)自身的最終顏色。
第二部分為雙通道渲染處理,具體如下所示:
為了表現(xiàn)出頭發(fā)這種大部分不透明,少部分半透明的物體渲染,需要為shader多添加一個(gè)pass來(lái)渲染半透明的部分。
考慮到頭發(fā)的背面大部分都是被頭部擋住,為了減少更多的pass(一個(gè)pass一個(gè)drawcall,drawcall越高越耗性能),所以頭發(fā)的透明部分和半透明部分都采用渲染雙面的方式處理,在shader中添加指令Cull Off(關(guān)閉陰影面剔除)。通過(guò)這樣可以既讓頭發(fā)有了半透明的渲染效果,而且可以讓pass減少到最少,只有兩個(gè)pass。
第一個(gè)pass需要先對(duì)非透明部分進(jìn)行渲染處理,所以需要鏤空。直接通過(guò)cutoff的操作,具體公式是clip(o.Alpha - _Cutoff),其中o.Alpha是像素的透明值,_Cutoff是自定義的cutoff值,公式效果會(huì)把o.Alpha - _Cutoff結(jié)果為零的值切掉不參與后續(xù)的像素操作。
由于第一步pass的cutoff處理會(huì)導(dǎo)致頭發(fā)出現(xiàn)鋸齒的情況,所以需要接下來(lái)第二個(gè)pass的混合處理。
第二個(gè)pass需要先過(guò)濾出半透明的部分進(jìn)行處理。使用的具體公式是clip(-(o.Alpha - _Cutoff)),跟上面pass1相反的操作。然后添加指令Blend SrcAlpha OneMinusSrcAlpha和ZWrite off。半透明物體渲染是不寫(xiě)深度(寫(xiě)深度會(huì)導(dǎo)致頭發(fā)后面的不透明物體渲染不出來(lái))。
通過(guò)兩個(gè)pass就可以把頭發(fā)的半透明的效果處理好,這種處理方式同樣適用于其他大部分不透明少部分半透明的物體渲染,比如植被渲染。
第三部分:半透明渲染穿插處理。
有種情況頭發(fā)會(huì)出現(xiàn)半透明渲染穿插的問(wèn)題,就是當(dāng)頭發(fā)是很長(zhǎng)的頭發(fā)和人物衣服也是半透明的情況下會(huì)出現(xiàn)渲染錯(cuò)亂問(wèn)題。對(duì)于這種情況,主要問(wèn)題是出在人物頭發(fā)和衣服有交叉的情況,頭發(fā)先渲染和后渲染都會(huì)有一部分頭發(fā)出現(xiàn)渲染問(wèn)題。
如果采用實(shí)時(shí)三角形排序不僅需要頭發(fā)模型和衣服模型網(wǎng)格合并在一起處理,而且還需要實(shí)時(shí)地對(duì)網(wǎng)格里的三角形進(jìn)行排序,該方式非常地消耗性能和導(dǎo)致大量gc。
故這里采用一種更加合理的處理方法,就是分割網(wǎng)格和實(shí)時(shí)動(dòng)態(tài)修改頭發(fā)的渲染隊(duì)列。即把頭發(fā)分割成前頭發(fā)模型和后頭發(fā)模型,在游戲中分別實(shí)時(shí)計(jì)算前頭發(fā)模型和攝像機(jī)的距離D2,衣服到攝像機(jī)的距離D1,如果D2比D1小,則把前頭發(fā)模型的渲染隊(duì)列設(shè)置比RQ1大即可(RQ1是衣服的渲染隊(duì)列),否則設(shè)置比RQ1小。對(duì)于后頭發(fā)模型在游戲中也這樣處理。
圖3所示為根據(jù)本發(fā)明實(shí)施方式的雙通道渲染流程圖。參考圖2的雙通道渲染處理步驟。
圖4所示為根據(jù)本發(fā)明實(shí)施方式的穿插渲染流程圖。參考圖2的半透明渲染穿插處理步驟。
以上所述,只是本發(fā)明的較佳實(shí)施例而已,本發(fā)明并不局限于上述實(shí)施方式,只要其以相同的手段達(dá)到本發(fā)明的技術(shù)效果,都應(yīng)屬于本發(fā)明的保護(hù)范圍。在本發(fā)明的保護(hù)范圍內(nèi)其技術(shù)方案和/或?qū)嵤┓绞娇梢杂懈鞣N不同的修改和變化。