以前的人皮渲染相關
html
前篇1:unity3d Human skin real time rendering 真實模擬人皮實時渲染函數
前篇2:unity3d Human skin real time rendering plus 真實模擬人皮實時渲染 plus篇spa
SSS:Unity3d shader之次表面散射(Subsurface Scattering).net
PBR:Unity3d 基於物理渲染Physically-Based Rendering之specular BRDF3d
Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin其實就是Screen-Space Subsurface Scattering與Subsurface Scattering 簡稱SSSSS&SSS,8S,博主自創,,哈哈也不是,結合了許多資料弄出了看的更順眼的人皮。。是否是要寫篇論文了呢= =。。。code
原本是錄了視頻的,可是視頻降質,色差太大,就沒有上傳。。。
orm
先上肉質鮮嫩的兩張圖視頻
夜光引擎(Luminous Studio)的新demo->witch,能明顯看到SSS和PBR效果,文章的最後也有對比,最終幻想的引擎渲染就是棒
htm
想 要人皮膚更加真實,人皮膚上的細節成了一個關鍵問題,包括褶皺、毛孔、毛囊,甚至是傷疤,這既能夠形成咱們的障礙,也能夠幫助咱們使皮膚看起來更真實。如 果只是用普通的Lambert,甚至是PBR獲得的效果也是不真實的,很是生硬、乾燥,塑料質感。以下圖所示,下圖(No SSSSS)是博主用unity5 的standard PBR shader來渲染的。咱們缺的就是次表面散射,以前的文也說過了,皮膚實際上是有些輕微的半透明的,大多數的漫反射光來自次表面散射 ,光線接觸到皮膚時,有大約96%被皮膚各層散射了,只有大約4%被反射了,因此咱們實現了SSS再加上PBR,就給予皮膚渲染一個很是真實的結果,以下 圖所示,(SSSSS ON)是unity5 的standard PBR shader再加上屏幕空間的SSS的處理,比以前的更加真實,柔軟(博主在此處用 unity的PBR僅做對比,下文要講local SSS與SSSSS的結合)。
咱們把皮膚當作三層,油脂層(微量,很薄),表皮層,真皮層。正是由於有油脂層,由於油脂層直接把光反射出去,因此皮膚上纔會有高光產生,咱們使用PBR的高光完美模擬皮質層,稍後講解。下圖爲多層皮膚模型。
blog
沒有被反射的光經過折射進入子表面層,光進入這些層以後部分被吸取(得到顏色)和散射,再從皮膚中入射點附近的出射點射出。這個過程就產生了次表面散射的效果。
先講解local SSS
只講解一下油脂層的反射產生的specular
首先實現一下GPU Gem3提到的Beckmann 分佈函數和Fresnel Reflectance。
它使用了一個貼圖來模擬Beckmann 分佈
這是GPU Gem3的代碼
1 float fresnelReflectance( float3 H, float3 V, float F0 ) 2 { 3 float base = 1.0 - dot( V, H ); 4 float exponential = pow( base, 5.0 ); 5 return exponential + F0 * ( 1.0 - exponential ); 6 } 7 float PHBeckmann( float ndoth, float m ) 8 { 9 float alpha = acos( ndoth ); 10 float ta = tan( alpha ); 11 float val = 1.0/(m*m*pow(ndoth,4.0))*exp(-(ta*ta)/(m*m)); 12 return val; 13 } 14 // Render a screen-aligned quad to precompute a 512x512 texture. 15 float KSTextureCompute(float2 tex : TEXCOORD0) 16 { 17 // Scale the value to fit within [0,1] – invert upon lookup. 18 return 0.5 * pow( PHBeckmann( tex.x, tex.y ), 0.1 ); 19 } 20 float KS_Skin_Specular( float3 N, // Bumped surface normal 21 float3 L, // Points to light 22 float3 V, // Points to eye 23 float m, // Roughness 24 float rho_s, // Specular brightness 25 uniform texobj2D beckmannTex ) 26 { 27 float result = 0.0; 28 float ndotl = dot( N, L ); 29 if( ndotl > 0.0 ) 30 { 31 float3 h = L + V; // Unnormalized half-way vector 32 float3 H = normalize( h ); 33 float ndoth = dot( N, H ); 34 float PH = pow( 2.0*f1tex2D(beckmannTex,float2(ndoth,m)), 10.0 ); 35 float F = fresnelReflectance( H, V, 0.028 ); 36 float frSpec = max( PH * F / dot( h, h ), 0 ); 37 result = ndotl * rho_s * frSpec; // BRDF * dot(N,L) * rho_s 38 } 39 return result; 40 }
博主的實現結果:
而後是以前寫的文章Unity3d 基於物理渲染Physically-Based Rendering之specular BRDF
的光照模型的specular效果
這裏咱們可使用Specular Occlusion高光遮蔽的方法遮蔽咱們不想要的高光,好比咱們不想要眉毛也有油脂層的高光,就須要作一個高光遮蔽貼圖,把眉毛等處遮蔽。
下圖右側的鼻孔,眉毛等處都是不想要的高光。
還有遮蔽高光的毛孔
關於細節部分能夠本身生成second specular lobe
下圖是使用3ds Max的 noise functions生成的微觀細節
再把細節高光和高光線性混合
最後注意:
因爲油脂層的油和皮膚最外層的組織細胞爲電介質材質,它們在反射光線時不會對光進行着色(如金這種金屬會賦予光金色,由於其在可見光波長段極大地改變了折射序號),所以,基於物理的皮膚着色在反射應使用白色
而後處理表皮層
仍是blur6次達到表皮層的次表面散射效果,皮膚的顏色基原本自於表皮層
上表的結果以下圖
上表爲爲了在texture-space diffusion圖片空間的漫反射的權重,也就是在不一樣的顏色通道以不一樣的範圍和程度進行blur,博主在ps 中進行高斯blur,也能夠用代碼來高斯blur
光 線通過真皮層帶出了血液的顏色,這就皮膚會有血色的緣由。咱們使用顏色查找貼圖Look up Texture的方式來模擬在真皮層的散射,以下圖,圖中右上角是一張 brdf查找貼圖,咱們要經過曲率curvature(球半徑1/r,求法見圖中左上部分)和N•L,獲得結果如圖中下半部分。
截止到這裏local SSS已經基本成型,結果以下
在阻擋光散射的邊界也不僅是愣愣的黑影,以下圖
unity的片斷着色器支持自陰影,在陰影部分也使用查找貼圖映射顏色,
這是博主實現結果
截止到這裏local SSS的次表面散射效果已經很不錯了,若是再加上屏幕空間次表面散射,效果更加真實
上一個步驟以後咱們已經獲得一個次表面散射皮膚了,屏幕空間SSS以後效果plus。
也是須要用blur來模擬多層散射,像大理石等只散射一次的就不須要這麼屢次blur。
咱們須要進行4次pass,共4次blur,前三次是 Subsurface Scattering Pass,最後一次須要降採樣blur-> Boom Pass。
博主懶了,用grid暴力採樣9次blur,效果仍是能夠。
四次pass以下圖所示
最後一次pass的模糊需降採樣到size/2而後在blur
最後要切記色彩空間要是linear空間。
左圖爲linear空間,右圖爲gamma空間,在gamma空間,次表面效果直接消失了。。。
更多效果圖請看:Unity5 Screen-Space Subsurface Scattering屏幕空間次表面散射SSSSS
實現參考:
1. Screen-Space Sub Surface Scattering for real-time skin rendering
2. Review of Screen-Space Subsurface Scattering
3. GPU Pro - Screen-Space Perceptual Rendering of Human Skin
4. GPU Pro2 - Real-Time Approximation of Light Transport in Translucent Homogenous Media
5. GPU Pro2 - Pre-Integrated Skin Shading
6. Gpu Gems1 -Real-Time Approximations to Subsurface Scattering
7. Gpu Gems3 - The Importance of Being Linear
8. Gpu Gems3 - Advanced Techniques for Realistic Real-Time Skin Rendering
以前的人皮渲染相關
前篇1:unity3d Human skin real time rendering 真實模擬人皮實時渲染
前篇2:unity3d Human skin real time rendering plus 真實模擬人皮實時渲染 plus篇
SSS:Unity3d shader之次表面散射(Subsurface Scattering)
PBR:Unity3d 基於物理渲染Physically-Based Rendering之specular BRDF
博主近期渲染:最近用unity5弄的一些渲染
---- by wolf96