0

glDrawElements/Arrays 関数を使用して、openGL 4 でモデルをレンダリングしようとしています。現在、ポリゴンの頂点データとインデックスを含むファイルを読み込んでいます。参照用に使用している軸を除いて、画面に表示するものは何もありません。私はこの一般的なアプローチを何度も使用して成功しました。何が間違っているのかわからず、ほぼ1日立ち往生しています。

これは、データをバッファリングする場所です

// get position of "in vec4 vPosition;" from shader program
// displays axes properly
vPosition = glGetAttribLocation( program, "vPosition" );

// create buffers
glGenVertexArrays(2, vao);
glGenBuffers( 3, vbo );

// here I bind vao[0] and vbo[0] then buffer
// a set of XYZ axes which display correctly

// buffer model
glBindVertexArray( vao[1] );
glBindBuffer( GL_ARRAY_BUFFER, vbo[1] );
glBufferData( GL_ARRAY_BUFFER, sizeof(board->verts),
                board->verts, GL_STATIC_DRAW );

glEnableVertexAttribArray( vPosition );
glVertexAttribPointer( vPosition, 4, GL_FLOAT, GL_FALSE, 0,
                        BUFFER_OFFSET(0));

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vbo[2] );
glBufferData(
        GL_ELEMENT_ARRAY_BUFFER,
        sizeof(board->indices),
        board->indices.data(),
        GL_STATIC_DRAW);

fyi board は、glDrawElements の頂点とインデックスが読み込まれるサーフボードのモデルです。次のコードが glBufferData の呼び出しのすぐ上に含まれている場合、これらの頂点とインデックスは正しく出力されます。

for( int i = 0; i < board->numVerts; i++ ){
    std::cerr << i << ":  "<<board->verts[i].x << " "<<board->verts[i].y<<" "<<
            board->verts[i].z << " " << board->verts[i].w << std::endl;
}

同様の印刷ループが挿入された場合、同じことがインデックスにも当てはまります。モデルを描画しようとする場所は次のとおりです。

void draw_model(){

    glUniform4fv( color_loc, 1, glm::value_ptr(blue));
    glBindVertexArray( vao[1] );

    glDrawArrays( GL_LINE_STRIP, 0, 600 );

    //glDrawElements(
    //  GL_LINES,
    //  board->indices.size(),
    //  GL_UNSIGNED_INT,
    //  NULL
    //);

}

DrawElements (コメント アウト) の呼び出しでは、何も表示されません。DrawArrays の呼び出しは、DrawElements を間違って使用しているかどうかを確認するためのトラブルシューティングの取り組みでした (過去に drawArrays しか使用したことがありません)。ボードは として定義されmodel3d *boardます。ここにそのクラスがあります

class model3d{
public:
    glm::vec4 *verts;
    std::vector<int> indices;
    int numVerts;
    int numPolys;
    model3d( const char*, const char* );
private:
    void load_coords( const char* );
    void load_polys( const char* );
};

データがバッファされないように見えるのはなぜですか?

4

1 に答える 1

3

sizeof(board->verts)ポインターのサイズのみを返すため、使用しないでください。

于 2012-11-08T05:55:18.903 に答える