双线性光强插值(Gouraud明暗处理)学习笔记
之前學習計算機圖形時學到光照模型這一部分,在雙線性光強插值(Gouraud明暗處理)這一部分,課本上講解起來連個圖都不帶,看閆令琪老師的課程也只講了計算,中文互聯網上的資料也不全,還是看了這里 的講解才弄懂一點,就結合這個網站的內容、閆令琪老師的課程和課本講解寫個學習筆記。
Flat、Gouraud、Phong明暗處理
復習一下Phong光照明模型的三個公式
 Id=IpKd?(L?N)I_d=I_pK_d·(L·N)Id?=Ip?Kd??(L?N)Is=IpKs(R?V)nI_s=I_pK_s(R·V)^nIs?=Ip?Ks?(R?V)nIe=Ia?KaI_e=I_a·K_aIe?=Ia??Ka?
 在Phong光照模型中,由于光照L和視點V都被視為無窮遠,因此對于同一個多邊形中所有點來說,因為它們的法向量也是一致的,計算出來的光強也都是一致的。如果就這么處理的話,法向量就只計算到面,每個多邊形內部像素的明暗/顏色都是一致的,這就是Flat明暗處理。它的實現簡單,運行速度快,我的實驗也是這種實現。缺點是實現效果完全依靠物體復雜度,如果模型較為簡單,顯示效果就會很差,此外還有不同多邊形鄰接處的光強突變、馬赫帶效應等問題。
為了保證多邊形之間的光滑過渡,優化顯示效果,出現了增量式光照明模型。其基本思想是在每一個多邊形的頂點處計算合適的光照明強度或其他參數,然后在各個多邊形內部進行均勻插值,最后得到多邊形的光滑顏色分布。它包含兩種主要形式:雙線性光強插值和雙線性法向插值,又被分別稱為Gouraud明暗處理和Phong明暗處理。兩者均在頂點處計算出平均法向,但區別是前者是對光強進行插值(法向量只計算到頂點),后者是對法向量進行插值(法向量計算到像素)。前者計算量小但高光處顯示效果仍不好,后者則與之相反。這篇筆記主要介紹雙線性光強插值(Gouraud明暗處理)。Phong明暗處理的步驟也基本相同。
這張從閆令琪老師視頻里借來的圖很好地說明了三種明暗處理方法的區別。由上到下物體點數逐漸增多,左中右三列依次是Flat、Gouraud、Phong明暗處理,它們處理法向量的精度分別是面、頂點、像素。
 
Gouraud明暗處理算法的步驟
3,4步的兩個插值合起來就是所謂的雙插值。下面依次進行介紹這些步驟
頂點法向計算
使用與頂點相鄰的所有多邊形的法向的平均值近似作為該頂點的近似法向量。假設頂點A相鄰的多邊形有kkk個,法向依次為N1,N2,…,NkN_1,N_2,…,N_kN1?,N2?,…,Nk?,則頂點A的法向為
 Na=1k(N1+N2+…+Nk)N_a=\frac{1}{k}(N_1+N_2+…+N_k)Na?=k1?(N1?+N2?+…+Nk?)
 即相鄰面法向的平均值。也可以根據面的大小使用加權平均。
 
