3

OpenGL プロジェクトで VBO を使用しようとしています。拡張機能には glew ライブラリを使用し、Windows 処理には glfw を使用しています。VBO アプリケーションを作成しようとするとクラッシュし、

symulator3C.exe の 0x00000000 で未処理の例外: 0xC0000005: アクセス違反

関数 glGenBuffersARB で。これが私のコードです:

GLuint vboId1=0; //this is global variable

void createVBO(){
normalsVBO = (float *) malloc(sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2);
verticesVBO = (float *) malloc(sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2);
if(normalsVBO==NULL) exit(-1);
if(verticesVBO==NULL) exit(-1);

glGenBuffersARB(1, &vboId1); //HERE IT CRASHES!

// bind VBO in order to use
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId1);

...
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2, verticesVBO, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);             // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0);

}

何が悪いのかわからない。もちろん、この関数を呼び出す前に glewInit() を呼び出し、結果は成功です。編集: Visual Studio 2010 を使用しています

4

1 に答える 1

2

あなたのプログラムは VBO 関連関数の最初の使用で失敗するので、GLEW を適切に初期化しなかったか ( glewInitGL コンテキストが作成されてアクティブになったときに呼び出して)、またはハードウェアが VBO をサポートしていないようです。

ハードウェアが GL_ARB_vertex_buffer_object をサポートしているかどうか、または OpenGL のバージョンが 1.5 以上であるかどうかを確認してください。その場合、VBO 関数のコア バージョンを使用できます (ARB サフィックスはありませんが、もちろん、これらには適切に初期化された GLEW が必要です)。 :

printf("%s\n", glGetString(GL_VERSION));
if(!strstr(glGetString(GL_EXTENSIONS), "GL_ARB_vertex_buffer_object"))
    //no VBO extension

また、最新のグラフィックス ドライバーを使用していることを確認してください。Windows のデフォルト ドライバを使用している場合、OpenGL 1.1 しかサポートしていない可能性があります。

于 2011-10-23T01:23:28.627 に答える