載入OpenGL函式

2021-10-06 08:27:33 字數 1855 閱讀 7039

載入opengl函式是建立opengl上下文後的一項重要的初始化工作,需要使用平台特定的函式查詢函式指標,且不同的版本有不同的語義。

我們使用 wglgetprocaddress 來查詢函式指標,該函式接收乙個ascii字串的函式名作為引數,可以查詢 opengl 函式 和 平台特定的wgl函式,這個函式只能在有效的上下文(opengl context) 上才能執行,返回的函式指標也是上下文相關的。windows 文件指出查詢出的函式可以在其它的opengl上下文中執行,這取決於該上下文的廠商和畫素格式。

在實際運用中,如果兩個opengl上下文同時**乙個廠商和同乙個gpu(對單機單顯示卡使用者多是如此情況),查詢出的函式指標可以共用。這在windows 建立上下文時比較重要,比如我們可以預先建立乙個上下文來獲得這些函式指標,隨後在其它的opengl上下文中使用這些函式,它簡化了上下文的初始化過程。

根據msdn 文件中的說明,wglgetprocaddress 可以返回 null, 1, 2, 3, -1 這些值來作為查詢失敗的結果。

使用wglgetprocaddress() 是查詢不到opengl32.dll 中匯出的函式,這就意味著opengl ver1.1 的舊函式不能夠被查詢到,它只能查詢opengl ver1.1之後的擴充套件函式。win32 函式getprocaddress()可以獲取 opengl32.dll 中的匯出函式。這兩個函式互相配合使用,可以獲取opengl 所有函式指標。

void

*getanyglfuncaddress

(const

char

*name)

return p;

}

在 linux 的 x-windows系統中,使用 glxgetprocaddress() 函式來獲取opengl 函式指標,也是使用 ascii 字串作為函式名引數。該函式可以在沒有上下文的情況下使用,但返回的函式顯然不能任意使用,因為返回的函式是與opengl 上下文相關的,具有一定的「語境」。這使得在具體的opengl上下文下獲取特定的函式指標變得困難,我們只有使用opengl 標準的擴充套件查詢方式獲取當前opengl上下文中的具體函式。

每個查詢到的opengl函式指標都有對應的c語言形式的函式型別,它們具有不同的返回值和引數列表。opengl registry 在glext.h 和 glcorearb.h 檔案中提供了opengl ver1.2 或以上版本的函式的型別。

例如定義的函式型別:

typedef void (apientryp pfngluseprogramproc) (gluint program);

可以用該函式型別定義函式名。

pfngluseprogramproc gluseprogram;

在opengl3.0 之前,我們可以使用 glgetstring(gl_version) 獲取指定opengl 版本的擴充套件字串,再對字串解析, 使用查詢函式獲取該版本下的所有的函式指標。

opengl3.0 以後的版本,可以先用 glgetintergerv(gl_major_version) 或 glgetintergerv(gl_minor_version) 查詢是否支援建立特定版本的opengl上下文。

opengl3.0版本後,先用 glgetintegerv(gl_num_extensions) 獲取opengl擴充套件函式的數目,再用glgetstringi() 函式來獲取擴充套件函式名。這比直接使用 glgetstring()函式更安全,因為我們並不知道該分配多大的緩衝區來儲存包括所有擴充套件函式名字的字串,如果分配的緩衝區的大小與查詢的擴充套件函式名字串的大小不匹配時,容易造成程式崩潰。

查詢wgl extensions 之前, 必須先建立 opengl context, 然後make it current, 再通過wglgetprocaddress獲取opengl 函式指標。

opengl 模型載入

乙個非常流行的模型導入庫是assimp,它是open asset import library 開放的資產導入庫 的縮寫 assimp資料結構的 簡化 模型如下 opengl中定義乙個頂點,每個頂點包含乙個位置向量 乙個法向量和乙個紋理座標向量 struct vertex 紋理資料,儲存了紋理的id...

OpenGL載入DDS壓縮紋理

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

OpenGL載入紋理深入詳解。

opengl進行紋理對映的基本流程 1,首先要開啟紋理對映的功能。glenable gl texture 2d 2,載入位圖資源。3,將位圖資源轉化成紋理。4,釋放位圖資源。5,使用紋理,繪圖。閒話不多說,直接上 這裡插一句,在opengl裡面,申明乙個紋理 位圖轉化成紋理 需要三個步驟 1,首先我...