OPENGL 紋理,材質,光照

2021-06-02 05:28:53 字數 2453 閱讀 2407

1.紋理

紋理對映就是將一張點陣圖貼在3d模型上,讓模型更有真實感。比如一顆人頭,眼睛鼻子嘴巴頭髮都由三角形構成,會給系統帶來很大的開銷。如果用紋理來做,可以由乙個球和人臉的紋理組成,真實感也很強。。(只是個例子,真這麼做會很恐怖。。。)

opengl把紋理座標規範化到0與1之間,就是說如果一張正方形的紋理,從左下角開始逆時針方向四個頂點的座標分別是(0, 0), (1, 0), (1, 1), (0, 1)

紋理對映時根據模型每個頂點的紋理座標進行繪製。

當模型的大小和紋理大小不一致時,opengl會根據設定處理紋理,進行放大或縮小。這個叫紋理過濾器(fileter)

opengl可以設定3種紋理過濾器。

1.最近點取樣,速度最快,效果最低。

直接對紋理進行放大縮小。舉個例子,有兩個頂點,座標是(1, 0)和(3, 0),對應的紋理座標分別是(0, 0), (0.7, 0)(假設這個紋理中乙個畫素的直徑是0.1)。當判斷 (2, 0) 的顏色時,根據線性差值,紋理座標應該是(0.35, 0),可是這個畫素是不存在的,根據就近原則,選擇了(0.4, 0) 這個畫素的顏色值。

opengl中的設定如下(nehe lesson 7 的**)

view plain

glbindtexture(gl_texture_2d, texture[0]);  

gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_nearest); // ( new )

gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_nearest); // ( new )

glteximage2d(gl_texture_2d, 0, 3, textureimage[0]->sizex, textureimage[0]->sizey, 0, gl_rgb, gl_unsigned_byte, textureimage[0]->data);  

2.線性紋理過濾,速度較最近點取樣要低,但是效果好

還是舉上面的例子,判斷(2, 0) 顏色的時候,取(0.3, 0) 和 (0.4, 0) 的顏色值進行插值,得到(2, 0)的顏色

opengl中的設定

view plain

glbindtexture(gl_texture_2d, texture[1]);  

gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_linear);  

gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_linear);  

glteximage2d(gl_texture_2d, 0, 3, textureimage[0]->sizex, textureimage[0]->sizey, 0, gl_rgb, gl_unsigned_byte, textureimage[0]->data);  

3.多級漸進紋理(mipmap),速度較快,效果好。

opengl自動建立幾個不同大小的高質量紋理,根據模型的大小選擇丟失顏色資訊最少的那張紋理。

opengl中的設定

view plain

glbindtexture(gl_texture_2d, texture[2]);  

gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_linear);  

gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_linear_mipmap_nearest); // ( new )

nehe 7讀取點陣圖的函式已經不能用了,因為缺少 glaux 庫。所以修改了下,用windows api讀位圖

view plain

bool

loadtexture(

lptstr

szfilename, gluint &texid) 

// creates texture from a bitmap file

2.材質和光照

物體表面的顏色是由物體的反射光來決定的。如果乙個物體呈紅色,說明他表面的材質把藍光和綠光都吸收,而把紅光反射(前提是入射光同時含有這3中顏色)。

材質屬性有3種,環境光反射(ambient),漫反射(diffuse),鏡面反射(specular)

opengl中光源也有3種屬性,環境光,漫反射,鏡面反射。

材質決定了反射光的強度,比如乙個材質的環境光反射屬性為(r, g, b)(0.1, 0.1, 0.9),說明這個材質把大部分紅光和綠光都吸收了,而藍光則大部分反射。

又假設環境光為(r, g, b)(0.5, 0.5, 0.5),反射的光強就是各顏色分量相乘(0.25, 0.25, 0.49),物體表面就顯示為藍色。(注意這只是環境光的計算模型,漫反射和鏡面反射模型並不是簡單的對顏色分量相乘,還與光源角度有關。紋理顏色與反射的光強也會疊加)

OpenGL 光照和材質

opengl 光照和材質 前言 很難受呀,一天又過去了,沒有達到預期的進度,等下寫完這篇部落格,抓緊研究滑鼠實現軌跡球!長路漫漫啊 注 此篇文章建立在mfc環境搭建完成後 1.渲染處理 在opengl中,可以定義頂點的顏色,但如何定義線段的顏色,如何定義平面的顏色,這就需要opengl通過各個頂點的...

OpenGL光源 材質和光照模型

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

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

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