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