OpenGL 光照和材質

2021-08-04 07:51:18 字數 3793 閱讀 1446

opengl 光照和材質

前言:很難受呀,一天又過去了,沒有達到預期的進度,等下寫完這篇部落格,抓緊研究滑鼠實現軌跡球!

長路漫漫啊……

注:此篇文章建立在mfc環境搭建完成後

1.渲染處理

在opengl中,可以定義頂點的顏色,但如何定義線段的顏色,如何定義平面的顏色,這就需要opengl通過各個頂點的顏色採用兩種不同的渲染處理方法。

明暗渲染處理:void glshademode(glenum mode),直譯為陰影模式。

gl_smooth: 平滑地採用光滑變化的明暗渲染方式;

gl_flat:採用第乙個頂點的顏色繪製乙個圖元面,每增加乙個圖元面顏色重新定義;

可以看一下兩者的區別:右圖glshademodel(gl_flat) ;左圖glshademodel(gl_smooth);

2.光照

簡單來說,物體顯示的光是由三類光合成的:

泛光:通常稱為環境光;

漫反射光:光照射到物體上反射出的光;

鏡面反射光:也叫高光,物體某一點比較亮的區域;

啟動和關閉光照:

啟動:glenable(gl_lighting);        

關閉:gldisable(gl_lighting);

啟動與關閉具體某一盞燈:

啟動:glenable(gl_lighti);             

關閉:gldisable(gl_lighti);        i為非負整數。

例如:

glenable(gl_lighting);   //啟動光照

glenable(gl_light0); //啟用第一盞燈

opengl通過函式定義光照屬性:

void gllightfv(glenum light,glenum pname,const glfloat *p);

第一引數為燈的序號,第二個引數是狀態變數,第三個引數設定光的色彩,使用陣列位址填充;

附上我今天使用光照和材質的設定:

void cstepinglview::lightm(void)

; const glfloat light_diffuse = ;

const glfloat light_specular = ;

const glfloat light_position = ;

const glfloat mat_ambient = ;

const glfloat mat_diffuse = ;

const glfloat mat_specular = ;

const glfloat high_shininess = ;

gllightfv(gl_light0, gl_ambient, light_ambient);

gllightfv(gl_light0, gl_diffuse, light_diffuse);

gllightfv(gl_light0, gl_specular, light_specular);

gllightfv(gl_light0, gl_position, light_position);

glmaterialfv(gl_front, gl_ambient, mat_ambient);

glmaterialfv(gl_front, gl_diffuse, mat_diffuse);

glmaterialfv(gl_front, gl_specular, mat_specular);

glmaterialfv(gl_front, gl_shininess, high_shininess);

}

函式定義光的位置採用陣列齊次座標(x,y,z,w);如果w為0,則該光源為定向光源,照射方向是原點指向(-x,-y,-z),位置在無窮遠;如果w不為0,opengl認為是點光源,光源位置(x/w,y/w,z/w)。

關於光照的衰減方式和聚光的定義,這裡就不**了。

3.物體的材質

物體材質的定義同樣是相對光線的,也就是如果定義了光照,opengl就預設材質;如果定義了材質,沒有光線啟動,材質也不會 啟動;

材質分為兩種:一種是完全被動的,也就是被動地接受或只是材質與光線的作用;

二是材質色彩佔主導,結合材質變換和光線影響;

啟用和關閉材質:

glenable(gl_color_material);

gldisable(gl_color_material);

定義材質屬性函式:

void glmateriafv(glenum face,glenum pname,const glfloat *p);

第乙個引數face為狀態變數:gl_front:材質的前面;gl_back:材質的後面;gl_front_and_back:材質的雙面;

第二個引數pname為狀態變數:gl_ambient:設定材質反射環境光的色彩;gl_diffuse:設定材質反射漫反射光色彩;gl_ambient_and_diffuse:設定反射環境光和漫反射光色彩;gl_specular:設定材質反射鏡面光色彩;

opengl還通過第二個引數定義材質的其他屬性:

gl_shininess:設定光強度,範圍[0.0,128.0],數值越小,反射越強,物體高光越明顯;

gl_emission:設定輻射光的色彩,預設值(0.0,0.0,0.0,1.0)。

注:輻射光是材質發出的光,和環境光一樣不會衰減,並且不等同於光源,是可見的。

定義輻射光材質:

glfloat memi[4] = ;

glmaterialfv(gl_front_and_back,gl_emission,memi);

4.法線

opengl在採用光照計算時,將用到前面講到的右手定則定義的法線,但是對於乙個複雜的曲面來說,在採用光照時,最好定義出法線,這樣有利於光照的計算。

啟用和關閉法線:

glenable(gl_normalize);

gldisabel(gl_normalize);

法線定義:
glnormal3f(x,y,z);
5.全域性的光照模型

對於光照和材質就先說那麼多吧,附上我寫的一段**:

void cstepinglview::drawscene(void)

程式執行截圖:

ps:寫到最後,發現忘了講解glulookat()函式了,下篇博文見吧!

OPENGL 紋理,材質,光照

1.紋理 紋理對映就是將一張點陣圖貼在3d模型上,讓模型更有真實感。比如一顆人頭,眼睛鼻子嘴巴頭髮都由三角形構成,會給系統帶來很大的開銷。如果用紋理來做,可以由乙個球和人臉的紋理組成,真實感也很強。只是個例子,真這麼做會很恐怖。opengl把紋理座標規範化到0與1之間,就是說如果一張正方形的紋理,從...

OpenGL光源 材質和光照模型

好久沒寫部落格了,從現在開始,養成乙個好的習慣,不斷的進行總結。以前都是直接用,效果好就行,不管是具體怎麼設定的。現在突然想想什麼都學不到,於是就自己動手除錯了一番,做了一下總結 opengl在處理光照的過程中主要包含三項內容,光源 材質和光照模型。也就是我們在光照設定的 中常看到的gllightf...

學習OpenGL(五)顏色 光照與材質

學習opengl 五 顏色 光照與材質 kezunhai gmail.com 顏色 光照和材質是opengl的重要內容,其中glcolor函式設定當前的顏色,該函式之後繪製的所有頂點 圖形 都使用該顏色。對於乙個點,其顏色就是設定的顏色,而對於一條直線而言,如果兩個頂點的顏色不同,那麼兩點之間線的顏...