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

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

 

首先上圖git

 



放大看細節github


顯而易見的比上次的效果要好不少,這次我把模型用3dmax進行了細化,模型裂縫狀況有所好轉,可是嘴脣等處仍是有明顯裂縫(沒辦法,網上沒有比這個再細緻的貼圖了)
 

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

specular

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

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進去

spa

加了bloom效果以後:3d

 


感受這次效果還不是很完美,隨着學習的深刻還會繼續改進;

code

所有代碼已上傳至github

                                      ----by wolf96

相關文章
相關標籤/搜索