Opengl 4種光照模型

2022-06-18 09:18:09 字數 2650 閱讀 3801

1.lambert模型(漫反射)

環境光:

iambdiff = kd*ia

其中ia 表示環境光強度,kd(0方向光:

ildiff = kd * il * cos(θ)

其中il是點光源強度,θ是入射光方向與頂點法線的夾角,稱入射角(0<=a<=90°),ildiff是漫反射體與方向光互動反射的光強,若 n為頂點單位法向量,l表示從頂點指向光源的單位向量(注意頂點指向光源),則cos(θ)等價於dot(n,l),故又有:

ildiff = kd * il * dot(n,l)

最後綜合環境光和方向光源,lambert光照模型可以寫成:

idiff = iambdiff + ildiff = kd * ia + kd * il * dot(n,l)

2.phong模型(鏡面反射)

phong模型認為鏡面反射的光強與反射光線和視線的夾角相關:

ispec = ks * il * ( dot(v,r) )^ns

其中ks 為鏡面反射係數,ns是高光指數,v表示從頂點到視點的觀察方向,r代表反射光方向。由於反射光的方向r可以通過入射光方向l(從頂點指向光源)和物體的法向量求出,

r + l = 2 * dot(n, l) * n  即 r = 2 * dot(n,l) * n - l

所以最終的計算式為:

ispec = ks * il * ( dot(v, (2 * dot(n,l) * n – l ) )^ns

3.blinn-phong光照模型(修正鏡面光)

blinn-phong是乙個基於phong模型修正的模型,其公式為:

ispec = ks * il * ( dot(n,h) )^ns

其中n是入射點的單位法向量,h是光入射方向l和視點方向v的中間向量,通常也稱之為半形向量(半形向量被廣泛用於各類光照模型,原因不但在於半形向量蘊含的資訊價值,也在於半形向量是很簡單的計算:h = (l + v) / |l + v|  )。

4.rendering equation(全域性光照模型)

rendering equation 是kajia在2023年提出的,

lo(x, wo) = le(x, wo) + ∫fr(x, wi, wo) li(x, wi) dot(n, wi) dwi

其中x表示入射點,lo(x, wo)即從物體表面x點,沿方向wo反射的光強,le(x, wo)表示從物體表面x以方向wo 發射出去的光強,該值僅對自發光體有效,fr(x, wi, wo)為,入射光線方向為wi, 照射到點x上,然後從wo方向發射出去的brdf值,li(x, wi)為入射方向為wi照射到點x上的入射光強,n表示點x處的法向量,然後對入射方向進行積分(因為光線入射的方向是四面八方的,積分的意義是對每個方向進行一遍計算後相加),計算的結果就是全域性光照的輻射率。

對於單個點光源照射到不會自發光的物體上,公式可以簡化成:

lo(x, wo) = fr(x, wi, wo) li(x, wi) dot(n, wi)

這個公式非常有用,通常會將該公式分解為漫反射表示式和鏡面表示式之和。對於漫反射表面,brdf可以忽略不計,因為它總是返回某個恆定值,所以可以寫成如下形式:

lo(x, wo) = idiff + frs(x, wi, wo) li(x, wi) dot(n, wi)

其中idiff表示漫反射分量,使用公式的計算方法,frs(x, wi, wo)表示鏡面反射的brdf函式,前面的phong高光模型,其實是rendering equation在單一光源下針對理想鏡面反射的特定推導,對於phong高光而言:

frs(x, wi, wo) = ks (dot(n, h)^ns  / dot(n, wi)

幾種光照模型的比較

lambert 模型能夠較好地表現粗糙表面上的光照現象,如石灰牆,紙張等等,但是在渲染金屬材質製成的物體時,則會顯得呆板,表現不出光澤,主要原因是其沒有考慮到鏡面反射效果,所以phong模型對其進行了很好的補充。由於blinn-phng光照模型混合了lambert的漫射部分和標準的高光,渲染效果有時會比 phong高光更柔和,有些人認為phong光照模型比blinn-phong更加真實,實際上也是如此,blinn-phong渲染效果要更加柔和一些,但是由於blinn-phong的光照模型省去了計算反射光線方向向量的兩個乘法運算,速度更快,因此成為許多cg軟體中預設的光找渲染方法,此外它也繼承在了大多數圖形晶元中,用以產生實時的快速渲染。在opengl和direct3d渲染管線中,blinn-phong就是預設的渲染模型。 rendering equation是基於物理光學的模型,其對於觀察方向上的輻射率進行了本質上的量化,phong模型只是其特定brdf的推導。

struct vertexscreen

;void main_f(vertexscreen posin,

out float4 color : color,

uniform float4x4 worldmatrix,

uniform float4x4 worldmatrix_it,

uniform float3 globalambient,

uniform float3 eyeposition,

uniform float3 lightposition,

uniform float3 lightcolor,

uniform float3 kd,

uniform float3 ks,

uniform float shininess)

OpenGL 光照模型

材質有三種,也就是對光有三種反射 材質被分為了三個屬性,也分別用三個引數來刻畫 對於乙個頂點,有四個向量來刻畫其光照 計算的時候也分為鏡面 漫和環境三類,之後再疊加起來即得到光照下的顏色 向量nlvr 求解顏色 鏡面反射 is rs max v r a,0 ls 環境反射 ia ra la於是 i ...

請簡述gouraud光照模型 4種基本光照模型

1.lambert模型 漫反射 環境光 iambdiff kd ia 其中ia 表示環境光強度,kd 0 方向光 ildiff kd il cos 其中il是點光源強度,是入射光方向與頂點法線的夾角,稱入射角 0 a 90 ildiff是漫反射體與方向光互動反射的光強,若 n為頂點單位法向量,l表示...

OpenGL(4)著色器 錯誤排查

shader.h 中宣告新函式 private void checkcompileerrors unsigned int id,std string type shader.cpp 中定義新函式 void shader checkcompileerrors unsigned int id,std s...