Phong和Blinn Phong光照模型

2022-08-31 13:06:10 字數 3462 閱讀 7748

phong和

blinn-phong

是計算鏡面反射光的兩種光照模型,兩者僅僅有很小的不同之處。

1.phong模型

phone模型計算中的乙個關鍵步驟就是反射向量r的計算:

上圖中的位於表面「下面」

的向量 

『i』 

是原始 

『i』 

向量的拷貝,並且二者是一樣的,現在我們的目標計算出向量 

『r』 

。根據向量相加原則,向量 

『r』 

等於 'i' + 'v'

,『i』 

是已知的,所以我們需要做的就是找出向量 

『v』。注意法向量 

『n』 

的負方向就是 

『-n』

,我們可以在 

『i』 

和 『-n』 

之間使用乙個點乘運算就能得到 

『i』 

在 『-n』 

上面的投影的模。這個模正好是 

『v』 

的模的一半,由於 

『v』 

與 『n』 

有相同的方向,我們可以將這個模乘上 

『n』 

(其模為 

1 )再乘上 

2 即可得到 

『v』。總結一下就是下面的公式:

2.blinn-phong模型

phong模型中計算反射光線的向量是一件相對比較耗時的任務,因此

blinn-phong

對這一點進行了改進。

ks:物體對於反射光線的衰減係數

n:表面法向量

h:光入射方向

l和視點方向

v的中間向量

shininess:高光係數

可見,通過該式計算鏡面反射光是符合基本規律的,當視點方向和反射光線方向一致時,計算得到的h與n

平行,dot(n,h)

取得最大;當視點方向

v偏離反射方向時,

h也偏離n。

同時h的計算比起反射向量

r的計算簡單的多,

r向量的計算需要若干次的向量乘法與加法,而

h的計算僅僅需要一次加法。

下面是用cg著色語言書寫的phong和blinn-phong的頂點和片段著色程式

phong_fragmentlighting_v.cg
1

struct

v2f;

6void

phong_fragmentlighting_v(float4 position :position,

7float4 normal:normal,

8uniform float4x4 modelmatrix,

9uniform float4x4 modelmatrix_it,

10uniform float4x4 modelviewproj,

11out

v2f o)

phong_fragmentlighting_f.cg

1

void

phong_fragmentlighting_f(float3 position :texcoord0,

2float3 normal: texcoord1,

3uniform float3 globalambient,

4uniform float3 lightcolor,

5uniform float3 lightposition,

6uniform float3 eyeposition,

7uniform float3 ke,

8uniform float3 ka,

9uniform float3 kd,

10uniform float3 ks,

11 uniform float

shininess,

12out

float4 color:color)

13

blinnphong_fragmentlighting_v.cg
1

struct

v2f;

6void

blinnphong_fragmentlighting_v(float4 position :position,

7float4 normal:normal,

8uniform float4x4 modelmatrix,

9uniform float4x4 modelmatrix_it,

10uniform float4x4 modelviewproj,

11out

v2f o)

blinnphong_fragmentlighting_f.cg
1

void

blinnphong_fragmentlighting_f(float3 position :texcoord0,

2float3 normal: texcoord1,

3uniform float3 globalambient,

4uniform float3 lightcolor,

5uniform float3 lightposition,

6uniform float3 eyeposition,

7uniform float3 ke,

8uniform float3 ka,

9uniform float3 kd,

10uniform float3 ks,

11 uniform float

shininess,

12out

float4 color:color)

13

效果對比:

phong光照模型

blinn-phong光照模型

通過簡單的對比發現,在相同條件下blinn-phong的高光範圍要比phong更大,寫實效果phong光照模型更好。但演算法簡單,執行速度快是blinn-phong光照模型的優點。

鏡面反射與Phong模型

在許多情形中,與景物的內部距離相比,光源與景物之間的距離大得多,例如太陽光照射乙個城市的情形。在這種情形中,可以假定從光源發出的照明作用在整個景物上是恆定的,可以完全不考慮由於距離所引起的變化。下面再看鏡面反射的情形。鏡面反射是指來自具體光源的光線到達可見表面上的某一點後,主要沿著由入射角等於反射角...

Unity Shader 自定義Phong光照

今天我們來學習一下怎麼在unity裡實現自定義phong光照模型 什麼是phong光照?環境光和漫反射光比較容易計算,那鏡面高光要如何計算呢?鏡面高光其實可以通過利用入射光方向 即光照方向的反方向 和法線計算出反射光方向,然後再通過反射光方向和觀察視角方向計算出實際進入眼睛的光照強度,然後再做乙個光...

高光反射Phong光照模型

高光反射是一種經驗模型,並不完全符合真實世界中的高光反射現象。先根據表面法線 視角方向 光源方向計算出反射方向。通過 phong 模型來計算高光反射的部分。一般都用逐畫素,得到更平滑的高光效果。公式 高光反射光線強度 入射光線顏色 高光反射顏色 max 0,視角方向 反射方向 高光反光度 case ...