Unity3d 屏幕空間人體皮膚知覺渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin

以前的人皮渲染相關
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

先講解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高光遮蔽

這裏咱們可使用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的次表面散射效果已經很不錯了,若是再加上屏幕空間次表面散射,效果更加真實


SSSSS屏幕空間次表面散射

上一個步驟以後咱們已經獲得一個次表面散射皮膚了,屏幕空間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空間,次表面效果直接消失了。。。
 

最終結果展現

 

夜光引擎(Luminous Studio)的新demo->witch

博主的local SSS&SSSSS

 

 

 

 

 

unity standard shader&SSSSS

 

更多效果圖請看: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 

相關文章
相關標籤/搜索