和之前生成的opengl物件一樣,紋理也是使用id引用的。讓我們來建立乙個:
unsigned int texture;
glgentextures(1, &texture);
glgentextures函式首先需要輸入生成紋理的數量,然後把它們儲存在第二個引數的unsigned int陣列中(我們的例子中只是單獨的乙個unsigned int),就像其他物件一樣,我們需要繫結它,讓之後任何的紋理指令都可以配置當前繫結的紋理:
glbindtexture(gl_texture_2d, texture);
現在紋理已經繫結了,我們可以使用前面載入的資料生成乙個紋理了。紋理可以通過glteximage2d來生成:
glteximage2d(gl_texture_2d, 0, gl_rgb, width, height, 0, gl_rgb, gl_unsigned_byte, data);
glgeneratemipmap(gl_texture_2d);
函式很長,引數也不少,所以我們乙個乙個地講解:
第乙個引數指定了紋理目標(target)。設定為gl_texture_2d意味著會生成與當前繫結的紋理物件在同乙個目標上的紋理(任何繫結到gl_texture_1d和gl_texture_3d的紋理不會受到影響)。
第二個引數為紋理指定多級漸遠紋理的級別,如果你希望單獨手動設定每個多級漸遠紋理的級別的話。這裡我們填0,也就是基本級別。
第三個引數告訴opengl我們希望把紋理儲存為何種格式。我們的影象只有rgb值,因此我們也把紋理儲存為rgb值。
第四個和第五個引數設定最終的紋理的寬度和高度。我們之前載入影象的時候儲存了它們,所以我們使用對應的變數。
下個引數應該總是被設為0(歷史遺留的問題)。
第七第八個引數定義了源圖的格式和資料型別。我們使用rgb值載入這個影象,並把它們儲存為char(byte)陣列,我們將會傳入對應值。
最後乙個引數是真正的影象資料。
當呼叫glteximage2d時,當前繫結的紋理物件就會被附加上紋理影象。然而,目前只有基本級別(base-level)的紋理影象被載入了,如果要使用多級漸遠紋理,我們必須手動設定所有不同的影象(不斷遞增第二個引數)。或者,直接在生成紋理之後呼叫glgeneratemipmap。這會為當前繫結的紋理自動生成所有需要的多級漸遠紋理。
生成了紋理和相應的多級漸遠紋理後,釋放影象的記憶體是乙個很好的習慣。
stbi_image_free(data);
生成乙個紋理的過程應該看起來像這樣:
unsigned int texture;
glgentextures(1, &texture);
glbindtexture(gl_texture_2d, texture);
// 為當前繫結的紋理物件設定環繞、過濾方式
gltexparameteri(gl_texture_2d, gl_texture_wrap_s, gl_repeat);
gltexparameteri(gl_texture_2d, gl_texture_wrap_t, gl_repeat);
gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);
gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear);
// 載入並生成紋理
openGL學習筆記十四 透視投影
三維空間物體顯示近大遠小。透視投影區域是個稜錐體 透視投影顯示效果 透視投影 define glew static include include include include include pragma comment linker,subsystem windows entry maincr...
openGL學習筆記二十四 紋理迴圈滾動
通過每幀改變紋理uv座標實現紋理迴圈滾動。texturev 0.01f 這裡設定乙個矩形區域 並設定紋理uv座標 for int i 0 i 4 i 頂點資料 struct vertex 紋理id gluint texture float texturev 0 static fibitmap rea...
OpenGL學習筆記
我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...