OpenGL nehe教程第六課學習筆記

2021-07-29 14:02:22 字數 3682 閱讀 9091

nehe的第六課的內容是給六面的盒子貼上材質texture,流程主要分兩步,一,利用glaux庫的函式auxdibimageload將從硬碟讀到記憶體,再利用opengl的函式檢測,給它打上"可用的標籤"。二,學習將texture的座標與盒子的一面對齊,就像是小時候的貼紙,你要貼齊而且要方向正確。

先來看第一步,涉及的函式挺多,一共有5個,分別是auxdibimageload、glgentextures、glbindtexture、gltexparameteri、glteximage2d、glenable(gl_texture_2d),分別來說道,還有個變數型別aux_rgbimagerec

ps:手頭暫時沒有原碼,而且工具用的是vc++6.0,so,先饒小弟一次,將就著理解吧,等以後有時間換個ide從原碼鼓搗

auxdibimageload,dib是裝置無關位**件,一般格式是bmp或者dib,其他格式這個函式是讀不了的。另外對本身也有要求,和一般的遊戲一樣(畢竟opengl是根嘛),要求解析度必須是2的n次方,也就是只有32*32、64*64,128*128,256*256這些,而且還加了限制最小64,最大256,太小的比如32還不行,更大只能用其它方式繞開,這個暫時不理。

函式引數是乙個字串,如果是相對位址的話會從.cpp的位置走,小小的實驗了一下,絕對位址也行,能跳出去。又試了下,../上一級目錄也能用,猜測和命令列的位址規則一樣,估摸還是用的file庫函式。

返回值是aux_rgbimagerec,記得用指標。

glgentextures,

是讓opengl給材質分配序號。引數有兩個,第乙個是材質的數量,第二個是aux_rgbimagerec型別的指標,也就是aux_dibimageload載入到的指標。

glbindtexture,

是告訴opengl,指定的紋理將是2d紋理,讓

opengl指向可用記憶體。引數有兩個,第乙個是常量gl_texture_2d,第二個常量是材質的位址.

這兩個函式奇怪的是,它不是必須的,當筆者將nehe的**這兩句注釋掉的時候,依然能載入出來,跟這個情況一樣的函式還有glbindtexture。從網上的一些資料來看,這兩個函式應該屬於opengl用來管理材質的系統,然而大家都是套路了同一種解釋,這個問題就先存著吧(已解決,參加下面的資料)。

gltexparameteri,這個函式可以設定紋理的過濾模式和過渡模式,什麼叫過濾呢,我理解是紋理的擴大和縮小以匹配物體的大小。過渡模式是指當相機或者物體移動時,紋理的切換方法,gl_linear是線性插值,可以讓影象運動變的更平緩。

glteximage2d,是最主要的函式,引數很多,一共有9或更多個。分別簡單的講解,這個詳細的參見glteximage2d的資料

第乙個引數是常量,指定紋理的樣式,一共有三個,gl_texture_1d,gl_texture_2d,gl_texture_3d.

第二個引數是int型別,指定紋理的細節層級,參見下面mipmap,預設為0.

第三個引數是int型別,指定顏色元件,比如rgb是三個,rgba是四個。

第四-五個引數是指定寬度和高度,也可以通過aux_rgbimagerec結構體的sizex、sizey自動獲得,比如這樣寫texture1-> sizex,texture1-> sizey

第六個是邊界/框,一般指定為0.

第七個是顏色模式,與第三個引數保持一致,gl_rgb

第八個是指定影象資料由無符號位元組還是有符號位元組構成,bmp是無符號的,gl_unsigned_byte.

第九個是指定影象的資料區,aux_rgbimagerec結構體的date,例如,texture1-> data

glenable(gl_texture_2d),是opengl執行使用

texture_2d紋理。在initgl裡先呼叫loadgltextures函式,在加上這句就行了。

ps:網際網路還是偉大的,我還是找到了詳細的介紹,他們都是紋理對映系統mipmap的一部分,是為了解決影象閃爍和效能優化的問題,詳見 。

以上,nehe把它們封裝成了乙個函式,現在把函式完整的貼出來

gluint texture[1]; // storage for 1 texture

// load bitmaps and convert to textures

glvoid loadgltextures();

第二步是應用紋理。涉及到gltexcoord2f函式.

gltexcoord2f函式是分配2d紋理的座標,以便能和glvertex3f描繪的點吻合,類似於glcolor3f一樣的作用.

gltexcoord2f函式是確定紋理的座標,紋理的左下角的位置是(0,0),右上角是(1,1),紋理座標最好也是按照一定順序(順時針或逆時針)去布點,如果隨機比如按照對角線,那麼紋理會扭曲的超越你想象,當然你說把正方形的點也按照對角線的順序出現,紋理是沒錯,不過圖案都變了。所以在新增紋理時,點的順序最好和紋理順序一致,如果可以的話,封裝個函式最好。

vertex3f

點座標glvertex3f(1.0f,1.0f,0.0f);

glvertex3f(1.0f,-1.0f,0.0f);

glvertex3f(-1.0f,-1.0f,0.0f);

glvertex3f(-1.0f,1.0f,0.0f);

gltexcoord2f

紋理座標

效果圖gltexcoord2f(0.0f,0.0f);

旋轉180

vertex和texcoord點的位置

和順序一致時,正好是正確的

對角線放置,結果反了

紋理和quads都按照對角線走

Android OpenGL教程 第六課

android opengl 教程 第六課紋理對映 在這一課裡,我將教會你如何把紋理對映到立方體的六個面。激動的時刻來了,載入了。複習一下android載入的知識。放乙個png到drawable裡面。新增乙個工具類,方便我們使用。這樣我們是不是可以直接用 bitmap mbitmap dataman...

第六課 字型

a.字型系列 font family times new roman times,serif b.字型樣式 font style normal 正常 正常顯示文字 font style italic 斜體 以斜體字顯示的文字 font style oblique 傾斜的文字 文字向一邊傾斜 和斜體非...

第六課 列表

序列是python中最基本的 種資料結構。序列 於儲存 組有序的資料,所有的資料在序列當中都有 個唯 的位置 索引 並且序列中的資料會按照新增的順序來分配索引。資料結構指計算機中資料儲存的 式。python 基礎教程 第二版 對序列的定義為 資料結構。資料結構是通過某種方式 例如對元素進行編號 組織...