Blinn-Phong光照模型是在Phong的基礎(chǔ)上改造過來(lái)的躯舔,我們知道Phone光照模型中:
光照 = 漫反射(Diffuse) + 高光反射(Specular) + 環(huán)境光(Ambient)
漫反射和環(huán)境光的計(jì)算方式捆蜀,Blinn-Phong和Phong是相同的殉簸,唯一的區(qū)別在于高光反射的計(jì)算十酣。
在此之前,請(qǐng)先對(duì)Phong光照模型有比較清楚的了解砚蓬,具體地可以查看光照模型的原理和實(shí)現(xiàn)思路——Phong
在Phong光照模型中圣勒,它計(jì)算高光反射的公式是:
用代碼來(lái)表示:
half3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);
half3 reflect_dir = reflect(-light_dir, normal_dir);
half RdotV = dot(reflect_dir,view_dir);
half3 spec_color = max(0.0,RdotV) * _LightColor0.xyz;
它是通過光照的反方向和頂點(diǎn)法線方向解虱,先計(jì)算出反射方向攘须。
然后將反射方向和攝像機(jī)觀察方向的進(jìn)行點(diǎn)乘后,最后得出高光反射的顏色殴泰。
用下圖來(lái)表示于宙,就是調(diào)用reflect函數(shù),傳入矢量I (光源方向)的負(fù)方向矢量和矢量n(法線方向)悍汛,求出矢量r(反射方向)限煞,然后矢量r和矢量v(觀察方向)進(jìn)行點(diǎn)乘,最后得出高光反射的結(jié)果员凝。
但Blinn-Phong光照模型采用的另外一種優(yōu)化后的計(jì)算方式,以下圖為例:
它首先將I矢量和v矢量相加奋献,得到一個(gè)半角矢量h健霹;然后半角矢量h和矢量n進(jìn)行點(diǎn)乘,得到另一個(gè)新矢量瓶蚂,然后使用這個(gè)新矢量來(lái)計(jì)算高光反射糖埋。
用代碼表示就是:
// Blint-Phong光照模型的計(jì)算
half3 half_dir = normalize(light_dir + view_dir);
half NdotH = dot(normal_dir,half_dir);
half3 spec_color = pow(max(0.0,NdotH),_Shininess) * _LightColor0.xyz * _SpecIntensity * spec_mask.rgb;
Phong模型和Blinn-Phong模型最大的不同,一個(gè)是根據(jù)反射方向(r)和觀察方向(v)的夾角來(lái)計(jì)算高光窃这,而另一個(gè)是根據(jù)半角方向(h)和法線方向(n)來(lái)計(jì)算高光瞳别。
兩種光照模型并沒有孰優(yōu)孰劣之分,但一般情況下杭攻,Blinn-Phong模型的計(jì)算速度會(huì)比Phong模型更快祟敛。