0

ここにリストされているチュートリアルに従っています。

インデックス バッファー オブジェクト、頂点バッファー オブジェクト、独自の頂点およびフラグメント シェーダー、独自の頂点構造を使用して、1 つの三角形を描画したいと考えています。

私の問題は、描画時に何も表示されないことです。何が間違っているのかわかりません。私のシェーダーは正常に動作します。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();
}

カメラの前にすべてがうまく表示されるように描画するより基本的な手段を使用する場合、ビューの変換は実行していません。私は本当に、これらのバッファを宣言する方法について何かだと思います。

編集 1:アプリケーションはダブル バッファリングされます。

編集2:解決しました。3 つの頂点 V0、V1、および V2 はすべて、同じ配列要素を変更していました。のように、私は , を使用していませんでしたがsimple_triangle[0]、でのみ作業していました。私のばかげたエラーを見つけてくれてありがとう。simple_triangle[1]simple_triangle[2]simple_triangle[0]

4

3 に答える 3

1

実際の回答を追加します。

V1 と V2 は両方とも修正simple_triangle[0]しているため、頂点は常に 1 つだけです。

于 2012-02-11T10:15:14.677 に答える
0

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

于 2012-02-11T05:31:34.280 に答える
0

あなたは変わりたいかもしれません

' gl Vertex AttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

'gl Color AttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

しかし、私は100%確信が持てません。

于 2013-08-11T09:21:03.330 に答える