漫反射光照是用於對那些被物體表面隨機散射到各個方向的輻射的進行建模的,在漫反射中,視角的位置i是不重要的,因為反射是完全隨機的,因此可以認為在任何反射方向上的分布都是一樣的。但是入射光線的角度是很重要的。
蘭伯特定律:反射光線的強度與表面法線和光源方向之間夾角的余弦值成正比。
diffusecol = lightcol * matdiffusecol * max(0,dot(n ,l))
lightcol 是光源顏色,matdiffusecol 材質的漫反射顏色,n是表面法線,l光源的單位向量,max和dot是unity提供的api。
蘭伯特**:
shader "unlit/diffuse_shader"
subshader
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
;struct v2f
;fixed4 _diffusecolor;
fixed4 frag (v2f i) : sv_target
endcg}}
}
半蘭伯特公式: diffusecol = lightcol * matdiffusecol * (dot(n ,l) * 0.5 + 0.5)
半蘭伯特**:
shader "unlit/halfdiffuse_shader"
subshader
cgprogram
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
;struct v2f
;fixed4 _diffusecolor;
fixed4 frag (v2f i) : sv_target
endcg}}
}
**解釋:
1.需要把法線和光源方向轉換到同一座標空間,再進行計算。
2.normalize,對需要進行計算的變數進行歸一化。
3.unity_lightmodel_ambient,獲取環境光,需要設定tags標籤中,lightmode為forwardbase。
4.蘭伯特模型在模型光照無法達到的區域通常是全黑的,沒有任何明暗變化;半蘭伯特模型:背面無光也可以有明暗變化。
5.dot(worldnormal, worldlight) * x + y:可以控制x,y的比例來控制漫反射的佔比。
效果圖:
左邊:蘭伯特模型;右邊:半蘭伯特模型
左邊:dot(worldnormal, worldlight) * 0.8 + 0.2;右邊:dot(worldnormal, worldlight) * 0.2 + 0.8
提取碼:u3zl
大家可以多去看看馮樂樂老師的《unity shader入門精要》。
Unityshader 漫反射光照模型
基本光照漫反射計算公式 c diffuse c light m diffuse max 0,n l c light 為光源顏色和強度,可以由lighting.cginc中的 lightcolor0提供 m diffuse 為材質反射係數,一般自己定義在properties中 n為表面法線,l為光源方...
Shader 基礎光照 漫反射光照模型
漫反射 diffuse 當光線從光源照射到模型表面,該表面回向每個方向散射多少輻射量 漫反射符合蘭伯特定律 反射光線的強度與表面法線與光源方向之間的夾角的余弦值成正比.漫反射的計算 diffuse.png n表面法線和l指向光源的向量的單位向量點乘來表示余弦值,用max防止點乘結果為負數,防止物體被...
Note Unity Shader 漫反射光照模型
公式 逐頂點與標準對比 為了使用在properties中的宣告的屬性,需要定義乙個和該屬性型別相匹配的變數!重點是變數!這是個變數!通過這樣的方式,我們就可以得到漫反射公式所需引數之一,材質的漫反射屬性 逐頂點光照會出現一些鋸齒,對於細分模型較低的模型,逐頂點會出現問題 逐畫素光照會在背光區,模型外...