2011-08-18 47 views
0

我在OpenGL中有VBO和IBO,但無法正確繪製它們。你可以讓我知道我可以忘記在框架顯示功能? - struct Point3D是一個帶有3個浮點數的結構(x,y,z)。 - nbVertex是glVertex數組中頂點的數量。 - nbVBOInd是VBOInd數組中索引的數量。無法在OpenGL中顯示VBO

glGenBuffers(1, &VertexVBOID); 
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(struct Point3D)*nbVertex, glVertex, GL_STATIC_DRAW); 

    glGenBuffers(1, &IndexVBOID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, sizeof(glVertex), BUFFER_OFFSET(0)); //The starting point of the VBO, for the vertices 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); //The starting point of the IBO 

謝謝!

+0

哪個版本的OpenGL你生成你的上下文? – datenwolf

+0

對不起,這個愚蠢的問題:我怎麼能找到這個? –

+0

@Laurent這取決於你的平臺。你使用QGLViewer或過剩或其他?通常會提供一些開關來創建具有特定版本的上下文。 – pmr

回答

2

嘗試改變最後一行:

glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

除非IndexVBOID你的數據真的很短,但隨後情況下,sizeof(int)的上方是錯誤的。

+0

感謝您的更正,但更改最後一行仍然無法正常工作。第一次運行後,沒有顯示任何內容,第二次後,一切都消失了。是否我應該在每個幀顯示中運行所有這些命令,還是應該釋放它們之間的某些內容?謝謝 ! –

+0

除非您的幾何圖形發生變化,否則您應該在初始化代碼中將前兩個段落寫入一次,並在render函數中運行兩次最後一段。請注意,每次調用glGenBuffers都會佔用圖形資源! – rodrigo

+0

好吧,我會嘗試去實現這一點,看看爲什麼我有一些奇怪的行爲(也許頂點陣列設置後刷新不好,我也會檢查。謝謝! –

3

我看到了同樣的問題,因爲羅德里戈 - 你有數據類型不匹配,你可以在這裏看到:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW); 

的sizeof(int)的 - 使用整型

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); 

GL_UNSIGNED_SHORT - 使用短根據openGL規範,只有無符號的數據類型可能用於glDrawElements類型

。爲了解決這個問題,你需要:

  • 變化VBOInd爲無符號類型在聲明中這樣的:

    unsigned int* VBOInd = new unsigned int[nbVBOInd]

  • glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

  • 更換11更換第六輪(最後)致電

    glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

無論如何,我認爲這個問題是隱藏在指針的設置,9日呼籲改變

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0)); 

如果還是不行,請告訴我們如何glVertex和VBOInd被聲明並填充數據。也許你正在使用std :: vector?你需要調用這些數據容器,如:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, &VBOInd[0], GL_STATIC_DRAW); 

如果事情還不清楚,只是要求在評論..