主題 達人專欄

【Unity Shader】半蘭伯特 / Blinn / Phong 光源模型學習,改善預設超黑面

給你加油 %%鼠 | 2022-01-19 17:27:39 | 巴幣 1262 | 人氣 439

Unity預設材質光影常常在一定角度就變得非常黑,即使調整場景太陽角度,可能又變得其他的模型陰影太黑。
(左)自製shader材質  (右)Unity預設材質


光線種類

基本顏色(貼圖)。 最基本的shader便是使用tex2D取得該uv位置上的貼圖顏色並輸出。

Ambient:

環境光,可由unity變數UNITY_LIGHTMODEL_AMBIENT 取得,再乘上貼圖顏色達到染色的感覺。
fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;

Diffuse:

漫射光,我的理解是打到不平整表面反射的光,發散角度不一致。

fixed3 diffuse=_LightColor0.rgb * albedo*max(0,dot(worldNormal,worldLightDir));
意即 pass中的顏色 * 貼圖色 * 強度

在p1時,dot(worldNormal,worldLightDir)=1,直接面對太陽的表面亮度最強;但在p2時dot結果為負數,會造成顏色特別黑。可採用半蘭伯特光模型,將範圍[-1,1] 映射到 [ 0 , 1 ]。

蘭伯特與半蘭伯特差別:


_LightColor0
Unity內建變數,用來存取該pass的光源和強度。
UnityWorldSpaceLightDir:輸入一個模型空間中的頂點位置,返回世界空間中從該點到光源的光照方向。光源方向計算不具有共通性,場上多個光源就不能得到正確資訊。


Specular :

高光反射,常使用blinn-phong模型。
((或是r可以用反射函數取得:reflect(入射方向 , 法線方向)

phong模型

意即:光的顏色 * 材質反射顏色 * max(0 ,光反射的夾角與眼睛角度的夾角 ) ^ 亮點寬度
m_{gloss}越大,光點越小。   因 強度因子 介於[0, 1],小於1的數值越高次方反而越小。

blinn模型

主要思想:避免計算R,因此引進新向量H (VL取平均再歸一化):

再以n、h夾角進行計算

需要使用到反射角度的phong模型,使用worldNormal的是blinn模型:

blinn-phong模型

跟blinn類似


綜合以上知識:






寫文散散心

送禮物贊助創作者 !
0
留言

創作回應

⊰⊱求出處學術用⊰⊱
感謝分享
2022-01-19 19:50:56
給你加油 %%鼠
感謝觀看
2022-01-22 10:31:35
追蹤 創作集

作者相關創作

更多創作