前面的話
上一篇Unity醬~ 卡通渲染技術(shù)分析(一) 寫了CharaMain.cginc馋记,服裝的渲染是怎么實(shí)現(xiàn)的宽堆。這篇來(lái)分析一下頭發(fā)跟皮膚的實(shí)現(xiàn)
頭發(fā)
本來(lái)以為unitychan的頭發(fā)會(huì)有各向異性的實(shí)現(xiàn),沒(méi)想到她也是用的CharaMain.cginc實(shí)現(xiàn)的号胚。我們來(lái)看看頭發(fā)的材質(zhì)
其他實(shí)現(xiàn)都一樣脑豹,也是通過(guò)高光反射貼圖來(lái)控制高光區(qū)域跟反射區(qū)域
計(jì)算法線跟視角向量的點(diǎn)積稍途,這樣的效果是越垂直于視角向量的高光越大,然后用RGB貼圖來(lái)控制哪些區(qū)域更容易出高光
反射依然是用A通道來(lái)控制,越白的地方账磺,反射的越強(qiáng)
如何實(shí)現(xiàn)皮膚效果
這么漂亮的皮膚滞造,其實(shí)只用了兩個(gè)效果就實(shí)現(xiàn)了
漫反射+邊緣光
這一次我們來(lái)詳細(xì)說(shuō)一下漫反射的實(shí)現(xiàn)
float_t normalDotEye = dot( i.normal, i.eyeDir );
float_t falloffU = clamp( 1 - abs( normalDotEye ), 0.02, 0.98 );
還是用法線跟視角向量的點(diǎn)積谒养,并且限制在了0.02到0.98的范圍趁耗。
本來(lái)是夾角越小的值越大,夾角越大的值越小曼月,用1 - 去點(diǎn)積的絕對(duì)值后谊却,表示越靠近視角向量的,就越接近0哑芹。跟視角向量夾角越大炎辨,值也就越大,也就是邊緣的部位值會(huì)越大
float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );
float3_t combinedColor = lerp( diffSamplerColor.rgb, falloffSamplerColor.rgb * diffSamplerColor.rgb, falloffSamplerColor.a );
用剛剛求出來(lái)的值聪姿,采樣的這張衰減貼圖碴萧,也就是反映出皮膚質(zhì)感的重要一步了乙嘀!值越大,采樣出的顏色就越接近肉色破喻。也就是越邊緣越接近肉色
FALLOFF_POWER 是一個(gè)衰減系數(shù)虎谢,skin shader中的值為1,也就是不衰減
再加上邊緣高光
總結(jié)
unity chan的技術(shù)分析差不多完了低缩,主要的技術(shù)特點(diǎn)如下:
- 漫反射是用N.V的值去采樣一張衰減貼圖實(shí)現(xiàn)的嘉冒,這張貼圖還可以用來(lái)實(shí)現(xiàn)皮膚效果
- 通過(guò)一張高光反射貼圖來(lái)控制高光的細(xì)節(jié),以及哪些區(qū)域要顯示反射
- 邊緣光沒(méi)用菲涅爾反射咆繁,而是采樣rim貼圖后去乘以漫反射值得到的邊緣高光
- 描邊不是純色的讳推,采樣了紋理顏色,再做了暗化處理
最后再來(lái)兩張照片吧~~ 這套渲染效果其實(shí)還是蠻不錯(cuò)的