OpenGL學習筆記(十四)

2021-10-08 18:01:12 字數 1852 閱讀 8193

和之前生成的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...