2

VBO を使用して円柱を描画しようとしていますが、このアクセス違反に悩まされています。これはコードです(例のためにフォーマットされています):

int N;
float *vertexArray, normalArray;

void fillArrays(float height, float radius, int num) {

N = num;
vertexArray = (float*) malloc(sizeof(float)*36*num);
normalArray = (float*) malloc(sizeof(float)*36*num);
... 
}

上記の関数は、配列を法線ベクトルと頂点で埋めるだけです。

void drawCylinder() {
GLuint buffers[2];
glGenBuffers(2, buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, 144*N, vertexArray, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER,buffers[1]);
glBufferData(GL_ARRAY_BUFFER, 144*N, normalArray, GL_STATIC_DRAW);

glVertexPointer(3,GL_FLOAT,0,vertexArray);
glNormalPointer(GL_FLOAT,0,normalArray);
glDrawArrays(GL_TRIANGLES, 0, 12*N);
}

glDrawArrays 呼び出しで例外がスローされます。GLUT のディスプレイ コールバック関数 (renderfunc) で drawCylinder() を呼び出しています。メイン関数は次のようになります。

void main(int argc, char **argv) {

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Glew - VBOs - Cylinder");

glutDisplayFunc(renderfunc);
glutIdleFunc(renderfunc);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

fillArrays(3,1,20);
glutMainLoop();
}

私のコードにはおそらくさまざまな問題があります.VBO(およびopenGLライブラリ)をいじり始めたところです。しかし、この例外がスローされる明確な理由はありますか? 私はVisual Studioを使っていますが、先ほども言ったようにglDrawArraysを呼び出すとアクセス違反が検出されるようです。

4

2 に答える 2

1
glVertexPointer(3,GL_FLOAT,0,vertexArray);
glNormalPointer(GL_FLOAT,0,normalArray);

VBO を使用している場合、gl*Pointer() pointer引数はネイティブ ポインターではなく、バッファーへのオフセットである必要があります。ネイティブ ポインターは頂点配列用です。

GL_STATIC_DRAWまた、各描画呼び出しの前に頂点データを再アップロードすると、特にヒントを使用して、VBO の目的が多少損なわれます。

これはまともな VBO の例です。

于 2012-04-30T22:56:33.607 に答える
0

genpfaultの答えについて:

GLUT のディスプレイ コールバック関数で drawCylinder() を呼び出す

内部でdrawCylinderバッファを作成/バインドしますか?

したがって、キーボードのインタラクティブな回転を作成すると、キーを押してオブジェクトを回転させるたびに、新しいバッファーがバインドされます。最終的に、メモリが使い果たされ、スタック オーバーフローが発生する可能性があります。

init()関数スロー バッファの初期化コードを作成して、関数のinit()前に呼び出すことができます。glutDisplayFunc()

于 2012-10-25T16:53:12.403 に答える