OpenGL擴充套件的使用

2021-06-08 16:00:41 字數 3816 閱讀 8733

副檔名每個擴充套件都有乙個副檔名,副檔名類似如下形式:

gl_arb_multitexture

第一段gl

,用來表示針對

opengl

哪部分開發的擴充套件,有以下幾個值:

gl –

針對opengl

核心的擴充套件

wgl –

針對windows

平台的擴充套件

glx –

針對unix / linux

平台的擴充套件

glu –

針對opengl utility library

的擴充套件第二段

arb,用來表示是誰開發的這個擴充套件,常見以下幾個值:

arb –

經opengl architecture review board

(opengl

管理機構)正式核准的擴充套件,往往由廠商開發的擴充套件發展而來,如果同時存在廠商開發的擴充套件和

arb擴充套件,應該優先使用

arb擴充套件

ext –

被多個硬體廠商支援的擴充套件

nv – nvidia

公司開發的擴充套件

ati – ati

公司開發的擴充套件

atix– ati

公司開發的實驗性擴充套件

sgi – silicon graphics

(sgi

)公司開發的擴充套件

sgix– silicon graphics

(sgi

)公司開發的實驗性擴充套件

第三段multitexture

就是真正的副檔名了,如

multitexture

就是多重紋理擴充套件。

2.2使用

opengl

擴充套件要使用乙個

opengl

擴充套件,首先必須檢查顯示卡是否支援這個擴充套件,以下**可以獲取乙個顯示卡支援的的

opengl

擴充套件:const char *str = glgetstring( gl_extensions );

函式返回乙個字串指標,這個字串就是顯示卡所支援的所有擴充套件的副檔名,不同的副檔名之間用空格隔開,形如:

"gl_arb_imaging gl_arb_multitexture gl_arb_point_parameters ……"

opengl

擴充套件往往都會新增一些函式,在

windows

平台上,這些函式不是通過

.lib

庫連線到程式裡的,而要在執行時動態獲得函式的指標。我們以

gl_arb_point_parameters

擴充套件為例看看怎麼獲得函式指標。

首先要定義函式指標型別,

typedef void (apientry * pfnglpointparamete***rbproc)(glenum pname,

glfloat param);

typedef void (apientry * pfnglpointparameterfvarbproc)(glenum pname,

const glfloat *params);

這個工作

sgi已經為我們做好,它提供了乙個標頭檔案

glext.h

include/gl

資料夾下面,然後在程式裡面加上:

#include

就可以在程式中使用常量和函式指標型別了。

然後要定義函式指標:

pfnglpointparamete***rbproc glpointparamete***rb;

pfnglpointparameterfvarbproc glpointparameterfvarb;

再檢查顯示卡是否支援

gl_arb_point_parameters

擴充套件,其中

i***tensionsupported

是自定義的乙個函式,就是在

glgetstring( gl_extensions )

返回的字串裡查詢是否存在指定的副檔名:

int haspointparams = i***tensionsupported("gl_arb_point_parameters");

如果支援,就可以用

wglgetprocaddress

函式獲取擴充套件函式的指標:

if (haspointparams)

最後就可以在程式裡使用擴充套件函式:

if (haspointparams)

;glpointparameterfvarb(gl_distance_attenuation_arb, quadratic);

glpointparamete***rb(gl_point_fade_threshold_size_arb, 1.0);

}csdn

知識庫)

呼叫wglgetprocaddress

函式訪問乙個不在標準

opengl

庫中的擴充套件函式。如果該擴充套件函式存在當前的執行

(implementation)

中,那麼

wglgetprocaddress

返回乙個用來訪問該函式的函式指標。否則,

wglgetprocaddress

返回null.

例如,要訪問

gladdswaphintrectwin

擴充套件函式,如下呼叫

wglgetprocaddress:

// get a pointer to the extension function.

typedef void (winapi *fnswaphint)(glint, glint, glsizei, glsizei);

fnswaphint = (fnswaphint)wglgetprocaddress("gladdswaphintrectwin");

// actual call to gladdswaphintrectwin.

if (fnswaphint != null)

(*fnswaphint)(0, 0, 100, 100);

2.3 wgl

擴充套件glgetstring( gl_extensions )

取得的擴充套件字串中並不包括針對

windows

平台的wgl

擴充套件,wgl

擴充套件串要通過

wgl_arb_extensions_string

擴充套件來獲得,以下**演示了如何獲得

wgl擴充套件串:

定義wgl_arb_extensions_string

擴充套件新增函式

wglgetextensionsstringarb

的函式指標型別,同樣這個工作

sgi已經為我們做好,只不過不在

glext.h

中,而在它提供的另外乙個標頭檔案

wglext.h

中:typedef const char *(apientry * pfnwglgetextensionsstringarbproc)(

hdc hdc);

定義函式指標:

pfnwglgetextensionsstringarbproc wglgetextensionsstringarb;

檢查是否支援

wgl_arb_extensions_string

擴充套件,如果不支援,表示這個顯示卡不支援

wgl擴充套件,如果支援,則得到

wglgetextensionsstringarb

函式的指標,並呼叫它得到

wgl擴充套件串:

int haswglext = i***tensionsupported("wgl_arb_extensions_string");

if (haswglext)

如何使用OpenGL中的擴充套件

如果你在windows平台下開發 opengl程式,那麼 系統中自帶的opengl庫就是1.1的,如果想使用1.2或者更高版本的opengl庫,那麼只能使用opengl擴充套件,在網上關於如何使用opengl擴充套件的文章很多,但是多數都是簡單帶過,抄來抄去,很少有實際的 我當時也遇到過同樣的問題,...

OpenGL系統設計 OpenGL擴充套件

和微軟的direct3d directgraphics相比較,opengl的乙個最大的優點是其擴充套件機制。對於顯示卡硬體的新功能,除非微軟發布了directx的新版本,否則,程式設計師是無法使用的。但opengl就不同了,opengl給硬體廠商和程式設計師提供了擴充套件機制,讓硬體廠商增加基於顯示...

OpenGL系統設計 擴充套件建模 3

除了直線的寬度可以根據需要進行改變外,直線的線型也可以改變。gllinestipple就可以提供不同於常規的連續線段的中心線 虛線 點劃線等等。其函式原型如下 void gllinestipple glint factor glushort pattern 其中 factor factor為3 那麼...