日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Unity3d shader之次表面散射(Subsurface Scattering)

發(fā)布時間:2024/8/26 综合教程 67 生活家
生活随笔 收集整理的這篇文章主要介紹了 Unity3d shader之次表面散射(Subsurface Scattering) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

次表面散射是一種非常常用的效果,可以用在很多材質(zhì)上
如皮膚,牛奶,奶油奶酪,番茄醬,土豆等等

初衷是想做一個牛奶shader的,但后來就干脆研究了sss
這是在vray上的次表面散射效果

這是本文在unity中實現(xiàn)了的次表面散射效果:



左側(cè)為BRDF(雙向反射分布),右側(cè)為BSSRDF(雙向次表面散射反射分布)



各參數(shù)如上為:
S:BSSRDF結(jié)果
Rd: BSSRDF的漫反射
Fr:: 菲涅爾反射
Ft: 菲涅爾透明度,透射比
Fdr: 菲涅爾漫反射的反射率
E:輻照方向
Wiki
中給出:radiant fluence is the radiant energy received by a surface per unit
area, or equivalently the irradiance of a surface integrated over time
of irradiation
Phi:每單位表面受到的輻照能
Sigma A: 吸收率
Sigma S: 散射率
Sigma T: 消散率
Sigma T’ : 減少消散率
Sigma TR : 有效消散率
D:漫反射常量
Alpha: 反射率
P:相函數(shù)
Eta:反射的相關(guān)指數(shù)
g:散射角的平均cos值
Q:源分布值
Q0:第0個源分布
Q1:第1個源分布

漫反射近似


漫反射近似是基于光線高分散媒介傾向于各向異性的觀察,光源的分布與相函數(shù)是各向異性的。每次散射都模糊了光線的分布,隨著散射的次數(shù)增多導(dǎo)致光線的分布更加均勻。
這種輻照類似于一個二項式涉及單位表面受到的輻照能和輻照方向

使用了Henyey-Greenstein的相函數(shù):

常量決定于單位表面受到的輻照能和輻照方向。
對于一個無窮小的光線進入了一個媒介,入射能量將隨著進入深度s呈指數(shù)性減小
減小強度:

		<span>float Lri(float3 w_P, float phi_x, float p_L_Dist, float D)
		{
			float _Sigma_t = _Sigma_A + _Sigma_S;
			float L = 1 / (4 * PIE) * phi_x + 3 / (4 * PIE) * dot(w_P, -D*_Nabla * phi_x);

			float Lri = L * pow(E, -_Sigma_t* p_L_Dist);
			return Lri;
		}</span>

第一次散射減小強度,被作為體積來源處理

			for (int i = 0; i < 30; i++)
			{
				w_P = normalize(float3(N.x + rand(fixed2(i*0.05, i*0.05)), N.y + rand(fixed2(-i*0.05, i*0.05)), N.z + rand(fixed2(i*0.05, -i*0.05))));
				//	float3 w_P = normalize(float3(lightDir.x + rand(i.uv_MainTex + fixed2(i*0.01, i*0.01)), lightDir.y + rand(i.uv_MainTex + fixed2(-i*0.01, i*0.01)), lightDir.z + rand(i.uv_MainTex + fixed2(i*0.01, -i*0.01))));

				Q += phase(dot(lightDir, w_P))*Lri(w_P, phi_x, p_L_Dist, D);
				Q *= _Sigma_S;
				Q1 += Q*w_P;

			}

30次隨機光線散射方向

觀察光在體積內(nèi)部傳播行為,這個方程式很有用

這個方程式與輻照度標(biāo)量或通量相關(guān)


第0個與第一個源分布公式


Sigma參數(shù)之間的互相推倒,
光線變成各向異性的,后向散射關(guān)系改變了凈通量,前向散射與無散射是沒有區(qū)別的。
此處D = 1/(3* sigma_T’);是漫反射常量
最終我們得到了漫反射公式

漫反射部分的推導(dǎo)公式,得到如下結(jié)果


在做定積分時進行疊加了30次隨機光線散射方向,效果還算不錯。

漫反射的反射部分

然后就是求漫反射的反射部分
菲涅爾反射公式,在可傳導(dǎo)介質(zhì)的菲涅耳漫反射的反射:

媒介本身的性質(zhì)不同反射器情況也不同,Eta為這種性質(zhì)的相關(guān)指數(shù)

這是經(jīng)過精確測量的反射率,我們可以用這個公式來免去計算消耗

通量公式:


Dr = ||x - xr||為當(dāng)前點與光源的距離
Dv = ||x-xv||為當(dāng)前點與眼睛(相機)的距離

			if (_WorldSpaceLightPos0.w != 0)
			{
				p_L_Dist = distance(_WorldSpaceLightPos0, i.worldPos);
			}
			float v_C_Dist = distance(_WorldSpaceCameraPos, i.worldPos)*0.3;

Φ為光源強度
最終,我們的反射公式為

<span>float3 ref = -D * (dot(N, _Nabla*phi_x_S)) / (diff*_LumPow_D);</span>

在最后加入Physically-Based Rendering的specular,大功告成

參數(shù)調(diào)節(jié)

關(guān)于參數(shù)調(diào)節(jié),參數(shù)非常不好調(diào),pdf上和自己弄得參數(shù)不搭,只能自己調(diào)了



最終效果:



參考:

1. A Practical Model for Subsurface Light Transport
2. A Measurement-Based Skin Re?ectance Model for Face Rendering and Editing

總結(jié)

以上是生活随笔為你收集整理的Unity3d shader之次表面散射(Subsurface Scattering)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。