unity3d Human skin real time rendering plus 真實模擬人皮實時渲染 plus篇


最近逃課做游戲,逃的有幾門都要停考了,呵呵呵,百忙之中不忘超炒冷飯,感覺之前的人皮效果還是不夠好,又改進了一些東西

 

首先上圖

 



放大看細節


顯而易見的比上次的效果要好很多,此次我把模型用3dmax進行了細化,模型裂縫情況有所好轉,但是嘴唇等處還是有明顯裂縫(沒辦法,網上沒有比這個再細致的貼圖了)
 

去除了之前所有大量的rim,換成了SSS次表面散射之前一篇文章詳細講過,
SSS次表面散射的參數真心難調= =;
漫反射換成了基於物理的Oren Nayar反射模型

specular

高光反射與之前一篇相同,這里簡單介紹下
 
BRDF首先由Fred Nicodemus在1965年提出
 
L是輻射率,或射線方向中立體角的能量,E是輻照度,或每單位角度的輻照能,theta_i是法線與wi的夾角,i表明是入射光incident light,r表明是反射光reflected light。
 

Cook-Torrance模型

 
F(l,h)是菲涅爾函數,
D(h)為分布函數,這個函數負責表面的光滑度,高光的形狀與大小,也與粗糙度相關,可以達到完美鏡面反射。
G(l,v,h)是幾何函數,

			float _SP = pow(8192, _GL);
			float d = (_SP + 2) / (8 * PIE) * pow(dot(n2, H), _SP);
			float f = _SC + (1 - _SC)*pow(2, -10 * dot(H, lightDir));
			float k = min(1, _GL + 0.545);
			float v = 1 / (k* dot(viewDir, H)*dot(viewDir, H) + (1 - k));

			float all = d*f*v;

		
			all = saturate(all);
			diff = (1 - all)*diff;
			diff = saturate(diff);


			spec3 *= Luminance(diff);
			spec3 = saturate(spec3);
			spec3 *= _SpecularPower;



diffuse

Oren–Nayar 反射模型由  Michael Oren和 Shree K. Nayar研發,是依據粗糙表面的漫反射模型,可以模擬很大范圍的物體,混凝土,塑料,沙子等。
它是基於物理的反射模型。
現 在大多數情況都在用Lambertian 模型,包括unity的diffuse,編寫surface shader的都知道,有lambert光照。Lambertian 模型在所有方向均勻的反射所有光線,這種方法模擬的diffuse不怎么真實,沒有根據roughness 粗糙度來計算漫反射。
 
真實圖像與Lambertian和Oren–Nayar的比較
 
Oren–Nayar和Lambertian 的亮度曲線

具體求法和wiki中的一樣
Sigma是表面粗糙度
E0是正面照射時的輻照度
Rho是表面反射
中間的步驟比較簡單
 

最終公式為
 

風之旅人journey 中的沙子渲染也用了這種方法
 
 

 

次表面散射(Subsurface Scattering)

 
光經過哪,就帶一部分那里的顏色,可以發現光從入射到出射,位置和方向都變了
光走的路徑數量是無窮大,光反射回來的都為漫反射,油脂表面的透明度也都是不一樣的,
這就產生了次表面散射
具體算法公式在這里此處不再贅述

相要變得更真實還可以加一些noise進去

加了bloom效果之后:

 


感覺此次效果還不是很完美,隨着學習的深入還會繼續改進;

全部代碼已上傳至github

                                      ----by wolf96

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM