大家好,我是麥田。上次跟大家分享了 U3D實時渲染教程之角色頭發各向異性表達(上) ,今天帶來後半部分U3D實時渲染教程之角色頭發各向異性表達(下)。
1、回顧
接上次一說到,我們知道了公式,回憶一下:

也用圖表搞了一個簡單的光照模型。

我對公式重新簡單梳理:

上次有看官留言到:


這裏講一下為什麼會選擇副切線,因為頭發的UV是從V方向鋪開的。
2、運用
透明是一切混亂的開端。
這裏讀者必須要理解幾個概念:
深度寫入
顏色寫入
深度測試
渲染隊列
渲染排序
這裏沒法花很大的篇幅講解,具體直接看樂樂入門書的第8章
隻能簡單的概括一下,對於半透的東西,渲染排序是很嚴謹的。透明物體的渲染一直是圖形學方麵比較蛋疼的地方。
對於透明物體的渲染,就不能像渲染不透明物體那樣多快好省,因為透明物體不會寫深度,也就是說透明物體之間的穿插關係是沒有辦法判斷的,所以半透明的物體在渲染的時候一般都是采用從後向前的方法進行渲染。
由於透明物體多了,透明物體不寫深度,那麼透明物體之間就沒有所謂的可以通過深度測試來剔除的優化,每個透明物體都會走像素階段的渲染,會造成大量的Over Draw。這也就是粒子特效特別耗費性能的原因。

下麵,我開了雙Pass來解決渲染次序這個問題,即:
第一個Pass隻渲染背麵關閉深度
第二個Pass隻渲染正麵開啟深度
由於Unity會順序執行SubShader中的各個Pass,因此我們可以保證背麵總是在正麵被渲染之前渲染,從而可以保證正確的深度渲染關係。


對於不會代碼的美術同學,沒關係,貼心的ASE具備雙Pass的功能(雖然最多隻支持到雙Pass,我覺得挺良心了)

Pass1:

Pass2:

下麵,展示一下我用的模型和貼圖:
mask:

Diffuse:
主要用來提Alpha的,雖然可以合到上邊的Mask的A通道內,太懶,就沒合

Normal

美術篇開始:
先定義一個法線,轉到世界空間,然後使用Mask的G通道與之相乘,要記得歸一化。

然後將其與我們的世界空間下的副切線加在一起,同時,我也Public了一個float類型的值,給進去,是為了能夠更好的偏移高光位置。可以自行腦補下高光上下偏移,最後記得歸一化。

輸入燈光方向+視口(觀察)方向

將他們Dot(點積)後平方,一減後開方,到這一步發現,我們已經幾乎完成了Kajiya-Kay光照模型的公式


為了做出柔和過度的高光,觀察一下下圖,1.區域很亮,2.區域柔和。
新Public 四個值,並且使用Pow來約束他們範圍強度,使用Mask的B通道乘進去,做出頭發的黑白區域,然後將他們與顏色相乘後疊加(Add)在一起


接下來,使用觀察方向和世界法線做一次Pow,來控製高光兩邊的範圍

將其疊加在一起,使用一個常量控製強度。

顏色部分,我構建了一個類似lambert的lerp來插值兩個顏色,為的是模擬受光麵到暗麵的過渡效果,即透氣感。

到了提Alpha的時候了,順便控製一下Alpha的強度

我們將插值後的Color和高光區域疊加,與平行光顏色強度相乘。 讓他受光照影響

最後,我們和alpha組合,分別輸出到pass1和pass2

我們掛起FrameDebugger

可以看一下他的渲染順序
先渲染了Pass1,即剔除前麵的

再渲染了Pass2剔除了背麵的



程序部分我就不詳細介紹了,重在思路。因為這次相比上一篇節點和程序的版本,有些地方有優化改動,Shader腳本還沒來得及改動。如果需要腳本等到下一篇文章的時候再發出來吧。
如果有錯誤,還請斧正。如果需要高清的圖表,模型貼圖等文件,聯係我就好。
最後的最後,最近在研究URP渲染管線,有同好可以一起交流探討URP和Shader。
來源:Thepoly 公眾號
熱門課程
專業講師指導 快速擺脫技能困惑相關文章
多種教程 總有一個適合自己專業問題谘詢
你擔心的問題,火星幫你解答《黑神話:悟空》作為一款現象級中國遊戲,其成功離不開多種先進計算機技術的支持。本文將深入解析該遊戲背後的關鍵技術,包括虛幻引擎......
在遊戲開發領域,Unity和Unreal Engine(虛幻引擎)都是備受推崇的遊戲引擎,但它們各自擁有不同的特點和優勢。
春節之後大量搶人!這6個行業是轉行首選,進去1年頂3年!火星畢業就能進
春節後求職,哪些行業進去能立馬漲薪?打破信息差很關鍵!
還沒畢業,就去幫電視台拍活動,作品被主任說“非常好”!猜猜是哪個專業呀?
回想過去,電子遊戲裏的草其實並不是真正的草。開發者們隻是簡單地把草的紋理直接貼在遊戲關卡的地板上
在火星的就業指導老師那裏,經常收到同學們這樣、那樣的提問。其中有一些共性問題,就業老師會根據自己豐富的經驗,為同學們給出合適的回答。