LearnOpenGL筆記6光照

2021-10-07 02:48:42 字數 1667 閱讀 8852

last

鏡面光照

現實生活中看到某一物體的顏色並不是這個物體真正擁有的顏色,而是它所反射的(reflected)顏色。換句話說,那些不能被物體所吸收(absorb)的顏色(被拒絕的顏色)就是我們能夠感知到的物體的顏色。

當我們把光源的顏色與物體的顏色值相乘,所得到的就是這個物體所反射的顏色(也就是我們所感知到的顏色)

1、乙個物體作為被投光(cast the light)的物件;乙個物體代表光源在3d場景中的位置

2、乙個頂點著色器繪製箱子,與之前的頂點著色器相比,容器頂點位置保持不變。

建立乙個光源的立方體,所以為燈設定乙個專門的vao。

3、設定片段著色器,從uniform變數接受物體顏色和光源顏色。燈需要另外的一套著色器。為了顯示真正的燈,將表示光源的立方體繪製在和光源相同的位置

opengl使用的是簡化模型光照,這些模型都是基於我們對於光的物理特性的理解。其中,乙個模型被稱為是馮氏光照模型。馮氏光照模型主要結構:環境、漫反射、鏡面光照;

環境光照(ambient lighting):即使在黑暗的情況下,世界上通常也仍然有一些光亮(月亮、遠處的光),所以物體幾乎永遠不會是完全黑暗的。為了模擬這個,我們會使用乙個環境光照常量,它永遠會給物體一些顏色。

漫反射光照(diffuse lighting):模擬光源對物體的方向性影響(directional impact)。它是馮氏光照模型中視覺上最顯著的分量。物體的某一部分越是正對著光源,它就會越亮。

鏡面光照(specular lighting):模擬有光澤物體上面出現的亮點。鏡面光照的顏色相比於物體的顏色會更傾向於光的顏色。

光能夠在其它的表面上反射,對乙個物體產生間接的影響。考慮到這種情況的演算法叫做全域性照明(global illumination)演算法,但是這種演算法既開銷高昂又極其複雜。

我們將會先使用乙個簡化的全域性照明模型,即環境光照。正如你在上一節所學到的,我們使用乙個很小的常量(光照)顏色,新增到物體片段的最終顏色中,這樣子的話即便場景中沒有直接的光源也能看起來存在有一些發散的光。

算漫反射光照需要什麼?

法向量:乙個垂直於頂點表面的向量。

定向的光線:作為光源的位置與片段的位置之間向量差的方向向量。為了計算這個光線,我們需要光的位置向量和片段的位置向量。

我們利用它周圍的頂點來計算出這個頂點的表面。我們能夠使用乙個小技巧,使用叉乘對立方體所有的頂點計算法向量。

對燈的著色器使用不能完全利用的頂點資料,頂點資料從箱子物件載入後就儲存在gpu記憶體,不需要儲存新資料到gpu記憶體。

光照計算都是在片段著色器進行,將法向量由頂點著色器傳遞到片段著色器。

對每個頂點都有了法向量,光源位置向量和片段位置向量。由於光源位置是乙個靜態變數,可以在片段著色器中宣告為uniform;

在渲染迴圈中,更新uniform,前面宣告lightpos向量作為光源位置;

還需要片段的位置,會在世界空間中進行所有的光照計算,所以我們需要乙個在世界空間中的頂點位置。可以通過把頂點位置屬性乘以模型矩陣變換到世界空間座標。

所有的變數設定好了,片段著色器新增光照計算。

計算光源和片段位置之間的方向向量。光的方向向量是光源位置向量與片段位置向量之前。

法向量從頂點著色器傳到了片段著色器,但是要轉換到世界座標系,方法:

1、法向量只是乙個方向向量,不能表達空間中特定位置。

其實這個章節想要很好的理解對應的原理,還是應該先去看看計算機圖形學課的,那個地方講的比較好,仔細。

LearnOpenGL學習筆記 五 變換

openggl中對物體的變換是通過矩陣物件來實現的,需要掌握一些最基本的矩陣運算相關知識。include include include我們需要定義頂點著色器,使能夠接收乙個mat4的uniform矩陣,通過變換矩陣左乘位置向量,就可以實現對圖形的變換。version 330 core layout...

LearnOpenGL學習筆記(六) 紋理單元

version 330 core out vec4 fragcolor in vec3 ourcolor in vec2 texcoord uniform sampler2d ourtexture void main 在剛才的程式中,關於片段著色器的中我們宣告了乙個取樣器 sampler 一般來講我...

關於高速光耦6n137的使用總結 光耦如何選型

在選擇光耦時需要根據實際電路的情況和光耦的引數來選擇,在光耦選型時一般要考慮如下幾個重要的引數。這個引數在光耦的datasheet上一般用rise time 和fall time來表示,分別簡稱tr和tf。如果光耦單純的用作隔離,對響應時間要求不高那麼該引數可以忽略。因為開關電源一般都是通過mos管...