OpenGL Qt學習筆記之 05 紋理對映

2021-09-08 16:26:55 字數 3730 閱讀 3484

紋理對映基礎知識

這個示意圖說明,將中間的紋理(即)對映到左邊的茶壺曲面上,就形成了右邊的圖了。在右邊的圖中,可以看到茶壺的表面上布滿了,這就像中國古代的陶器繪圖一樣。

紋理對映另外乙個好處是能夠保證在變換多邊形時,多邊形上的紋理也會隨之變化。

紋理對映相關函式

要進行紋理對映,得先了解下opengl中有關紋理對映的一些相關函式。

void glgentextures(glsizei n, gluint *textures);

該函式的作用是開闢儲存紋理的記憶體空間,其中引數n為開闢紋理記憶體的個數,texture為儲存紋理的位址索引。

void glbindtexture(glenum target,   gluint texture);

該函式的作用是把儲存紋理的物件texture繫結到紋理目標target上,在opengl中紋理目標分為gl_texture_1d和gl_texture_2d。該句**執行完後,對target的操作也對應於對texture指向的內容的操作。

void glteximage2d(glenum target,glint level,glint components,glsizei width, glsizei height,glint border,glenum format,glenum type, const glvoid *pixels);

引數1為紋理目標;引數2為目標的層次,即目標的詳細程度,一般情況採用0即可;引數3表示的是資料成分的個數,如果資料由rgb構成,則將該引數設定為3;引數4和5分別為建立紋理資料的長和寬;引數6為邊框的值,一般也設為0;引數8為資料的通道格式;引數9為紋理的資料元素型別;引數10為紋理的資料內容。

這個函式的功能是建立乙個紋理,並為該紋理分配了資料。

gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_linear);

該函式表示的是當所顯示的紋理比載入進來的紋理小時,採用gl_linear的方法來處理。

gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear);

和上面的函式類似,注意該函式的引數2為gl_texture_mag_filter,不要誤認為是gl_texture_mag_filter。

gltexcoord2f(x, y);

第乙個引數是x座標。 0.0f 是紋理的左側。 0.5f 是紋理的中點, 1.0f 是紋理的右側。第二個引數是y座標。0.0f 是紋理的底部。0.5f 是紋理的中點,1.0f 是紋理的頂部。

給定一張紋理圖,它的座標示意圖如下:

其中紋理的中心點座標為(0.5, 0.5).

實驗說明:

我們需要在glwidget這個類中新增乙個函式來載入紋理資料,該函式為loadtextures().

另外,在qglwidget這個類中,initializegl(), paintgl(), resizegl()這3個函式的執行順序是該類啟動時就執行initializegl(),主要用於初始化opengl,通常用來設定一些前期的背景色,光照引數等等。paintgl()用於渲染整個場景;resizegl()用於在widget大小變化的時候產生合理view。

注意,本實驗給的長和寬必須是2的n次方,最大不要超過256,最小也不要小於64。我這裡採用的是256*256畫素的。

實驗結果:

載入紋理的影象為:

紋理對映後的效果如下:

//這是對虛函式,這裡是重寫該函式

void

glwidget::initializegl()

void

glwidget::paintgl()

//該程式是設定opengl場景透檢視,程式中至少被執行一次(程式啟動時).

void glwidget::resizegl(int width, int

height)

void glwidget::keypressevent(qkeyevent *e)

updategl();

break

;

//ese為退出程式鍵

case

qt::key_escape:

close();

}}/*

裝載紋理

*/void

glwidget::loadtextures()

tex = converttoglformat(buf);//

將qt的格式buf轉換成opengl的格式tex

glgentextures(1, &texture[0]);//

開闢乙個紋理記憶體,記憶體指向texture[0]

glbindtexture(gl_texture_2d, texture[0]);//

將建立的紋理記憶體指向的內容繫結到紋理物件gl_texture_2d上,經過這句**後,以後對

//gl_texture_2d的操作的任何操作都同時對應與它所繫結的紋理物件

glteximage2d(gl_texture_2d, 0, 3, tex.width(), tex.height(), 0, gl_rgba, gl_unsigned_byte, tex.bits());//

開始真正建立紋理資料

gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);//

當所顯示的紋理比載入進來的紋理小時,採用gl_linear的方法來處理

gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear);//

當所顯示的紋理比載入進來的紋理大時,採用gl_linear的方法來處理

}glwidget::~glwidget()

總結:了解了opengl中的紋理對映機制後,對空間體的表面進行貼圖還是比較方便的。

附錄:

OpenGL Qt學習筆記之 05 紋理對映

紋理對映基礎知識 這個示意圖說明,將中間的紋理 即 對映到左邊的茶壺曲面上,就形成了右邊的圖了。在右邊的圖中,可以看到茶壺的表面上布滿了,這就像中國古代的陶器繪圖一樣。紋理對映另外乙個好處是能夠保證在變換多邊形時,多邊形上的紋理也會隨之變化。紋理對映相關函式 要進行紋理對映,得先了解下opengl中...

C 學習筆記05

這下面的程式段是字元反輸出的例子,自己寫的,不過又出錯了,找了nnnn久,終於找到了錯誤,可惡啊,字串第乙個字元是0,時刻提醒著自己,卻在關鍵時刻忘記了.static void main string args static void main string args 用yes替換字串中的no,不過...

JAVAWEB學習筆記 05

thinkpad2 jquery的頁面載入函式可以存在多個 不會發生覆蓋 它會按照順序進行執行。dom數載入完成 獲取元素 js document.getelementbyid jq id jquery物件與dom物件轉換 sssss 注意 jq物件只能操作jq裡面的屬性和方法 js物件只能操作js...