反射 Reflect 和折射 Refract

2021-09-01 16:22:52 字數 3105 閱讀 9375

brdf

雙向反射分布函式

反射:r = 2 * n·l * n - l

已知量:

n:頂點的法向量

l:入射光向量,如果是平行光就直接用光的方向向量,如果是點光源,就通過光源位置頂點在世界空間的座標進行計算。

未知量:

r:反射方向向量

總所周知,我們之所以能看見東西,是因為有光的照射,這說明所有我們所能看的到的顏色,都是**於光的作用。光照射在畫素上的時候,會產生多條光路,其中一種就是鏡面反射。這裡如果我們只考慮畫素的鏡面反射,則有:

畫素的顏色 = 直接光照的鏡面反射 + 場景的間接光照的鏡面反射

1.直接光照的鏡面反射:

這裡的v表示的是畫素點到視點的方向向量,世界空間裡面。我們知道,r是l的反射向量,代表著光線的反射後的路線。那是不是表示,我們只有從r的位置看畫素點的時候才能看到呢?顯然是不是的,如果是的話我們會看不見很多東西。這裡的r表示的是,我們能夠看到最強的光的位置,如果我們從v的位置看的話,光

會進行一次衰減:(r.v)^n 其實n(反射係數)表示的是物體的反射能力。

2.間接光照的鏡面反射:

光照到物體上後,只要不被完全吸收,就會輻射一部分出來,而此時這個物體也就具備了光源的性質,只不過這個性質是光源賜予它的。

由此,我們想,空間的物體的每個畫素點都是乙個間接光源,應該都具備1的特性才是,那為何我們一般感受不到呢?這是因為間接光照的輻射本身有限,當最終反射到我們眼中的時候,我們基本已經感覺不到它所造成的視覺差異了。但是,有幾種情況下,我們是可以感受的到的。那就是當反射係數非常高的時候,例如鏡子,我們就能從鏡子裡面看到其他的東西,這就是間接光鏡面反射的作用。在所有當中,鏡面反射是最強的,所以如果我們考慮類似全域性光照中間接光源對物體產生的影響的時候,我們可以只考慮它的反射光或者只考慮它對周圍物體的影響。

再說細節,由1可知,如果不是r方向上看畫素點,所看到的結果不是最亮的,因為有一次r*v的衰減。而間接光本身就是很弱的,衰減後的基本上可以忽略。所以,現在我們把視點到畫素的方向當做r,然後通過反射定律來尋找,是那個間接光源照**這個畫素點,最終只考慮這乙個間接光源對畫素的影響。結果就乘了第乙個圖了。已知r和n,求l,基本上所有的鏡面反射場景,都是根據這個來的。

總結:直接光照側重的是點亮畫素,我們通過直接光源照射後看到了這個畫素應有的顏色。而間接光源側重的是自己,我們從視角通過反射,找到了此視角下對此畫素影響最大的那個間接光源,所以,我們看到了它。

折射:n1sinα1=n2sinα2

透射:光從乙個介質穿過的時候,就叫做透射,它並不需要從乙個介質進入到另外乙個介質,光源存在於空氣中並且在空氣裡傳播就可以稱做是透**。它透過了某種介質了不是麼,這個跟我們平常說的透過玻璃之類的理解不一樣。透射,強調的是光在介質中傳播會被吸收,或者被介質中的粒子發散,最終強度衰減為0.它強調的更多的是衰減的作用,我們使用pong光照模型的時候就強調了傳播的距離對光的衰減。透射是基礎,所有的反射,散射,折射都是透射,因為它們都存在衰減。

折射:強調的是光從一種介質傳入到另一種介質的時候,所產生的影響。與反射一樣,折射也有直接光源和間接光源的影響,直接光源讓我們看到了這個物體。而我們又通過這個物體看到了物體後面的間接光源,這些間接光源因為折射的原因,位置還發生了偏移。

