只考慮光源到模型表面的照射效果,運算量較小;html
考慮到環境中全部表面和光源相互做用的照射效果,即讓沒有直接受光照射的位置也會受周圍反射光的影響,運算量較大;git
Phong光照模型是真實圖形學中提出的第一個有影響的光照明模型,該模型只考慮物體對直接光照的反射做用,認爲環境光是常量,沒有考慮物體之間相互的反射光,物體間的反射光只用環境光表示。Phong光照模型屬於簡單光照模型。github
Phong光照模型是由環境反射、漫反射和鏡面反射相互做用獲得的光照效果。less
環境光,是沒有方向的光,也不考慮觀察者的視線方向,能夠直接做用於模型的每個點上,由於Phong反射模型是沒有考慮物體之間相互的反射光的,因此使用環境光來簡單的模擬一下物體之間相互的反射光;編輯器
漫反射是模擬光照到粗糙的物體表面的效果,會考慮到光的射入方向,可是不考慮觀察者的視線方向,垂直射入的光線會比斜着射入的光線更加的明亮;spa
對三角形面片的法線和漫反射的射入光線兩個向量取點積,能夠獲得一個值(若是該值爲0,表示兩向量相互垂直),經過點積就能夠肯定當前面片的光照亮度。3d
鏡面反射是模擬光照到光滑的物體表面的效果,會產生明亮的斑點或強光,除了須要考慮到光的射入方向也要考慮觀察者的視線方向;code
光澤度也會影響到鏡面反射的最終結果。htm
ka爲環境反射係數,kd爲漫反射係數,ks爲鏡面反射係數,對全部特定光源求和,並有kd+ks=1。由上式看出,一旦反射光中三種份量的顏色以及它們的係數ka,kd和ks肯定之後,從景物表面上某點達到觀察者的反射光顏色就僅僅和光源入射角和視角有關。所以能夠說,Phong光照模型其實是純幾何模型。blog
若是有多個光線,則將每一個光線的結果進行累加便可。
有兩種方式來實現,一種是光照代碼寫在頂點着色器中,還有一種是光照代碼寫在片斷着色器中,下面咱們分別看看兩種方式的實現效果:
頂點着色器實現:https://hammerc.github.io/dou3d-ts/examples/learningNotes/lesson_6/index.html
片斷着色器實現:https://hammerc.github.io/dou3d-ts/examples/learningNotes/lesson_7/index.html
經過上面的例子,能夠看出來,因爲頂點的數量較少,因此片斷實現的光照更加的真實。
咱們程序中,爲每一個面指定了一個法線,在實際的使用中,通常來講是每一個頂點都有一個法線;
法線可使用叉乘來進行運算:
// 能夠經過下面的代碼獲取法線, a 和 b 兩個向量能夠肯定一個面,out即爲該面的法線
glMatrix.vec3.cross(out, a, b)
法線通常在3D編輯器中輸出模型時,就會存在了,通常不用再程序中運算;
常見的光源類型有下面3種:
通常是離模型較近的光源,向四周發射,好比室內的吊燈之類,咱們上面代碼中已經實現;
通常是離模型較遠的光源,只有一個方向,好比太陽光;
示例:https://hammerc.github.io/dou3d-ts/examples/learningNotes/lesson_8/index.html
手電筒或汽車燈光之類的光源,錐形光源;
示例:https://hammerc.github.io/dou3d-ts/examples/learningNotes/lesson_9/index.html