OpenGL ES on iOS 基礎光照

2021-09-11 12:39:16 字數 2636 閱讀 6961

本文記錄我記錄我學習 座標體系和矩陣轉換的過程,加深學習便於後續查詢,可能有些描述不夠準確,或者內容不夠充實,還請多多指正,共同學習.

乙個沒有alpha通道的顏色可以用乙個3維向量來表示 例如 glm::vec3(1.0,1.0,1.0); 表示白色.

在現實世界中,乙個物體的顏色是它反射的顏色導致的, 例如我們將純紅光 照射在純綠物體上, 因為紅光都被吸收,所以顯示為黑色.

將吸收反射的過程用向量表示出來

glm::vec3 lightcolor(0.0f, 1.0f, 0.0f); //綠色光源向量

glm::vec3 objcolor(1.0f, 0.5f, 0.31f); //物體色

glm::vec3 result = lightcolor * objcolor; // 光源下顏色(0.0f, 0.5f, 0.0f);

複製**

馮氏光照模型的主要結構由3個分量組成 環境(ambient) 漫反射(diffuse) 鏡面(specular)

在現實環境下 即使在黑暗的情況下,世界上通常也會有一些光亮(如 月光), 而且即使物體不朝光源的,也會因為 其他物體的反射,使陰面有光,這種情況下 就要使用全域性照明演算法這種演算法開銷大而且複雜,以後在研究 先實現簡單的 環境光照

所以給物體乙個環境光照量,讓物體始終有一點顏色. 在著色器中表現如下

void main

()複製**

模擬光源對物體的方向性影響(directional impact)。它是馮氏光照模型中視覺上最顯著的分量。物體的某一部分越是正對著光源,它就會越亮. 也就是光線物體表面法線的夾角越小,光線對物體的影響就越大.

這樣就可以利用夾角的cos值作為參考,來修改光線對物體的影響.

片段著色器重相關實現

uniform vec3 lightcolor;        //光源色

uniform vec3 lightpo; //光源位置

uniform vec3 objectcolor; //物體色

uniform vec3 viewpo; //物體位置

in vec3 outnormal; //傳入當前頂點平面的法向量

複製**

vec3 norm = normalize(outnormal);   //確保法線為單位向量

vec3 lightdir = normalize(lightpo - fragpo); //頂點指向光源 單位向量

float diff = max(dot(norm,lightdir),0.0); //得到兩向量的cos值 小於0則則為0

vec3 diffuse = diff * lightcolor; //得到漫反射收的光源向量

複製**

對於法向量,它是乙個方向向量,不會因為物體的移動而發生變化,所以在對法向量 進行矩陣處理時,要消除矩陣中位移部分對其造成的影響. 因此位移使用3x3矩陣 或者 將 法向量的w分量設定為0.0;

另外,若矩陣對物體進行裡不等比縮放時候,會導致法向量不在垂直於物體表面.

這種情況 則需要使用法線矩陣來移除對法向量錯誤縮放的影響. 法線矩陣由逆矩陣轉置矩陣組成.

glm::transpose(glm::inverse(model));    //法線矩陣的計算

mat3(transpose(inverse(model))) * anormal; //著色器語言的使用 使用3x3矩陣 能夠與 vec3法向量計算

複製**

模擬有光澤物體上面出現的亮點。鏡面光照的顏色相比於物體的顏色會更傾向於光的顏色。鏡面光照的計算依賴於 觀察的視角, 若視線與光源在物體的反射線的夾角越小 則鏡面光照效果越好.

計算他 我們需要 觀察者位置.鏡面強度(鏡面效果強弱)

float specularstrength = 0.5;   //鏡面強度

vec3 viewdir = normalize(viewpo - fragpo); //頂點指向觀察點的單位向量

vec3 reflectdir = reflect(-lightdir,outnormal); //求得光線 在 頂點的反射線(傳入光源指向頂點的向量)

float spec = pow(max(dot(viewdir, reflectdir),0.0),256.0);

// 求得夾角cos值 取256次冪 注意 pow(float,float)函式引數型別

vec3 specular = specularstrength * spec * lightcolor;

複製**

256 表示高光的反光度, 反光度越高,發射光的能力越強,散射越少 高光點越小

最後綜合

vec3 res =(ambientstrength + diffuse + specular) * objectcolor;

複製**

效果圖: 白色方塊為白色光源

OpenGL ES on iOS 光照高階

本文記錄我記錄我學習 座標體系和矩陣轉換的過程,加深學習便於後續查詢,可能有些描述不夠準確,或者內容不夠充實,還請多多指正,共同學習.在基礎光照時,學習了光照對物體的作用,也就相當於物體的材質,這次主要說 現實生活中的光源 當光源無限遠時,從其發射過來的的光可以近似的看做平行光 例如太陽 這時 光線...

基礎1 基礎

2011年畢業的時候,當時mvc思想非常流行,從總體設計的思路來看,c指的是struts v指的是檢視層 當時我用的是freemarker m用的是spring 即便到了詳細設計層面,每個模組的組成也是分為mvc這3部分。到了spring mvc的時候,spring根據mvc思想,一次性把這3個組成...

vue基礎基礎之基基礎

目錄 1,引用 2,例項化 3,資料定義和使用 4,函式的定義和使用 5,資料的改變方式 6,原生js如何輸出vue中的data資料 7,vue中系統屬性的使用 每個vue應用都需要通過例項化vue來實現 語法 var myvue new vue 注意 若id重複,則以第乙個為準 也可以在外邊定義 ...