著色模型:
- 高洛德著色(Gouraud shading):即基于頂點(diǎn)計(jì)算顏色后在渲染的圖元內(nèi)部進(jìn)行線性插值。當(dāng)光照模型中有非線性的計(jì)算時(shí)(如計(jì)算高光反射),這種逐頂點(diǎn)的光照就會(huì)出問(wèn)題。另外由于是圖元內(nèi)部線性插值,會(huì)導(dǎo)致渲染圖元內(nèi)部的顏色總是暗于頂點(diǎn)處,在某些情況下會(huì)產(chǎn)生明顯的棱角現(xiàn)象。
- Phong著色(Phong shading):即在片元上計(jì)算顏色,需要對(duì)頂點(diǎn)法線進(jìn)行插值然后進(jìn)行光照模型的計(jì)算。
標(biāo)準(zhǔn)光照模型:
最終的光照顏色由自發(fā)光(emissive), 漫反射(diffuse),高光反射(specular)和環(huán)境光(ambient)相加得到。這是一個(gè)經(jīng)驗(yàn)?zāi)P?。也稱作Blinn-Phong光照模型。
- 蘭伯特模型(Lambert's law): 計(jì)算漫反射 C diffuse = (Clight * m_diffuse) max(0, dot(n,I)) (其中n是表面法線,I是入射光線的反方向)
- 半蘭伯特模型:對(duì)蘭伯特模型進(jìn)行一個(gè)簡(jiǎn)單的修改 C diffuse = (Clight * m_diffuse)(a * dot(n,l) + b)
半蘭伯特模型沒(méi)有使用max防止點(diǎn)積為負(fù)值,而是對(duì)點(diǎn)積結(jié)果進(jìn)行縮放和偏移。大多數(shù)情況下,a和b取0.5,這樣將點(diǎn)積值從[-1,1]映射到[0,1]范圍內(nèi)。也就是說(shuō),對(duì)于模型背光面也不會(huì)全黑,而會(huì)有明暗變化。 - Phong模型:計(jì)算高光的反射 Cspecular = (Clight * m_specular) max (0, dot(v,r)) ^m_gloss (其中v是視線反方向,r是光反射方向)
- Blinn模型:避免計(jì)算反射方向 r, 改為計(jì)算half向量 h, 即 v和I的中間方向, h = (v+I) / |v+I| ,然后使用n和h的夾角進(jìn)行計(jì)算(而非v和r)
Cspecular = (Clight * m_specular) max(0, dot(n,h)) ^ m_gloss