最近逃課作遊戲,逃的有幾門都要停考了,呵呵呵,百忙之中不忘超炒冷飯,感受以前的人皮效果仍是不夠好,又改進了一些東西html
首先上圖git
放大看細節github
顯而易見的比上次的效果要好不少,這次我把模型用3dmax進行了細化,模型裂縫狀況有所好轉,可是嘴脣等處仍是有明顯裂縫(沒辦法,網上沒有比這個再細緻的貼圖了)
去除了以前全部大量的rim,換成了SSS次表面散射以前一篇文章詳細講過,
SSS次表面散射的參數真心難調= =;
漫反射換成了基於物理的Oren Nayar反射模型
算法
高光反射與以前一篇相同,這裏簡單介紹下
BRDF首先由Fred Nicodemus在1965年提出
L是輻射率,或射線方向中立體角的能量,E是輻照度,或每單位角度的輻照能,theta_i是法線與wi的夾角,i代表是入射光incident light,r代表是反射光reflected light。
ide
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;
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 中的沙子渲染也用了這種方法
學習
光通過哪,就帶一部分那裏的顏色,能夠發現光從入射到出射,位置和方向都變了
光走的路徑數量是無窮大,光反射回來的都爲漫反射,油脂表面的透明度也都是不同的,
這就產生了次表面散射
具體算法公式在這裏此處再也不贅述
相要變得更真實還能夠加一些noise進去
spa
加了bloom效果以後:3d
感受這次效果還不是很完美,隨着學習的深刻還會繼續改進;
code
所有代碼已上傳至github
----by wolf96