OpenGL高階光照 1

2021-09-29 09:06:29 字數 1566 閱讀 9886

一、簡介

現實世界的光照是極其複雜的,而且會受到諸多因素的影響,這是我們有限的計算能力所無法模擬的。因此opengl的光照使用的是簡化的模型,對現實的情況進行近似,這樣處理起來會更容易一些,而且看起來也差不多一樣。這些光照模型都是基於我們對光的物理特性的理解。其中乙個模型被稱為馮氏光照模型(phong lighting model)。馮氏光照模型的主要結構由3個分量組成:環境(ambient)、漫反射(diffuse)和鏡面(specular)光照。

二、blinn-phong

blinn-phong著色模型也正是早期opengl固定函式輸送管道(fixed function pipeline)所使用的著色模型。

得到半程向量很容易,我們將光的方向向量和視線向量相加,然後將結果歸一化(normalize);

翻譯成glsl**如下:

vec3 lightdir = normalize(lightpos - fragpos);

vec3 viewdir = normalize(viewpos - fragpos);

vec3 halfwaydir = normalize(lightdir + viewdir);

實際的鏡面反射的計算,就成為計算表面法線和半程向量的點乘,並對其結果進行約束(大於或等於0),然後獲取它們之間角度的余弦,再新增上發光值引數:

float spec = pow(max(dot(normal, halfwaydir), 0.0), shininess);

vec3 specular = lightcolor * spec;

除了我們剛剛討論的,blinn-phong沒有更多的內容了。blinn-phong和phong的鏡面反射唯一不同之處在於,現在我們要測量法線和半程向量之間的角度,而半程向量是視線方向和反射向量之間的夾角。

引入了半程向量來計算鏡面反射後,我們再也不會遇到phong著色的驟然截止問題了。下圖展示了兩種不同方式下發光值指數為0.5時鏡面區域的不同效果:

phong和blinn-phong著色之間另乙個細微差別是,半程向量和表面法線之間的角度經常會比視線和反射向量之間的夾角更小。結果就是,為了獲得和phong著色相似的效果,必須把發光值引數設定的大一點。通常的經驗是將其設定為phong著色的發光值引數的2至4倍。

下圖是phong指數為8.0和blinn-phong指數為32的時候,兩種specular反射模型的對比:

可以看到blinn-phong的鏡面反射成分要比phong銳利一些。這通常需要使用一點小技巧才能獲得之前你所看到的phong著色的效果,但blinn-phong著色的效果比預設的phong著色通常更加真實一些。

這裡我們用到了乙個簡單畫素著色器,它可以在普通phong反射和blinn-phong反射之間進行切換:

void main()

else

三、總結

本篇文章中我們主要是介紹了 opengl高階光照的blinn-phong模型,接下來我們將繼續對opengl高階光照進行介紹。

OpenGL 光照例項 1

設定太陽光 平行光 在設定不同材質的球體,觀察光照效果 光源的位置 glfloat sun light ambient glfloat sun light diffuse glfloat sun light specular gllightfv gl light0,gl position,sun l...

openGL光照系統

opengl 把光照系統分成了三部分 光源,材質和光照環境。opengl 沒有考慮光的折射 1.控制光源 第乙個引數表示設定哪乙個光源的屬性,第二個引數表示設定這個光源的哪個屬性,第三個引數則表示把該屬性值設定為多少 gllightfv gl light0,gl position,sun light...

Opengl光照(茶壺)

include initialize material property,light source,lighting model,and depth buffer.void init void glfloat mat shininess glfloat light position glfloat ...