2013-12-09 32 views
1

我使用本教程底部的代碼使用assimp加載網格。 Mesh Loading將網格加載到opengl的vbo中

所以我加載網格,然後將第一個加載到vbo中,然後將它們鏈接到vao。

glGenVertexArrays(1, &_vertexArray1); //Bind to first VAO 
glBindVertexArray(_vertexArray1); 
glGenBuffers(1, &_vertexBufferCube1); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferCube1); 
glBufferData(GL_ARRAY_BUFFER, g_point_count * 3 * sizeof (float), &g_vp[0], GL_STATIC_DRAW); 

glEnableVertexAttribArray(loc1); 
glVertexAttribPointer(loc1, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
glEnableVertexAttribArray(loc2); 
glVertexAttribPointer(loc2, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

但是,我怎樣才能加載第二個網格到vbo? 因爲在第二個網格應包含在g_vp[g_point_count * 3 * sizeof (float)]? 因爲我已經嘗試過了,它不起作用,但可能還有其他的錯誤。

+0

通常情況下,你會產生另一個VBO下一個網格的一個例子。如果你真的想把它放到第一個VBO中,你需要使VBO足夠大。 –

回答

0

如果您使用的是基於vao的繪圖,則可以將不同的vbos存儲在不同的voos中。在繪製場景時,使用glBindVertexArray(vao)和glBindVertexArray(0)在不同voos之間切換。還有更好的解決方案。您可以將多個對象存儲在一個vao中,但記錄每個對象的索引數據。然後,您可以通過指定索引來使用glDrawElementsBaseVertex來繪製每個對象。

本教程介紹了做與glDrawElementsBaseVertex +渲染assimp http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html

+0

是的,我的問題是我加載我的網格像這樣... 'for(unsigned int m_i = 0; m_i < scene-> mNumMeshes; m_i ++){ const aiMesh * mesh = scene-> mMeshes [m_i]; g_point_count = mesh-> mNumVertices;對於(unsigned int v_i = 0; v_i < mesh-> mNumVertices; v_i ++){ if(mesh-> HasPositions()){ const aiVector3D * vp =&(mesh-> mVertices [v_i])的 ; printf(「vp%i(%f,%f,%f)\ n」,v_i,vp-> x,vp-> y,vp-> z); g_vp.push_back(vp-> x); ' 哪些是我從教程中複製的代碼,我想知道我究竟能夠訪問加載到g_vp中的第二個網格? – user3083755

+0

scene-> mNumMeshes告訴你文件中有多少個網格物體。對於每個網格,您可以記錄索引。 for(unsigned int i = 0; i mMeshes [i] - > mMaterialIndex; 網格[i] .NumIndices = pScene-> mMeshes [i] - > mNumFaces * 3; 網格[i] .BaseVertex = numVertices; 網格[i] .BaseIndex = numIndices; numVertices + = pScene-> mMeshes [i] - > mNumVertices; numIndices + = mesh [i] .NumIndices; } –