16 光照(平行光)

2021-10-24 09:09:51 字數 3457 閱讀 3137

1.基本概念:

著色:根據光照條件,重建「物體表面明暗不一效果」的過程

光源型別:

(1)平行光:沒有衰減的平行的光線,類似於太陽光。用乙個方向和乙個顏色定義。

(2)點光源:理想化為質點點光源,類似於人造燈泡,有光線衰減。用光源位置和顏色定義。

(3)環境光:用於模擬真實世界中的非直射光(由光源發出經過牆壁或其他物體反射的光)。只需要指定顏色。

反射光取決於以下兩個因素:

(1)入射光(入射光的方向和顏色)

(2)物體表面型別(物體表面的固有顏色(基底色),和反射特性)

物體表面反射光線的方式有兩種:

(1)漫反射:針對平行光和點光源而言,漫反射的反射光在各個方向上是均勻的,反射強度受入射角影響。

我們將入射光線與表面法線形成的夾角為入射角,用b表示,那麼

《漫反射光顏色》=《入射光顏色》x《表面基底色》x cosb,乘法操作在向量上逐分量進行

(2)環境反射:針對環境光而言,反射光的方向就是入射光的反方向,所以反射光是各向均勻的。

《環境反射光顏色》=《入射光顏色》x《表面基底色》

綜上:《表面的反射光顏色》=《漫反射光顏色》+《環境反射光顏色》

2.平行光漫反射的計算:

平行光:平行光下物體每個面上光線的入射角是相同的,所以只要確定cosb的值再利用公式計算即可。

根據向量之間的點乘,a.b = |a|x|b|xcosb,如果a,b向量的模都是1,那麼cosb = a.b,那麼我們應該首先將a,b向量進行歸一化

(1)歸一化:將向量的長度調整為1,同時保持方向不變

glsl es提供了歸一化函式,其原理是,將向量的各個分量處以向量的模,即n( nx/|n| , ny/|n| , nz/|n| )。

(2)確定法向量方向:

法向量表示的是方向,平行平面的法向量相同;每個平面有兩個方向相反的法向量,在三維圖形學中,法向量方向和頂點的繪製順序有關,法向量指向頂點繪製順序逆時針的一方

cosb = 《光線方向》.《法線方向》,其中光線方向是入射光線的反方向(因為該方向與法線夾角才是入射角)。

《漫反射光顏色》=《入射光顏色》x《表面基底色》x(《光線方向》x《法線方向》)

3.程式實現:

(1)法向量和光線方向向量歸一化:

由於物體表面的法向量和頂點有關,法向量的歸一化放在頂點著色器中進行

'attribute vec4 a_normal;\n' +

'vec3 normal = normalize(vec3(a_normal));\n' +

在glsl es中,normalize()方法將向量進行歸一化,由於a_normal宣告為vec4型別,法向量由前三個分量x y z 定義,所以先使用vec3()構造器取出前三個分量

光線方向向量歸一化:

光線方向和物體本身無關,所以放在js**中進行歸一化,放在頂點著色器中會執行n遍,浪費計算機資源

//設定光線方向

var lightdirection = new vector3([0.5,3.0,4.0]);

//入射光線歸一化

lightdirection.normalize();

gl.uniform3fv(u_lightdirection,lightdirection.elements);

cuon-matrix.js中為vector3型別提供了normalize()函式,呼叫後歸一化後的分量值存入物件本身。

(2)漫反射光顏色計算

' float ndotl = max(dot(u_lightdirection,normal),0.0);\n' +

'vec3 diffuse = u_lightcolor * vec3(a_color) * ndotl;\n'+

法向量和光線方向向量的點乘運算:dot(n,l ),glsl  es內建dot方法計算向量的點乘,入參為兩個向量,返回點積(標量)

當點積結果小於0時,說明入射光線方向與法線夾角大於90度,光線照在平面的背面,所以顏色值為0,max(a,b)將a,b中較大的值賦給變數

(3)環境光的計算

'uniform vec3 u_ambientlight;\n' +

'vec3 ambient = u_ambientlight * a_color.rgb;\n'+

a_color是乙個vec4型別變數,前三個分量代表rgb值,只取其前三個分量進行計算

(4)反射光顏色 = 漫反射光顏色+環境反射光顏色

'v_color = vec4(diffuse + ambient,a_color.a);\n' +

最後計算的反射光有三個分量,v_color有四個分量,將a_color的a分量值寫入

(5)頂點法向量的寫入

頂點的法向量依賴於頂點組成的平面(********),由多個********共用的頂點在繪製每個********時擁有不同法向量(由頂點繪製順序決定),例如正六面體中每個頂點被三面共用,那麼需要的法向量就有64個

4.繪製光照立方體

var vshader_source =

'attribute vec4 a_position;\n' +

'attribute vec4 a_color;\n' +

'attribute vec4 a_normal;\n' +

'uniform mat4 u_mvpmatrix;\n' +

'uniform vec3 u_lightcolor;\n' +

'uniform vec3 u_lightdirection;\n' +

'varying vec4 v_color;\n' +

'void main()\n';

var fshader_source =

'precision mediump float;\n'+

'varying vec4 v_color;\n' +

'void main()\n';

function main()

function initvertexbuffers(gl)

function initarraybuffer(gl,data,num,type,attribute)

5.運動物體的光照效果:

當物體發生平移、旋縮放等變換時,頂點的法向量可能會發生改變,根據模型矩陣計算變換後的法向量的方法是:

用模型矩陣的逆轉置矩陣乘以原法向量,就可以得到變換後的法向量。

matrix4提供了計算逆轉置矩陣的方法:

(1)求原矩陣的逆矩陣:

matrix4 . setinverseof(m):將m矩陣的逆矩陣賦值給自身

(2)對逆矩陣進行轉置:

matrix4 . transpose():對自身進行操作,將自身設定為轉置後的結果。

irrlicht中設定平行光

使用scene manager的addlightscenenode,預設加入的是點光源,設定平行光,需要自己設定slight,將其type設定為elt directional,這都好說,問題是光的方向,被誤導了一下,因為ilightscenenode本身沒有setdirection之類的方法,而sl...

WebGL 平行光和環境光

馮氏反射模型引申了這個四步走的光照系統,首先所有的光線都有以下兩個屬性 發生漫反射光的rgb值。發生鏡面反射光的rgb值。其次所有材質都有以下四個屬性 反射的環境光rgb值 反射的漫反射光rgb值 反射的鏡面反射光rgb值 物體的反光度,它決定了鏡面反射的細節 對於場景中的每一點,它的顏色都是由照射...

irrlicht中設定平行光

使用scene manager的addlightscenenode,預設加入的是點光源,設定平行光,需要自己設定slight,將其type設定為elt directional,這都好說,問題是光的方向,被誤導了一下,因為ilightscenenode本身沒有setdirection之類的方法,而sl...