頂點平均光強計算
使用Phong光照明模型計算頂點處的光亮度即可。Gouraud提出此方法時Phong模型還沒有出現,他使用的是I=IaKa+IpKd(L?Na)/(r+l)I=I_aK_a+I_pK_d(L·N_a)/(r+l)I=Ia?Ka?+Ip?Kd?(L?Na?)/(r+l)
光強插值
使用雙線性插值,可以計算出多邊形上各點和內部點的光強。就上圖這個三角形進行分析。已經求出點P1(x1,y1),P2(x2,y2),P3(x3,y3)P_1(x_1,y_1),P_2(x_2,y_2),P_3(x_3,y_3)P1?(x1?,y1?),P2?(x2?,y2?),P3?(x3?,y3?)的光強I1,I2,I3I_1,I_2,I_3I1?,I2?,I3?。
 則邊P1P2P_1P_2P1?P2?上點P4(x4,y4)P_4(x_4,y_4)P4?(x4?,y4?)的光強為I4=y4?y2y1?y2I1+y1?y4y1?y2I2=1y1?y2[(y4?y2)I1+(y1?y4)I2]I_4=\frac{y_4-y_2}{y_1-y_2}I_1+\frac{y_1-y_4}{y_1-y_2}I_2=\frac{1}{y_1-y_2}[(y_4-y_2)I_1+(y_1-y_4)I_2]I4?=y1??y2?y4??y2??I1?+y1??y2?y1??y4??I2?=y1??y2?1?[(y4??y2?)I1?+(y1??y4?)I2?]
 邊P2P3P_2P_3P2?P3?上點P5(x5,y5)P_5(x_5,y_5)P5?(x5?,y5?)的光強為I5=y5?y2y3?y2I3+y3?y5y3?y2I2=1y3?y2[(y5?y2)I3+(y3?y5)I2]I_5=\frac{y_5-y_2}{y_3-y_2}I_3+\frac{y_3-y_5}{y_3-y_2}I_2=\frac{1}{y_3-y_2}[(y_5-y_2)I_3+(y_3-y_5)I_2]I5?=y3??y2?y5??y2??I3?+y3??y2?y3??y5??I2?=y3??y2?1?[(y5??y2?)I3?+(y3??y5?)I2?]
 線段P4P5P_4P_5P4?P5?上點P(xp,yp)P(x_p,y_p)P(xp?,yp?)的光強為Ip=xp?x4x5?x4I5+x5?xpx5?x4I4=1x5?x4[(xp?x4)I5+(x5?xp)I4]I_p=\frac{x_p-x_4}{x_5-x_4}I_5+\frac{x_5-x_p}{x_5-x_4}I_4=\frac{1}{x_5-x_4}[(x_p-x_4)I_5+(x_5-x_p)I_4]Ip?=x5??x4?xp??x4??I5?+x5??x4?x5??xp??I4?=x5??x4?1?[(xp??x4?)I5?+(x5??xp?)I4?]
此外,我們可以結合掃描線算法,用增量算法來計算。當掃描線縱坐標由jjj變成j+1j+1j+1時,新的P4?和P5?P_4^*和P_5^*P4??和P5??的光強為I4?=I4+ΔI4I_4^*=I_4+ΔI_4I4??=I4?+ΔI4?I5?=I5+ΔI5I_5^*=I_5+ΔI_5I5??=I5?+ΔI5?其中ΔI4=[(y4+1)?y2y1?y2I1+y1?(y4+1)y1?y2I2]?[y4?y2y1?y2I1+y1?y4y1?y2I2]=I1?I2y1?y2ΔI_4=[\frac{(y_4+1)-y_2}{y_1-y_2}I_1+\frac{y_1-(y_4+1)}{y_1-y_2}I_2]-[\frac{y_4-y_2}{y_1-y_2}I_1+\frac{y_1-y_4}{y_1-y_2}I_2]=\frac{I_1-I_2}{y_1-y_2}ΔI4?=[y1??y2?(y4?+1)?y2??I1?+y1??y2?y1??(y4?+1)?I2?]?[y1??y2?y4??y2??I1?+y1??y2?y1??y4??I2?]=y1??y2?I1??I2??同理ΔI5=I3?I2y3?y2ΔI_5=\frac{I_3-I_2}{y_3-y_2}ΔI5?=y3??y2?I3??I2??
 在掃描線內部,從P4P_4P4?到P5P_5P5?之間的點同樣可以使用增量算法,當橫坐標由iii變成i+1i+1i+1時,新的P?P^*P?的光強為Ip?=Ip+ΔIpI_p^*=I_p+ΔI_pIp??=Ip?+ΔIp?其中ΔIp=I5?I4x5?x4ΔI_p=\frac{I_5-I_4}{x_5-x_4}ΔIp?=x5??x4?I5??I4??
Phong明暗處理算法
大體步驟與Gouraud明暗處理算法是相似的,只要把光強III替換為法向量NNN即可,在像素處再計算使用Phong光照明模型計算光強。NNN是三維的,因此計算時間也會隨之增長。
水平有限,如有錯誤疏漏,歡迎指出
總結
以上是生活随笔為你收集整理的双线性光强插值(Gouraud明暗处理)学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 平方根估计 python 3
- 下一篇: Android 双屏显示分析
