1
我正在創建一個應用程序使用OpenGL在三維空間中繪製一些四平面。一切工作正常,直到我開始爲每個平面設置不同的頂點座標。現在,當我用新的座標創建一個平面時,它會被繪製成它以前創建的平面。換句話說,它的新座標正在被使用。VBO沒有被更新使用QGLBuffer
我正在用Qt庫使用OpenGL。
void Plane::initBuffers()
{
mVertexVBO.create(); //QGLBuffer
mIndexVBO.create(); //QGLBuffer
mVertexVBO.bind();
mIndexVBO.bind();
mVertexVBO.setUsagePattern(QGLBuffer::StaticDraw);
mIndexVBO.setUsagePattern(QGLBuffer::StaticDraw);
/* mVertices and mIndices are a QVarLengthArray object */
Vertex* aVerts = mVertices.data();
for(int i=0; i<4; ++i)
{
qDebug() << aVerts[i].x << " " << aVerts[i].y << " " << aVerts[i].z;
}
qDebug() << " --- ";
mVertexVBO.allocate(mVertices.data(), sizeof(Vertex)*4);
mIndexVBO.allocate(mIndices.data(), sizeof(GLuint)*6);
}
我創造了2架飛機。它們中的每一個默認情況下創建具有以下座標:
-1 -1 0
-1 1 0
1 1 0
1 -1 0
我改變了第一架飛機的座標
1 0 0
0 0 0
0 0 1
1 0 1
然而,這些飛機是平局完全相同。只是在不同的地方,因爲我已經改變了他們的模型矩陣。 QVarLengthArray正確更新(上面的代碼執行表明了這一點)。
有人知道我錯過了什麼?
你考慮過*而不是使用'QGLBuffer'嗎?它似乎缺少重要的API,就像一個'bind'函數,它實際上需要緩衝區對象應該綁定的位置。另外,創建這些對象時使用了哪些類型參數? –
是的。這是我的B計劃。但是我不想這樣做,因爲QGLBuffer提供了一些實用的優點(它更容易處理)。爲了創建QGLBuffer對象,我傳遞了一個Qt參數來確定緩衝區類型(頂點,索引...)。根據Qt文檔,你提到的參數在內部處理爲QGLBuffer。感謝你的回答! –