opengl 教程 20 點光源

2021-09-30 11:03:42 字數 1840 閱讀 6221

前面的教程中,我們在方向光的前提下,研究了基本的光照模型(環境光,漫反射光,高光)。方向光沒有起點,所有光線都是沿著乙個方向,它的強度不會隨著距離的增加有任何變化。本篇教程中,我們開始研究點光源,點光源是起始於乙個點,向四面照射,會隨著傳輸距離增加而衰減,所以在點光源屬性中,我們會增加乙個光源位置。

通常點光源衰減程度離物體距離的平方成反,如下面的公式:

但在距離比較小的時候,上面的公式在3d圖形學中,效果並不好,所以我們計算點光源衰減係數時候,常使用下面的公式:它包括3個因子,常量因子,線性因子和二次因子。

下面我們總結一下計算點光源時需要的步驟:

環境光的計算和方向光一樣

在世界座標系中,計算點(畫素)到光源的方向,做為光源的方向向量。

計算畫素到光源的距離,用來計算衰減因子。

把環境光、漫反射光和高光加起來,然後乘以衰減因子。

lighting_technique.h

struct baselight

; . 

. . 

struct pointlight : public baselight 

attenuation; 

}建立乙個baselight類,抽象出光源的共有屬性,然後派生出點光源和方向光源,它們都有自己特有的屬性,比如點光源的位置,衰減係數,方向光的方向等等。

lighting_technique.h

void setpointlights(unsigned int numlights, const pointlight* plights);

除了演示點光源,本教程中還要實施多光源,包括乙個方向光和多個電光源。

struct atten;

} m_pointlightslocation[max_point_lights];

我們使用結構陣列來實現多個點光源,max_point_lights是個常量值,指定光源的數目,預設值是2。

lighting_technique.cpp

vec4 calclightinternal(baselight light, vec3 lightdirection, vec3 normal)  }

return (ambientcolor + diffusecolor + specularcolor); 

}上面是計算點光源的通用函式,計算點光源和方向光時候,我們都可以呼叫該函式來實現。

vec4 calcdirectionallight(vec3 normal)

上面是呼叫該函式實現方向光計算。

vec4 calcpointlight(int index, vec3 normal)

上面是呼叫該函式實現點光源計算。

void main()

fragcolor = texture2d(gsampler, texcoord0.xy) * totallight; 

}最終輸出最終畫素顏色時候,我們把所有光源的效果加起來,並用紋理顏色進行調製。

void lightingtechnique::setpointlights(unsigned int numlights, const pointlight* plights)

}上面是給各個uniform變數賦值。

程式執行後介面如下,我們使用了2個點光源:

opengl 教程 20 點光源

前面的教程中,我們在方向光的前提下,研究了基本的光照模型 環境光,漫反射光,高光 方向光沒有起點,所有光線都是沿著乙個方向,它的強度不會隨著距離的增加有任何變化。本篇教程中,我們開始研究點光源,點光源是起始於乙個點,向四面照射,會隨著傳輸距離增加而衰減,所以在點光源屬性中,我們會增加乙個光源位置。通...

一步步學OpenGL 20 《點光源》

原文 csdn完整版專欄 之前已經學習了三個主要的光照模型 環境光,漫射光和鏡面反射光 這三種模型都是基於平行光的。平行光僅僅是通過乙個向量來表示,沒有光源起點,因此它不會隨著距離的增大而衰減 實際上沒有起點根本無法定義光源和某個物體的距離 如今我們再來看點光源型別,它有光源起點並且有衰減效果。距離...

OpenGL在frag著色器中模擬點光源

在3d世界中,模擬點光源實現對牆壁的光照。效果還是非常不錯的。思路如下 準備一張牆壁影象。自動生成牆壁的法線紋理。模擬點光源。新增漫反射。隨著時間變換進行規律性移動。如下 ichannel0 file wall.jpeg float getval vec2 uv vec2 getgrad vec2 ...