16

OpenGL拡張機能で公開されている関数を使用したい。私はWindowsを使用していますが、これを行うにはどうすればよいですか?

4

4 に答える 4

21

簡単な解決策GLEWを使用します。ここで方法を参照してください。

難しい解決策:GLEWを使用しない本当に強い理由がある場合は、GLEWなしで同じことを実現する方法を次に示します。

OpenGL拡張機能と使用する拡張機能APIを特定します。OpenGL拡張機能は、 OpenGL拡張機能レジストリにリストされています。

例: EXT_framebuffer_object拡張機能の機能を使用したいと思います。この拡張機能から使用したいAPIは次のとおりです。

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

グラフィックカードが使用する拡張機能をサポートしているかどうかを確認してください。もしそうなら、あなたの仕事はほぼ完了です!グラフィックカード用の最新のドライバとSDKをダウンロードしてインストールします。

例:私のPCのグラフィックカードはNVIDIA6600GTです。そこで、NVIDIA OpenGL拡張機能の仕様のWebページにアクセスすると、EXT_framebuffer_object拡張機能がサポートされていることがわかりました。次に、最新のNVIDIAOpenGLSDKをダウンロードしてインストールします。

グラフィックカードの製造元は、サポートされているOpenGL拡張機能を使用するために必要なすべての宣言を含むglext.hヘッダーファイル(または同様の名前のヘッダーファイル)を提供しています。(すべての拡張機能がサポートされているわけではないことに注意してください。)このヘッダーファイルをコンパイラが取得できる場所に配置するか、コンパイラのインクルードディレクトリリストにそのディレクトリを含めます。

コードに行を追加して#include <glext.h>、ヘッダーファイルをコードにインクルードします。

glext.hを開き、使用するAPIを見つけて、対応する見苦しい宣言を取得します。

例:上記のフレームバッファAPIを検索し、対応する見苦しい宣言を見つけます。

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

つまり、ヘッダーファイルには2つの形式のAPI宣言があります。1つは、wglのような醜い関数ポインタ宣言です。もう1つは、見栄えのする関数宣言です。

使用する拡張APIごとに、見苦しい文字列のタイプとして関数名のコード宣言を追加します。

例:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

見た目は醜いですが、私たちが行っているのは、拡張APIに対応するタイプの関数ポインターを宣言することだけです。

これらの関数ポインタを正当な関数で初期化します。これらの関数は、ライブラリまたはドライバーによって公開されます。これを行うには、 wglGetProcAddress()関数を使用する必要があります。

例:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

関数ポインタのNULLを確認することを忘れないでください。たまたまwglGetProcAddress()が拡張関数を見つけられなかった場合、ポインタをNULLで初期化していたでしょう。

例:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
    // Extension functions not loaded!
    exit(1);
}

これで完了です。これで、関数呼び出しが存在するかのように、これらの関数ポインターを使用できます。

例:

glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

参照: DaveAstleによる Windows用OpenGL1.1を超えて—この記事は少し古いですが、この悲惨な状況がWindowsに存在する理由と、それを回避する方法を理解するために必要なすべての情報が含まれています。

于 2008-08-18T10:12:00.577 に答える
0

@Kronikarz: 見た目からして、GLEWは未来への道のようです。NVIDIA は、すでにOpenGL SDKとともに出荷しています。そして、2006 年にリリースされた GLEE と比較して、最新のリリースは 2007 年にリリースされました。

しかし、両方のライブラリの使用法は私にはほとんど同じに見えます。(ただし、GLEW にはinit()があり、何よりも先に呼び出す必要があります。) したがって、GLEE でサポートされていない拡張機能が見つからない限り、切り替える必要はありません。

于 2008-08-20T03:01:42.273 に答える
0

GL3W は、OpenGL 3/4 のコア機能のみをロードするライブラリを作成するパブリック ドメインのスクリプトです。次の github で見つけることができます。

https://github.com/skaslev/gl3w

GL3W では、OpenGL のライブラリとヘッダーを生成するために Python 2.6 が必要です。その後は Python は必要ありません。

于 2012-03-26T04:05:43.760 に答える