Unity預設材質光影常常在一定角度就變得非常黑,即使調整場景太陽角度,可能又變得其他的模型陰影太黑。
(左)自製shader材質 (右)Unity預設材質
光線種類
基本顏色(貼圖)。 最基本的shader便是使用tex2D取得該uv位置上的貼圖顏色並輸出。
環境光,可由unity變數UNITY_LIGHTMODEL_AMBIENT 取得,再乘上貼圖顏色達到染色的感覺。
fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
漫射光,我的理解是打到不平整表面反射的光,發散角度不一致。
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:輸入一個模型空間中的頂點位置,返回世界空間中從該點到光源的光照方向。光源方向計算不具有共通性,場上多個光源就不能得到正確資訊。
高光反射,常使用blinn-phong模型。
((或是r可以用反射函數取得:reflect(入射方向 , 法線方向)
phong模型
意即:光的顏色 * 材質反射顏色 * max(0 ,光反射的夾角與眼睛角度的夾角 ) ^ 亮點寬度
m_{gloss}越大,光點越小。 因 強度因子 介於[0, 1],小於1的數值越高次方反而越小。
blinn模型
主要思想:避免計算R,因此引進新向量H (VL取平均再歸一化):
再以n、h夾角進行計算
需要使用到反射角度的phong模型,使用worldNormal的是blinn模型:
blinn-phong模型
跟blinn類似
綜合以上知識:
寫文散散心