以前也聽說過紋理對映,不過一直沒明白是怎麼回事情,只是以為是在繪製好的三維圖形表面再進行更為細緻的繪製,從而繪製出物體表面的紋理,就像畫桌子把桌面的條紋也畫出來一樣。今天學習的就是如何使用2d紋理繪製圖形。
紋理對映demo
總結一下,使用紋理對映分為以下幾個步驟:
1) 從位**件載入紋理對映所用到的點陣圖影象
2) 將載入到的點陣圖影象轉換為紋理
3) 在對opengl的初始化設定中允許進行紋理對映
4) 在具體的繪製圖形**中選擇要使用的紋理
5) 將紋理正確的對映到要繪製的圖形上
其中有幾個地方需要注意的:
1) 用作紋理的影象的寬和高必須是2的n次方;寬度和高度最小必須是64象素;並且出於相容性的原因,影象的寬度和高度不應超過256象素。如果原始素材的寬度和高度不是64,128,256象素的話,應該使用影象處理軟體重新改變影象的大小。
2) glgentextures(1, &texture[0])告訴opengl我們想生成乙個紋理名字(如果想載入多個紋理,就加大數字)。glbindtexture(gl_texture_2d, texture[0])告訴opengl將紋理名字texture[0]繫結到紋理目標上。2d紋理只有高度(在y軸上)和寬度(在x軸上)。主函式將紋理名字指派給紋理資料。本例中我們告知opengl,&texture[0]處的記憶體已經可用。我們建立的紋理將儲存在&texture[0]的指向的記憶體區域。
3) glteximage2d(gl_texture_2d, 0, 3, textureimage[0]->sizex, textureimage[0]->sizey, 0, gl_rgb, gl_unsigned_byte, textureimage[0]->data);在這裡我們建立真正的紋理。它告訴opengl此紋理是乙個2d紋(gl_texture_2d)。數字零代表影象的詳細程度,通常就設定為0。數字3是資料的成分數。因為影象是由紅色資料,綠色資料,藍色資料三種組分組成。textureimage[0]->sizex是紋理的寬度,textureimage[0]->sizey是紋理的高度。數字零是邊框的值,一般就是零。gl_rgb告訴opengl影象資料由紅、綠、藍三色資料組成。 gl_unsigned_byte意味著組成影象的資料是無符號位元組型別的。最後...textureimage[0]->data告訴opengl紋理資料的**。這裡指向存放在textureimage[0]記錄中的資料。
4) gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_linear);
gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_linear);
這兩行告訴opengl在顯示影象時,當它比放大得原始的紋理大gl_texture_mag_filter)或縮小得比原始得紋理小gl_texture_min_filter)時opengl採用的濾波方式。通常這兩種情況下都採用gl_linear。這使得紋理從很遠處到離螢幕很近時都平滑顯示。使用gl_linear需要cpu和顯示卡做更多的運算。如果機器很慢,也許應該採用gl_nearest。過濾的紋理在放大的時候,看起來斑駁的很(就是馬賽克)。也可以結合這兩種濾波方式。在近處時使用gl_linear,遠處時gl_nearest。
5) glbindtexture(gl_texture_2d, texture[0]); // 選擇紋理
這是選擇我們使用的紋理。如果您在您的場景中使用多個紋理,您應該使用來 glbindtexture(gl_texture_2d, texture[ 所使用紋理對應的數字 ]) 選擇要繫結的紋理。當您想改變紋理時,應該繫結新的紋理。有一點值得指出的是,您不能在glbegin()和glend()之間繫結紋理,必須在glbegin()之前或 glend()之後繫結。 6)
為了將紋理正確的對映到四邊形上,您必須將紋理的右上角對映到四邊形的右上角,紋理的左上角對映到四邊形的左上角,紋理的右下角對映到四邊形的右下角,紋理的左下角對映到四邊形的左下角。如果對映錯誤的話,影象顯示時可能上下顛倒,側向一邊或者什麼都不是。
gltexcoord2f的第乙個引數是x座標。0.0f是紋理的左側。0.5f是紋理的中點,1.0f是紋理的右側。gltexcoord2f的第二個引數是y座標。0.0f是紋理的底部。0.5f是紋理的中點,1.0f是紋理的頂部。
所以紋理的左上座標是x:0.0f,y:1.0f,四邊形的左上頂點是x:-1.0f,y:1.0f。其餘三點依此類推。 7)
紋理座標在背面的時候一定要注意想清楚其座標軸的位置關係,要與圖形的位置正確對應。
OpenGL入門學習(五)
今天要講的是三維變換的內容,課程比較枯燥。主要是因為很多函式在單獨使用時都不好描述其效果,我只好在最後舉乙個比較綜合的例子。希望大家能一口氣看到底了。只看一次可能不夠,如果感覺到迷糊,不妨多看兩遍。有疑問可以在下面跟帖提出。我也使用了若干圖形,希望可以幫助理解。在前面繪製幾何圖形的時候,大家是否覺得...
opengl 入門學習 隨筆五
今天開始opengl的學習,下面上第乙個程式!void mydisplay int main int argc,char argv 整個程式表示顯示乙個矩形 這裡有幾個概念稍微介紹一下 1 glclear 表示清除背景,也就是說我們在黑板上清除的效果是顯示全黑,在白紙上清楚顯示的是全白 2 glut...
OpenGL學習筆記(五)
乙個glsl頂點著色器的源 如下 version 330 core layout location 0 in vec3 apos void main 在opengl 3.3以及更高的版本中,glsl版本號和opengl版本是匹配的 比如說glsl 420版本對應於opengl 4.2 每個著色器都起...