對於光照模型,從演算法理論基礎而言,可分為兩類,一類是基於物理理論的光照模型,另一種是基於經驗的模型。從使用角度而言,可分為全域性光照模型和區域性光照模型,本文簡單地介紹了幾種最基礎的經典區域性光照模型.
1、 區域性光照模型之lambert
lambert光照模型是乙個非常簡單的模型,早在200多年前,乙個叫lambert的傢伙提出,當光照射到粗糙的表面時,它將向四周均勻的反射。這種各向同性的反射叫漫反射(diffuse reflection)
漫反射光的強度服從於lambert定律,漫反射的光強與入射光的方向和反射點處表面法向夾角的余弦成正比。lambert模型的數學表達示如下:
idiffuse = kd*id*cosθ
kd表示物體表面漫反射屬性,id表時入射光強。若n表示入射點單位法向量,l表示從入射點指向光源的單位向量(注意是入射點指向光源,表示了入射光的方向),由點乘與cos之間的關係,cosθ = n●l,則lmbert模型可表示為:
idiffuse = kd*id*(n●l)
對應的ps如下:
float4 main( float4 diff : color0,
float3 normal : texcoord0,
float3 view : texcoord1,
float3 light : texcoord2,
float2 tex : texcoord4 ) : color
// compute ambient term:
float4 ambientcolor = ambient * ka;
// compute diffuse term:
float4 diffusecolor = diffuse * kd * max( 0, dot( normal, light ));
float4 finalcolor = (ambientcolor + diffusecolor) * tex2d( basemap, tex);
return finalcolor;
2、 區域性光照模型之phong
lambert模型能很好的表示粗糙表面的光照,但不能表現出鏡面反射高光。2023年phong bui tong發明的phong模型,提出了計算鏡面高光的經驗模型,鏡面反射光強與反射光線和視線的夾角a相關:
ispecular = ks*is*(cos a) n
其中ks為物體表面的高光係數,is為光強,a是反射光與視線的夾角,n為高光指數,n越大,則表面越光滑,反射光越集中,高光範圍越小。如果v表示頂點到視點的單位向量,r表示反射光反向,則cos a可表示為v和r的點積。模型可表示為:
ispecular = ks*is*(v●r) n
反射光放向r可由入射光放向l(頂點指向光源)和物體法向量n求出。
r = (2n●l)n – l
對應的ps如下:
float4 main( float4 diff : color0,
float3 normal : texcoord0,
float3 view : texcoord1,
float3 light : texcoord2,
float2 tex : texcoord4 ) : color
// compute the reflection vector:
float3 vreflect = normalize( 2 * dot( normal, light) * normal - light );
// compute ambient term:
float4 ambientcolor = ambient * ka;
// compute diffuse term:
float4 diffusecolor = diffuse * kd * max( 0, dot( normal, light ));
// compute specular term:
float4 specularcolor = specular * ks * pow( max( 0, dot(vreflect, view)), n_specular );
float4 finalcolor = (ambientcolor + diffusecolor) * tex2d( basemap, tex) + specularcolor;
return finalcolor;
3、 區域性光照模型之blinn-phong
圖形學界大牛jim blinn對phong模型進行了改進,提出了blinn-phong模型。blinn-phong模型與phong模型的區別是,把v●r換成了n ●h,其中h為半形向量,位於法線n和光線l的角平分線方向。blinn-phong模型可表示為:
ispecular = ks*is*(n●h) n
其中h = (l + v) / | l+v |,計算h比計算反射向量r更快速。
對應的ps如下:
float4 main( float4 diff : color0,
float3 normal : texcoord0,
float3 view : texcoord1,
float3 light : texcoord2,
float2 tex : texcoord4 ) : color
// compute the reflection vector:
float3 h = normalize(view+light);
// compute ambient term:
float4 ambientcolor = ambient * ka;
// compute diffuse term:
float4 diffusecolor = diffuse * kd * max( 0, dot( normal, light ));
// compute specular term:
float4 specularcolor = specular * ks * pow( max( 0, dot(h, normal)), n_specular );
float4 finalcolor = (ambientcolor + diffusecolor) * tex2d( basemap, tex) + specularcolor;
return finalcolor;
4、 效果圖
從左到右,依次是lambert、phong、blinn-phong,可以看出phong和blinn-phong都有高光,但兩者還是有些區別的。
5、其他光照模型
torrance-sparrow model
cook-torrance model
ward's anisotropic model
oren–nayar model
ashikhmin-shirley model
htsg
fitted lafortune model
**:
3D區域性光照模型
對於光照模型,從演算法理論基礎而言,可分為兩類,一類是基於物理理論的光照模型,另一種是基於經驗的模型。從使用角度而言,可分為全域性光照模型和區域性光照模型,本文簡單地介紹了幾種最基礎的經典區域性光照模型.1 區域性光照模型之lambert lambert光照模型是乙個非常簡單的模型,早在200多年前...
3d模型不能解組 3D列印服務
光敏樹脂3 列印服務 學生作品定做 小批量生產 3d列印 光固化光敏樹脂手板模型製作3d列印服務 3d列印 光 3d列印 光固化 sla 光敏樹脂 手板模型製作 3d列印服務 3d列印 光固化 sla 光敏樹脂 手板模型製作 3d列印服務 原理 sla成型 立體光刻技術 材料 abs光敏樹脂 強度和...
Unity UI嵌入3D模型
目的 在ui中加入3d模型 方案一 使用額外相機渲染ui背景,3d模型 步驟 使用額外相機渲染背景和3d模型,通過設定相機depth來控制3d模型相機和ui相機的顯示順序,來達到先繪製背景和模型,再繪製其他ui的效果 問題 渲染出來的模型有鋸齒 方案二 使用rendertexture,步驟 將模型渲...