1.直接光折射:已知,l向量,n向量,n1介質係數,n2介質係數求q向量。然後根據透射時的衰減,最終得到照射到畫素時的亮度。這裡跟反射一樣,q其實是你看到畫素點最亮的方向,並非視角到畫素的方向,還需要(q.v)^n一下。

2.間接光折射:此時q = v 成為已知量,n已知,n1和n2已知,求出l,然後通過l找出那個間接光源。

總結:1.光只是乙個能量,而光源就是這個能量的發源地,能量跋山涉水的進入到你的眼睛,眼睛的感測器會接受能量,通過神經傳遞給大腦,然後大腦對這個能量進行分析。突然強光入眼,會感覺很不適,這跟別人打你巴掌的效果是一樣的。

2.光從光源輻射出來後,會在介質透射傳播,傳播的過程就是能量損耗的過程,之所以用能量來描述,是因為裡面的力太多了,我們只需要關注衰竭後最終剩餘的能量值就行了。不同的介質對光能的衰減能力不一樣。比較弱的像氣體,比較中等的如透明液體和大顆粒的灰塵,比較嚴重的就數固體了。

3.介質對光造成衰減的方式有很多,1.吸收,物體把光吸收後會提公升自身的熱量,這一部分光能轉換成了熱量不再傳播。2.反射,光照到乙個粒子上並不是只往乙個方向上反射,而是向各個方向反射。只不過其中沿平面反射法線r方向的能量最高,它被單獨分類為鏡面反射,而其它的會相對鏡面反射的能力衰減的很快,被稱為散射。

4.當介質裡面的粒子(所有小顆粒,包括灰塵,分子等的統稱)很小且很少的時候,這個時候幾乎可以對其忽略不計,等同於真空看待。

5.當介質裡面的粒子比較少,且不是很小的時候,這些粒子會散射一部分光能,因為粒子比較小,鏡面反射的影響被忽略。如果介質比較均勻,就是均勻介質散射,如果不均勻就是非均勻介質散射。

6.當介質比較小,但是比較多的時候,它們會明顯的改變光路,產生折射效果。一般能產生折射的,都能產生散射效果。當然,出來產生折射效果以外,由於厚度的關係,有些位置的光穿不過,形成一種次表面散射的效果。

7.然後就是非常多分子,像液體,此時粒子的鏡面反射作用明顯,不可忽略,而又有折射和散射效果。所以說,液體是光照最複雜的模型,一點都不為過。

8.最後就是固體,要麼吸收,要麼反射,平面反射的影響比散射大。介質均勻的話介質中的每個粒子的法向量一致,就像玻璃一樣的,可以忽略散射的影響。而介質非均勻的,粒子的平面反射方向不一致,最終把平面反射當做散射來看待。

9.pong光照模型:為了簡化計算我們把那些影響有限的大多數光綜合到一起,作為乙個沒有方向只有亮度的世界光來考慮。而介質吸收後反射的光的顏色用紋理進行描述,然後乘距離的衰減因子,反射,折射角的衰減,最終算出乙個簡單的光照模型。

反射 reflect 及其應用

class 所有類的位元組碼檔案 class.forname 全類名 類名.class 例項.getclass field getdeclaredfield getdeclaredfields 修飾符 型別 名稱 method 獲取 getdeclaredmethod 引數型別的class.para...

go語言基礎 反射 reflect

反射reflect struct reflect.typeof i inte ce type 獲取結構體的字段的型別,欄位名 方法的型別,方法的名字 packagemain import fmt reflect typepersonstruct func p person say msg strin...

Opengl中reflect反射演算法

在opengl或者其他的遊戲引擎shader 比如unity3d中 都有乙個方法叫做reflect用來計算光的反射向量,他的引數就是入射光向量和畫素法線向量。reflect r,n 那麼他的內部原理到底是什麼呢?我們先來看下下面這個 如圖所示,l就是入射向量,n就是法線,r就是反射向量,r是r平移到...