本文主要參考了:
Fur Effects - Teddies, Cats, Hair ....
Unity Fur Shader 皮毛著色器
基本原理
原文主要介紹了如何使用多個layer(pass)來模擬毛發(fā)的體積感菠劝,其中每個pass之間采用alpha混合,沿著法線越往外的layer的alpha為0的區(qū)域越大,以模擬毛發(fā)從根部到頂部越來越尖的效果擂找。
具體計算的每層的alpha的方式是使用一張噪聲圖母赵,然后對取到的噪聲使用一個clamp操作溉瓶,低于閾值的噪聲值其alpha為0寝贡。這個閾值越往外越高唯竹,使得毛發(fā)從根部到頂端越來越窄唬渗。
模擬環(huán)境光吸收
因為毛發(fā)越靠近根部越密集典阵,可以認(rèn)為越靠近根部會吸收更多的環(huán)境光。于是我們給靠近根部的毛發(fā)顏色一個衰減镊逝,可以看到圖中添加AO后相比沒有時更富有層次感和體積感壮啊。
單根毛發(fā)陰影
然而僅有AO在某些情況下仍然不能得到較好的效果。例如當(dāng)觀察者視角和光照視角比較接近時撑蒜,對于單色紋理往往看到的會是大片混合在一起的缺少對比度的相似毛發(fā)顏色歹啼,從而削弱了材質(zhì)的效果玄渗。
我們認(rèn)為光線在單根毛發(fā)表面同樣會發(fā)生漫反射,因此可以近似的認(rèn)為毛發(fā)背光的一面較暗(陰影部分)狸眼。加入了單根陰影的渲染可以讓每一根毛發(fā)不再產(chǎn)生相同(或者相似)的顏色藤树,從而增加了材質(zhì)的層次感。我們可以看到上圖的放大效果中份企,第二張圖我們能夠更容易的分辨出每一根毛發(fā)的形狀也榄。
這里具體的實現(xiàn)方式是:將光線方向通過TBN矩陣轉(zhuǎn)換到表面UV空間取xz分量得到一個UVOffset方向,然后在fragment shader中采樣并計算原始UV的alpha和偏移后的UV的alpha司志,如果alpha的差是大于0的話那么顯然這個部位就是背光部分甜紫。
高光
這里我的想法是采用一種類似頭發(fā)高光的各向異性高光(Kajiya-Kay),原理這里就不講了骂远,具體就是拿毛發(fā)的切向量和半角向量取sin值囚霸。
實踐中取切向量的方式是在vertex shader中拿當(dāng)前頂點(diǎn)的位置減去上一層頂點(diǎn)的位置。
不過最后出來效果還不是特別好激才,高光表現(xiàn)的不太連續(xù)給人很大的噪點(diǎn)感拓型,另外明顯能看到面與面之間的差別。
對于面與面之間的這個問題應(yīng)該增加面數(shù)就能解決瘸恼,這里采用的是自帶的sphere所以可以理解劣挫。我個人想法是之后還需要對tangent做一下處理,目前感覺來看高光主要集中在毛發(fā)尖端东帅。
透射效果
部分光線會穿過毛發(fā)內(nèi)部進(jìn)入觀察者的眼鏡压固,因此我們可以加入透射效果增強(qiáng)毛發(fā)的質(zhì)感。這里我們可以添加一個和光源方向無關(guān)的來自環(huán)境光的rim light靠闭,以及來自光源的透射光帐我。
直射光的透射方程仍然使用dot(-V,L)取一個指數(shù)冪控制擴(kuò)散大小,最后也要乘以1 - dot(N,L)愧膀,以避免背面不會被光線照射到的部分也出現(xiàn)透射光拦键。
力場/動態(tài)效果
第二個博客中實現(xiàn)了原文中的基礎(chǔ)效果和力場效果,使得毛發(fā)收到類似重力的影響檩淋。本次實踐我將毛發(fā)的力場與物體的運(yùn)動相結(jié)合芬为,制造出了一種動態(tài)效果,不僅能看到形態(tài)上的變化蟀悦,也能看到反射的高光根據(jù)運(yùn)動的變化而變化碳柱。
其他
類似的效果不僅能做皮毛,也能做成草地之類的效果熬芜,同時還能再引入一個紋理去變化頂點(diǎn)的位置來模擬草地被風(fēng)吹拂的動態(tài)效果。