OpenGL載入紋理深入詳解。

2021-08-01 10:57:23 字數 3065 閱讀 1892

//opengl進行紋理對映的基本流程:

1,首先要開啟紋理對映的功能。

glenable(gl_texture_2d); 

2,載入位圖資源。

3,將位圖資源轉化成紋理。

4,釋放位圖資源。

5,使用紋理,繪圖。

閒話不多說,直接上**。

這裡插一句,在opengl裡面,申明乙個紋理(位圖轉化成紋理)需要三個步驟:

1,首先我需要申明乙個紋理物件的名稱,呼叫glgentextures函式,為這個紋理物件申明乙個名稱,

其實這裡的名稱,就有點類似於mfc裡面的id,glgentextures函式有兩個引數,第乙個是你要申請名稱

的個數,第二個是乙個gluint型別的陣列指標,將申請的名稱放在乙個陣列裡面裝起來,這個陣列裡面

的名稱(其實本質上就是乙個uint的數字,這裡和mfc相似。)就表示了這個紋理,其實我也可以直接令

乙個數字為這個紋理的名稱,但是為了防止意外的重名,所以呼叫glgentextures函式,向opengl宣告一下。

簡而言之,第一步就是什麼乙個紋理物件,並且給這個物件申請乙個名字,就這個名字返回到陣列裡面。

2,呼叫glbindtexture函式,這個函式有兩個引數,第乙個是要繫結的紋理物件的型別,第二個是要繫結

的紋理物件的名稱,也就是glgentextures函式申請的名字並返回到陣列裡面的數值。

這個函式一共有三個功能:

<1>,如果這個名字第一次使用,這個函式就會建立乙個新的紋理物件,並與這個名字繫結,然後這個紋理

物件成為活動紋理物件。

<2>,如果這個名字已經繫結過了,那麼直接讓這個紋理成為當前的活動紋理。

<3>,因為紋理物件的名字是乙個無符號的整形,所以如果傳的值為0的話,opengl就會停止使用紋理物件

3,到目前為止,我已經有了乙個紋理物件,那麼接下來我就需要為這個紋理物件填充位圖資源了,呼叫

glteximage2d函式,這個函式一共有九個引數:

①,定義紋理的型別,②,區分多種解析度的紋理,如果只有一種解析度,那麼這個值為0,③,點陣圖的顏色

成分,一般為3,④,紋理的寬度,⑤,紋理的高度,⑥,邊框的大小,⑦和⑧是紋理的一些屬性引數

這裡不做贅述,⑨,紋理的影象資料。

做完這些,乙個紋理就生成了。回頭再總結一下

1,申請乙個名稱。

2,為這個名稱繫結乙個物件。

3,為這個物件設定一些資料。

分別以三個函式實現。

函式原型:

void glgentextures(glsizei n, gluint *textures)

void glbindtexture(glenum target, gluint texture );

void glteximage2d(glenum target, glint level, glenum internalformat,glsizei width, glsizei height,

glint border, glenum format, glenum type, const void* pixels);

載入一張紋理的具體細節

這裡直接封裝好的函式loadgltextures,直接呼叫就行了,下面我來介紹一下loadgltextures函式

具體實現的細節。

1,首先申明乙個aux_rgbimagerec型別的指標,指著指向loadbmp返回的物件,裝下所需要的點陣圖資源。

textureimage[0]=loadbmp("*.bmp");這樣的話,我就從外存載入了點陣圖資源到記憶體裡面。關於loadbmp

這個函式我就不做介紹了,其實我自已也不大懂,知道這麼用就行了,大概就是個c語言的記憶體讀取

2,glgentextures(1, &texture[0]);上面已經提到了,申請乙個紋理名稱(乙個無符號整形數),儲存在

texture[0]裡面。

3,glbindtexture(gl_texture_2d, texture[0]);為這個名稱繫結乙個紋理。

4,glteximage2d(gl_texture_2d, 0, 3, textureimage[0]->sizex, textureimage[0]->sizey,0, 

gl_rgb, gl_unsigned_byte, textureimage[0]->data);呼叫這個函式,將位圖資源轉化到紋理,其他

的引數不管,主要記住textureimage[0]->sizex, textureimage[0]->sizey,textureimage[0]->data這

三個就行了,分別指定了點陣圖資源的寬高和資源的**。

5,最後在紋理生成之後,釋放這個位圖資源,記憶體優化。

//原始碼

gluint texture[1];

aux_rgbimagerec *loadbmp(char *filename)

file=fopen(filename,"r"); 

if (file) 

return null; 

int loadgltextures() 

if (textureimage[0]) 

free(textureimage[0]); 

}return status;

}//原始碼

gluint texture[n];//用於裝紋理名稱的陣列,如果要宣告多個,修改n的值。

aux_rgbimagerec *loadbmp(char *filename)//loadbmp完全是個工具函式,直接抄著用就行了,不做贅述。

file=fopen(filename,"r"); 

if (file) 

return null;

}int loadgltextures() 

;for(int i=0; i

if (textureimage[i]) 

// 釋放位圖陣列占用的記憶體空間

free(textureimage[i]); }}

return status;

}//以上就是opengl載入位圖資源的步驟,可能寫的有點亂,但是如果認真看的話應該不難理解,先就這樣了

//其他的比較難的我也就不多說了,(其實我也不會,╮(╯_╰)╭)。

//學一點總結一點。 。

OpenGL載入DDS壓縮紋理

網路上的影象庫很多,如 freeimage devil 等,庫很強大且支援多種格式,當然也包括 dds紋理。例如 freeimage 但是它這裡所說的支援 dds格式是指將壓縮格式的資料重新解壓成 rgba 畫素資料,將資料解壓後再繫結到 opengl 中就失去了其作為壓縮紋理的高效性 因 open...

OpenGL紋理詳解(上)

現實生活中,紋理最通常的作用是裝飾我們的物體模型,它就像是貼紙一樣貼在物體表面,使得物體表面擁有圖案。但實際上在opengl中,紋理的作用不僅限於此,它可以用來儲存大量的資料,乙個典型的例子就是利用紋理儲存地形資訊。現代opengl中,紋理物件和頂點陣列物件 vao 及快取物件 vbo 一樣,需要呼...

opengl紋理單元

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