1

VBO を使用してクワッドを描画しようとしています。ここに完全なコードがありますが、コードを段階的に投稿します。バッファを初期化する方法は次のとおりです。

data= vector<GLfloat> {  // Global variable vector<GLfloat> data;
// Viewport: glViewport(0,0,width,height);
    width/2+20,height/2+20,0.0,
    width/2+20,height/2-20,0.0,
    width/2-20, height/2-20,0.0,
    width/2-20, height/2+20,0.0
};
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), data.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

次に、表示機能でクワッドを描画しようとします(ダブルバッファリングを使用します):

glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(1, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, data.data());
glDrawArrays(GL_QUADS, 0, 4); // Here I get segmentation fault
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glutSwapBuffers();

を呼び出す行でセグメンテーション違反が発生し、glDrawArraysで OpenGL エラーを取得しようとしましたが、エラーはglGetError()ありません (ゼロを返します)。

4

1 に答える 1

3

初期化で次の行を使用しています。

glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), data.data(), GL_STATIC_DRAW);

描画するときは、属性ポインターを次のように設定します。

glVertexPointer(3, GL_FLOAT, 0, data.data());

どちらの場合も同じだと思いdata.data()ます-これはエラーになります。ARRAY_BUFFERがバインドされている場合、さまざまなgl*Pointer()関数のポインタ引数は、クライアントのメモリ アドレスではなく、VBO 内のバイト オフセットを参照します。描画時に、GL はこのデータを取得しようとしますが、これはバッファ オブジェクトの範囲を超えている可能性が非常に高く、クラッシュが発生します。あなたはおそらく次のことを意味していました:

glVertexPointer(3, GL_FLOAT, 0, NULL);

元の VBO 拡張機能には、例のセクションにこのよく使用されるマクロがあることに注意してください。

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

それを使用すると、これらの見苦しいポインター演算を便利に非表示にし、バッファー内のバイト オフセットに対処できます。 glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

于 2013-11-11T22:34:58.090 に答える