常用的光照模型與面繪製演算法總結

2021-06-14 07:55:26 字數 2345 閱讀 2733

基本光照模型

漫反射模型(lambert模型)

環境光:iambdiff=kd*ia,其中ia 表示環境光強度,kd (0< kd

<1)為材質對環境光的反

射係數,iambdiff是漫反射體與環境光互動反射的光強。

方向光:ildiff = kd * il * cos(θ),其中il是入射角,ildiff是漫反射體與方向光互動反射

的光強。cos(θ)又等價於(點乘),其中是頂點的單位法向量,是頂點指

向光源的單位向量。

最後,將環境光與方向光綜合,lambert模型可寫成:

idiff = iambdiff+ ildiff = kd* ia+ kd * il*

鏡面反射模型(phong模型)

phong模型認為鏡面反射的光強與反射光線和視線的夾角相關:

ispec = ks * il*

其中,ks為鏡面反射係數,ns為高光指數,v表示從頂點到視點方向的單位向量,r表示反射光方向的單位向量。r可通過和l求出,

r=2-l

所以最終模型為:

ispec=

修正鏡面光模型(blinn-phong光照模型)

blinn-phong是乙個基於phong模型修正的模型,其公式為:

ispec = ks * il*

其中n是入射點的單位法向量,h是光入射方向l和視點方向v的中間向量,通

常也稱之為半形向量(半形向量被廣泛用於各類光照模型,原因不但在於半形向量

蘊含的資訊價值,也在於半形向量是很簡單的計算:h= (l+v) / |l+v| 。

漫反射與鏡面反射的合併

對於單個點光源:

i=idiff+ispec= kd* ia+ kd* il *+ks* il *

對於多個點光源:

i= kd * ia +

光線跟蹤

由於從光源發出的光線有無窮多條,使得直接從光源出發對光線進行跟蹤變得非常困難。實際上,從光源發出的光線只有少數經由場景的反射和透射(折射)後到達觀察者的眼中。為此標準光線跟蹤演算法採用逆向跟蹤技術完成整個場景的繪製。

光線跟蹤思路:從視點出發,通過影象平面上每個畫素中心向場景發出一條光線,光線的起點為視點,方向為畫素中心和視點連線單位向量。光線與離視點最近的場景物體表面交點有三種可能:

1.    當前交點所在的物體表面為理想漫射面,跟蹤結束。

2.    當前交點所在的物體表面為理想鏡面,光線沿其鏡面發射方向繼續跟蹤。

3.    當前交點所在的物體表面為規則透射面,光線沿其規則透射方向繼續跟蹤。

按以上的思路逐個將相交的面加入到乙個二叉光線跟蹤樹中。

輻射度光照模型

基本輻射度模型:

bk=ek = ek

其中,為表面j和k的形狀因子,它是表面j到達表面k的輻射能與離開表面j的輻射能的比率。hk為單位時間,單位面積上到達表面k的閉包內所有表面的輻射能總和。bk為單位面積離開表面k的輻射能總速率。

逐步求精的輻射度方法:

偽**如下:

for each patch k

foreach patch j

db[k]=0;

明暗處理

gouraud明暗處理:又稱強度插值表面繪製。通過將在照明物件的表面上將光強進行線性插值來繪製多邊形表面。使用時,需要進行以下計算:

1.    確定每個多邊形的頂點處的平均單位法向量

2.    對於每個頂點根據光照模型來計算其光強度

3.    在多邊形投影區域對頂點強度進行線性插值

phong明暗處理:又稱法向量插值繪製,與gouraud方法不同,通過對法向量插值取代強度插值。其結果更精確,高光更真實,但需要更多計算。

1.    確定每個多邊形的頂點處的平均單位法向量

2.    在多邊形投影區域上對頂點法向量進行線性插值

3.    根據光照模型,使用插值的法向量,沿每條掃瞄線計算投影畫素的光強

常用的時間序列演算法模型

時間序列中常用 技術 乙個時間序列是一組對於某一變數連續時間點或連續時段上的觀測值。1.移動平均法 ma 1.1.簡單移動平均法 設有一時間序列y1,y2,則按資料點的順序逐點推移求出n個數的平均數,即可得到一次移動平均數.1.2 趨勢移動平均法 當時間序列沒有明顯的趨勢變動時,使用一次移動平均就能...

常用的機器學習演算法總結

一 線性回歸 1 核心思想 這可能是機器學習中最簡單的演算法。例如,當你想要計算一些連續值,而不是將輸出分類時,可以使用回歸演算法。因此,當你需要 乙個正在執行的過程未來的值時,你可以使用回歸演算法。然而,當特徵冗餘,即如果存在多重共線性 multicollinearity 時,線性回歸就不太穩定。...

比較常用的排序演算法總結

常用的排序 氣泡排序 選擇排序 插入排序 桶排序希爾排序 歸併排序 快速排序 基數排序 堆排序 第一 氣泡排序 由於簡單直接上 for int i 1 i n i 第二 選擇排序 每次找到陣列中最大或最小的數,將他與前面的數交換 for int i 1 i swap a i a der 交換 第三 ...