2012-07-04 54 views
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正確更新(上面的代碼執行表明了這一點)。

有人知道我錯過了什麼?

+0

你考慮過*而不是使用'QGLBuffer'嗎?它似乎缺少重要的API,就像一個'bind'函數,它實際上需要緩衝區對象應該綁定的位置。另外,創建這些對象時使用了哪些類型參數? –

+0

是的。這是我的B計劃。但是我不想這樣做,因爲QGLBuffer提供了一些實用的優點(它更容易處理)。爲了創建QGLBuffer對象,我傳遞了一個Qt參數來確定緩衝區類型(頂點,索引...)。根據Qt文檔,你提到的參數在內部處理爲QGLBuffer。感謝你的回答! –

回答

2

問題解決了!事實上,沒有與維也納國際組織有關的問題......我只是沒有更新法線,我的飛機是(如預期的)完全黑暗(隱形)。希望在這個問題上沒有人想到......對不起! = D