2016-06-23 19 views
0

頂点配列オブジェクトを頂点バッファ&とQtを使ったインデックスバッファと組み合わせようとしています。頂点配列オブジェクトを頂点バッファとインデックスバッファとの組み合わせ

次のコードは完璧に働いVAOとVBOを兼ね備え:

// Create buffers 
void Tile::setupBuffers() { 
    vbo.create(); 
    vbo.bind(); 
    vbo.setUsagePattern(QOpenGLBuffer::StaticDraw); 
    vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D)); 
    vbo.release(); 

    vao.create(); 

    shaderProgram->bind(); 
    vao.bind(); 
     vbo.bind(); 
     shaderProgram->enableAttributeArray(0); 
     shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);  
    vao.release(); 

    shaderProgram->disableAttributeArray(0); 
    vbo.release(); 
    shaderProgram->release(); 
} 

// Draw triangle  
void Tile::draw() { 
    shaderProgram->bind(); 
    vao.bind(); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    vao.release(); 
    shaderProgram->release(); 
} 

私は今、インデックスバッファは何も追加しないようにしようとしている明確な色を除いて描かれます。ここでは、コードです:

// Create buffers 
void Tile::setupBuffers() { 
    vbo.create(); 
    vbo.bind(); 
    vbo.setUsagePattern(QOpenGLBuffer::StaticDraw); 
    vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D)); 
    vbo.release(); 

    ibo.create(); 
    ibo.bind(); 
    ibo.setUsagePattern(QOpenGLBuffer::StaticDraw); 
    ibo.allocate(indices.constData(), indices.size() * sizeof(GLushort)); 
    ibo.release(); 

    vao.create(); 

    shaderProgram->bind(); 
    vao.bind(); 
     vbo.bind(); 
     shaderProgram->enableAttributeArray(0); 
     shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0); 

     ibo.bind(); 
    vao.release(); 

    shaderProgram->disableAttributeArray(0); 
    vbo.release(); 
    ibo.release(); 
    shaderProgram->release(); 
} 

void Tile::draw() { 
    shaderProgram->bind(); 
    vao.bind(); 

    glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0); 

    vao.release(); 
    shaderProgram->release(); 
} 

ここに私の頂点ベクトル&インデックスベクトルの内容です:

vertices = { 
    QVector3D(1.0f, -1.0f, 0.0f), 
    QVector3D(1.0f, 1.0f, 0.0f), 
    QVector3D(-1.0f, -1.0f, 0.0f) 
}; 

indices = { 
    0, 1, 2 
}; 

私は2番目のコードブロックにVAO/VBO/IBOの結合の順序が間違っていると仮定し、私はどのように正しく行われたのか分かりません。どんな助けもありがとうございます。

+1

これに実際のOpenGLはありますか、それとも何らかのラッパーを使っていますか? –

+0

は、私はQtのが提供するラッパーを使用します。 http://doc.qt.io/qt-5/qopenglvertexarrayobject.html http://doc.qt.io/qt-5/qopenglbuffer.html – vigilanum

+0

...ワオ。 Qtのラッパーは* garbage *です。私は悪いことを言うことはできません: 'setAttributeBuffer'は頂点の状態とはまったく関係ない*型のメンバであるか、バッファオブジェクトを直接渡すことはできません*それは[glVertexAttribPointer'の非常に最悪の側面です](http://stackoverflow.com/q/37972229/734069)。私が感銘を受けた;それはひどくねじ込むために真の努力を要する*。 –

答えて

2
glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0); 

あなたのインデックスがGLushortのではなく、浮動小数点数です。 GL_INVALID_ENUMエラーが発生しているはずです。常にGLエラーをチェックする必要があります。

また、shaderProgram->disableAttributeArray(0);は完全に不要です。有効/無効状態は、VAOの一部です(逆のQtの奇妙なラッパー)。 VAOをアンバインドするので、属性を無効にしてもVAOは変更されません。とにかくそれを無効にしたくない。

最後に、これがあります:

shaderProgram->enableAttributeArray(0); 
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0); 

、これらの機能の両方の最初のパラメータが同じである必要があります。彼らはおそらく存在するので、これは良質のバグです。しかし、それはまだ間違っています。

+0

ありがとうございました、今図面が動作します。もし私がQtを使う必要がなければ、あなたは確信が持てます。 – vigilanum

+2

@vigilanum:Qtのラッパーを使う必要はありません。 Qtを使用してウィンドウを作成し、直接OpenGL呼び出しを使用してレンダリングすることができます。 –

+0

さて、私は割り当てがそれを指示するためにする必要があります。 – vigilanum

関連する問題