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函式設定當前的顏色,該函式之後繪製的所有頂點 圖形 都使用該顏色。對於乙個點,其顏色就是設定的顏色,而對於一條直線而言,如果兩個頂點的顏色不同,那麼兩點之間線的顏...