前面的話
上一篇Unity醬~ 卡通渲染技術分析(一) 寫了CharaMain.cginc,服裝的渲染是怎么實現的。這篇來分析一下頭發跟皮膚的實現
頭發
本來以為unitychan的頭發會有各向異性的實現,沒想到她也是用的CharaMain.cginc實現的。我們來看看頭發的材質
其他實現都一樣,也是通過高光反射貼圖來控制高光區域跟反射區域
計算法線跟視角向量的點積,這樣的效果是越垂直於視角向量的高光越大,然后用RGB貼圖來控制哪些區域更容易出高光
反射依然是用A通道來控制,越白的地方,反射的越強
如何實現皮膚效果
這么漂亮的皮膚,其實只用了兩個效果就實現了
漫反射+邊緣光
這一次我們來詳細說一下漫反射的實現
float_t normalDotEye = dot( i.normal, i.eyeDir );
float_t falloffU = clamp( 1 - abs( normalDotEye ), 0.02, 0.98 );
還是用法線跟視角向量的點積,並且限制在了0.02到0.98的范圍。
本來是夾角越小的值越大,夾角越大的值越小,用1 - 去點積的絕對值后,表示越靠近視角向量的,就越接近0。跟視角向量夾角越大,值也就越大,也就是邊緣的部位值會越大
float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );
float3_t combinedColor = lerp( diffSamplerColor.rgb, falloffSamplerColor.rgb * diffSamplerColor.rgb, falloffSamplerColor.a );
用剛剛求出來的值,采樣的這張衰減貼圖,也就是反映出皮膚質感的重要一步了!值越大,采樣出的顏色就越接近肉色。也就是越邊緣越接近肉色
FALLOFF_POWER 是一個衰減系數,skin shader中的值為1,也就是不衰減
再加上邊緣高光
總結
unity chan的技術分析差不多完了,主要的技術特點如下:
- 漫反射是用N.V的值去采樣一張衰減貼圖實現的,這張貼圖還可以用來實現皮膚效果
- 通過一張高光反射貼圖來控制高光的細節,以及哪些區域要顯示反射
- 邊緣光沒用菲涅爾反射,而是采樣rim貼圖后去乘以漫反射值得到的邊緣高光
- 描邊不是純色的,采樣了紋理顏色,再做了暗化處理
最后再來兩張照片吧~~ 這套渲染效果其實還是蠻不錯的