2012-02-11 16 views
0

私はこのチュートリアルのうち、hereに従っています。OpenGLの基本的なIBO/VBOが動作しない

インデックスバッファオブジェクト、頂点バッファオブジェクト、私自身の頂点およびフラグメントシェイダー、および自分自身の頂点構造を使用して単一の三角形を描きたいとします。

私の問題は、私が描くときに何も表示されないということです。私は何が間違っているのか分かりません。私のシェーダはうまく動作しますが、私はibo/vboを使用せずにそれらをテストしました。 、私は任意のビュー変換を行っていないよ

GLuint vao[1], vbo_vertex[1], index_buffer[1]; 

typedef struct{ 
    GLfloat x,y,z;  // Vertex. 
    GLfloat r,g,b; // Colors. 
} spicyVertex; 

void initializeBuffers(){ 

    spicyVertex* simple_triangle = new spicyVertex[3]; 
    // V0 - bottom 
    simple_triangle[0].x = 0.0f; 
    simple_triangle[0].y = -0.5f; 
    simple_triangle[0].z = 0.0f; 
    simple_triangle[0].r = 1.0f; 
    simple_triangle[0].g = 0.0f; 
    simple_triangle[0].b = 0.0f; 

    // V1 - top right 
    simple_triangle[0].x = 0.5f; 
    simple_triangle[0].y = 0.5f; 
    simple_triangle[0].z = 0.0f; 
    simple_triangle[0].r = 1.0f; 
    simple_triangle[0].g = 0.0f; 
    simple_triangle[0].b = 0.0f; 

    // V2 - top left 
    simple_triangle[0].x = -0.5f; 
    simple_triangle[0].y = 0.5f; 
    simple_triangle[0].z = 0.0f; 
    simple_triangle[0].r = 1.0f; 
    simple_triangle[0].g = 0.0f; 
    simple_triangle[0].b = 0.0f; 

    // Setup the vertex buffer data. 
    glGenBuffers(1, &vbo_vertex[0]); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]); 
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(spicyVertex), simple_triangle, GL_STATIC_DRAW); 


    // Index setup 
    GLushort *indices = new GLushort[3]; 
    indices[0]=0; 
    indices[1]=1; 
    indices[2]=2; 
    glGenBuffers(1, &index_buffer[0]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*sizeof(GLushort), indices, GL_STATIC_DRAW); 

    // By this point all of our data should be on the graphics device. 


    // VAO setup. 
    glGenVertexArrays(1, &vao[0]); 
    glBindVertexArray(vao[0]); 

    // Bind the vertex buffer and setup pointers for the VAO. 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(0)); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3)); 
    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 
    glDisableVertexAttribArray(2); 
    glDisableVertexAttribArray(3); 

    // Bind the index buffeer for the VAO. 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]); 

    // Cleanup. 
    delete [] simple_triangle; 
    delete [] indices; 
    glBindVertexArray(0); 
    glDisableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER,0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 
} 

void Draw_indexed_Vao(){ 
    glBindVertexArray(vao[0]);  // select first VAO 
    glDrawRangeElements(GL_TRIANGLES,0, 3, 3, GL_UNSIGNED_SHORT, NULL); 
    glBindVertexArray(0); 
} 

static void display(void){ 
    glUseProgramObjectARB(programObj); 

    Draw_indexed_Vao(); 
} 

私はすべてのものを描くのより基本的な手段を使用するときにカメラの前でうまく右を示しています

は、ここに私のコードです。私は本当に、私がこれらのバッファを宣言する方法について何かだと思う。

EDIT 1:アプリケーションはダブルバッファされています。

編集2:解決済み。 3つの頂点V0、V1、V2はすべて同じ配列要素を修正していました。のように、私はsimple_triangle[0]simple_triangle[1]simple_triangle[2]を使用していませんでしたが、私はsimple_triangle[0]としか働いていませんでした。私の愚かなエラーをキャッチするためにもう一度ありがとう。

+3

V1とV2はsimple_triangle [1]とsimple_triangle [2]を意味しましたか? – loganfsmyth

+0

ガー!それで解決しました、ありがとうございました。小さな間違いが見落とされ、大きな問題を引き起こす可能性があります。 – viperld002

答えて

1

実際の回答を追加する。

V1とV2はともにsimple_triangle[0]を修正しているので、頂点は1つだけです。

0

描画したバッファの内容を画面にプッシュするには、glFlush()に電話する必要があります。また、ダブルバッファリングを使用しているかどうかによって、必要なコールはglutSwapBuffers()(GLUTを使用している場合)またはその他のスワップコールである可能性があります。

+0

私はglFlush()を使用していますが、何の成功もなく、私は全体の時間を入れ替えています。 – viperld002

+0

ああ、大丈夫、提供されたコードでそれを見ることはできませんでした。 loganfsmythが問題を見つけたように見えます。あなたはそれが働いてうれしい:) – kevintodisco

0

あなたが変更したいかもしれません

'頂点 AttribPointer GL(1、3、GL_FLOAT、GL_FALSE、はsizeof(spicyVertex)を、BUFFER_OFFSET(はsizeof(spicyVertex)* 3));'

'カラー AttribPointer(1、3、GL_FLOAT、GL_FALSE、はsizeof(spicyVertex)を、BUFFER_OFFSET(のsizeof(spicyVertex)* 3))GL;'

しかし、私は100%確実ではありません。

関連する問題