1

Windows にあらかじめパッケージ化されている opengl32.dll ファイルを動的にリンクすることにより、基本的な OpenGL アプリケーションのセットアップに取り組んでいます (その部分はオプションではありません)。しかし、頂点バッファ オブジェクトに関連する関数のプロシージャ アドレスを取得するのに非常に苦労しています。

私の最初の調査では、Windows は最初は OpenGL 1.1 仕様のみを公開しており、それよりも新しい関数を取得するには wglGetProcAddress 呼び出しを使用する必要があることが明らかになりました。そのため、コードを変更してその方法も試しました。サンプルケースとして glGenBuffers を使用しており、それをロードするために 4 つの異なる試行を試みましたが、すべて失敗しました。また、メジャー バージョン 4 として報告されているバージョン番号を確認するために glGetString を使用したので、VBO のサポートが不足しているとは思えません。

これらの VBO 関数の proc アドレスを取得するにはどうすればよいですか?

私が扱っているコードの最小化された例は次のとおりです。

#include <iostream>
#include "windows.h"

using namespace std;

int main()
{

//Load openGL and get necessary functions
HINSTANCE hDLL = LoadLibrary("opengl32.dll");
PROC WINAPI(*winglGetProcAddress)(LPCSTR);
void(*genBuffers)(int, unsigned int*);

if(hDLL)
{
    winglGetProcAddress = (PROC WINAPI(*)(LPCSTR))GetProcAddress(hDLL, "wglGetProcAddress");
    if(winglGetProcAddress == NULL){cout << "wglGetProcAddress not found!" << endl; return 0;}

    genBuffers = (void(*)(int, unsigned int*))GetProcAddress(hDLL, "glGenBuffers");
    if(genBuffers == NULL){genBuffers = (void(*)(int, unsigned int*))winglGetProcAddress("glGenBuffers");}
}
else
{cout << "This application requires Open GL support." << endl; return 0;}

//glGenBuffers not supported, fallback to glGenBuffersARB
if(genBuffers == NULL)
{
    genBuffers = (void(*)(int, unsigned int*))GetProcAddress(hDLL, "glGenBuffersARB");
    if(genBuffers == NULL){genBuffers = (void(*)(int, unsigned int*))winglGetProcAddress("glGenBuffersARB");}
    if(genBuffers == NULL)
    {cout << "Could not locate glGenBuffers or glGenBuffersARB in opengl32.dll." << endl; return 0;}
}

//get a Vertex Buffer Object
unsigned int a[1];
genBuffers(1, a);

//cleanup
if(!FreeLibrary(hDLL))
{cout << "Failed to free the opengl32.dll library." << endl;}

return 0;
}

実行すると、ライブラリが読み込まれ、wglGetProcAddress が正しく取得されますが、「opengl32.dll で glGenBuffers または glGenBuffersARB が見つかりませんでした」というメッセージが出力されます。「GetProcAddress」または「wglGetProcAddress」を使用して「glGenBuffers」または「glGenBuffersARB」を取得できなかったことを示すエラー。

または、これが VBO サポートを持っていないことを意味する場合、ドライバーの更新は役に立ちますか、それともサポートを受けることは可能ですか? 非推奨の即時モード呼び出しは使用したくありません。

NVIDIA GeForce GTX 460 を搭載した Windows XP、Intel Core i5 の Code::Blocks でこれを実行しています。

4

0 に答える 0