1

VBO の使用方法を理解するのに少し苦労しています。私は以下に相当する画像を取得しようとしています:

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (70, 4.0f / 3, 1, 1000);

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

gluLookAt (0, 0, -5,
           0, 0,  0,
           0, 1,  0);

glBegin (GL_TRIANGLES);
glVertex3f (-1, -1, -1);
glVertex3f (1, -1, -1);
glVertex3f (1, 1, -1);
glVertex3f (-1, -1, -1);
glVertex3f (1, 1, -1);
glVertex3f (-1, 1, -1);
glEnd ();

その結果、白い正方形になります。VBO を使用すると、さまざまなチュートリアルから収集できるものから、コードを次のように変更する必要があります。

float vertexes[][3] = {
    { 1,  1, -1},
    { 1, -1, -1},
    {-1,  1, -1},
    {-1, -1, -1},
};

unsigned int indexes[] = {
    3, 1, 0,
    3, 0, 2,
};

GLuint vbo, ibo;

glGenBuffers (1, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glEnableClientState (GL_VERTEX_ARRAY);
glVertexPointer (3, GL_FLOAT, 0, 0);

glGenBuffers (1, &ibo);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, ibo);

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (70, 4.0f / 3, 1, 1000);

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

gluLookAt (0, 0, -5,
       0, 0,  0,
       0, 1,  0);

glBufferData (GL_ARRAY_BUFFER, sizeof vertexes, vertexes, GL_STATIC_DRAW);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof indexes, indexes, GL_STATIC_DRAW);

glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);

ただし、これは何もレンダリングしません。

4

2 に答える 2

2

VBO は OpenGL レンダリング システムにデータを提供するために使用されますが、手を握ってその中を通り抜ける必要があります。

  1. プロットする必要がある頂点と、そのデカルト座標を教えてください。あなたはそれを正しく行いました。

  2. 次に、その方法を彼に伝える必要があります。これは、配列インデックス配列によって行われます。それもあなたによって正しく行われます。

しかし、 glBindBuffer() への連続した呼び出しの間にバッファをクリアしていないため、どのバッファに入れるのに問題があるため、これが起こっていると感じています。

このサンプルを見てください(私が書いたものです)

void InitVBO() 
{
    glGenBuffers(noOfVBO, vboHandle);   // create an interleaved VBO object
    for(int i =0;i<noOfVBO;i++)
    {
        glBindBuffer(GL_ARRAY_BUFFER, vboHandle[i]);   // bind the first handle 
        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*masterNumberVertices[i], masterSolidVertex[i], GL_STATIC_DRAW); // allocate space and copy the position data over
        glBindBuffer(GL_ARRAY_BUFFER, 0);   // clean up 
        glGenBuffers(1, &indexVBO[i]); 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO[i]); 
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*masterNumberIndices[i], masterSolidIndices[i], GL_STATIC_DRAW);  // load the index data 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);  // clean up
    } 
  // by now, we moved the position and color data over to the graphics card. There will be no redundant data copy at drawing time 
}

そして、これが正方形描画ルーチンです。

//Draw Cube 
  glBindBuffer(GL_ARRAY_BUFFER, vboHandle[3]); 
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO[3]); 
  glVertexPointer(4,GL_FLOAT, sizeof(Vertex),(char*) NULL+0); 
  glNormalPointer(GL_FLOAT, sizeof(Vertex),(char*) NULL+16); 
  glColorPointer(4,GL_FLOAT,  sizeof(Vertex),(char*) NULL+32);
  glMatrixMode(GL_PROJECTION); 
  glLoadIdentity(); 
  gluPerspective(60, 1, .1, 100); 
  glMatrixMode(GL_MODELVIEW); 
  glLoadIdentity(); 
  gluLookAt(5,0,0,0,0,0,0,0,1); 
  glRotatef(x_angle, 0, 0,1); 
  glRotatef(y_angle, 0,1,0); 
  glScalef(scale_size, scale_size, scale_size); 
  glTranslatef(0,-1.5,-1.5);
  //glScalef(1,5,5); 
  glDrawElements(GL_QUADS, masterNumberIndices[3], GL_UNSIGNED_INT, (char*) NULL+0);

お役に立てれば...

于 2012-11-08T23:49:38.350 に答える
1

私のエラーが何であるかを見つけました。この呼び出し:

glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);

私が思ったように、それぞれ3つの頂点を持つ2つの三角形ではなく、2つの頂点を持つ三角形を描画するようにOpenGLに要求します。正しい呼び出しは次のとおりです。

glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
于 2012-11-09T11:15:49.517 に答える