openGL 紋理使用

2021-12-29 20:12:00 字數 2938 閱讀 7314

總結下紋理使用總體流程:

1 啟用紋理

glenable(gl_texture_2d);

2 載入紋理

3 紋理 的顯示

載入紋理

1 讀取紋理影象高寬和畫素資料到記憶體中,老版本opengl需要考慮寬度和高度不是的整數次方

2 分配乙個新的紋理編號 glgentextures(1, &texture_id);

3 繫結紋理 glbindtexture(gl_texture_2d, texture_id);表示當前所使用的紋理物件

4 設定紋理引數, 一堆函式呼叫gltexparameter*

5 載入 glteximage2d

紋理的顯示

顯示某個紋理之前先繫結 glbindtexture(gl_texture_2d, texground);

指定繪製方法 glbegin(gl_quads);

指定紋理座標和對應頂點 gltexcoord2f(0.0f, 0.0f); glvertex3f(-8.0f, -8.0f, 0.0f);

#define windowwidth 400

#define windowheight 400

#define windowtitle "opengl 紋理測試"

#include

#include

#include

/* 函式 grab

* 抓取視窗中的畫素

* 假設視窗寬度為 windowwidth,高度為 windowheight

*/#define bmp_header_length 54

void grab(void)

/* 函式 power_of_two

* 檢查乙個整數是否為 2 的整數次方,如果是,返回 1,否則返回 0

* 實際上只要檢視其二進位制位中有多少個,如果正好有 1 個,返回 1,否則返回 0

* 在「檢視其二進位制位中有多少個」時使用了乙個小技巧

* 使用 n &= (n-1)可以使得 n 中的減少乙個(具體原理大家可以自己思考)

*/int power_of_two(int n)

/* 函式 load_texture

* 讀取乙個 bmp 檔案作為紋理

* 如果失敗,返回 0,如果成功,返回紋理編號

*/gluint load_texture(const char* file_name)

// 根據總畫素位元組數分配記憶體

pixels = (glubyte*)malloc(total_bytes);

if( pixels == 0 )

// 讀取畫素資料

if( fread(pixels, total_bytes, 1, pfile) <= 0 )

// 在舊版本的 opengl 中

// 如果圖象的寬度和高度不是的整數次方,則需要進行縮放

// 這裡並沒有檢查 opengl 版本,出於對版本相容性的考慮,按舊版本處理

// 另外,無論是舊版本還是新版本,

// 當圖象的寬度和高度超過當前 opengl 實現所支援的最大值時,也要進行縮放

// 進行畫素縮放

gluscaleimage(gl_rgb,

width, height, gl_unsigned_byte, pixels,

new_width, new_height, gl_unsigned_byte, new_pixels);

// 釋放原來的畫素資料,把 pixels 指向新的畫素資料,並重新設定 width 和 height

free(pixels);

pixels = new_pixels;

width = new_width;

height = new_height;

} }// 分配乙個新的紋理編號

glgentextures(1, &texture_id);

if( texture_id == 0 )

// 繫結新的紋理,載入紋理並設定紋理引數

// 在繫結前,先獲得原來繫結的紋理編號,以便在最後進行恢復

glgetintegerv(gl_texture_binding_2d,(glint *) &last_texture_id);

glbindtexture(gl_texture_2d, texture_id);

gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);

gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear);

gltexparameteri(gl_texture_2d, gl_texture_wrap_s, gl_repeat);

gltexparameteri(gl_texture_2d, gl_texture_wrap_t, gl_repeat);

gltexenvf(gl_texture_env, gl_texture_env_mode, gl_replace);

glteximage2d(gl_texture_2d, 0, gl_rgb, width, height, 0,

gl_bgr_ext, gl_unsigned_byte, pixels);

glbindtexture(gl_texture_2d, last_texture_id);

// 之前為 pixels 分配的記憶體可在使用 glteximage2d 以後釋放

// 因為此時畫素資料已經被 opengl 另行儲存了乙份(可能被儲存到專門的圖形硬體中)

free(pixels);

return texture_id;

}/* 兩個紋理物件的編號

*/gluint texground;

gluint texwall;

void display(void)

int main(int argc, char* ar**)

openGL 紋理使用

最近找了點資料學習了下opengl 紋理的使用 先有個 整體把握,然後再去看大部頭中的細節講解,感覺這樣的學習方式好些 總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本 op...

opengl紋理單元

可以這樣簡單的理解為 顯示卡中有n個紋理單元 具體數目依賴你的顯示卡能力 每個紋理單元 gl texture0 gl texture1等 都有gl texture 1d gl texture 2d等,如下 cpp view plain copy print struct textureunit te...

OPENGL紋理基礎

對於vbo道理是一樣的 1.紋理座標 在繪製一條線段時,我們設定其中乙個端點為紅色,另乙個端點為綠色,則opengl會自動計算線段中其它各畫素的顏色,如果是使用glshademode gl smooth 則最終會形成一種漸變的效果 例如線段中點,就是紅色和綠色的中間色 類似的,在繪製一條線段時,我們...