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 でこれを実行しています。