2015-07-09 26 views
1

我已經爲OpenGL中的設計粘貼了一個僞代碼。OpenGL - 渲染循環內創建VAO是不錯的選擇?

我有什麼:

  • 在功能上createVAOs()波紋管,我創建了所有我想要的頂點(VBO),以及指數(EBO)來繪製一些漂亮的廣場。
  • 然後,在主循環中,在函數draw_textures()中,我綁定了紋理,並將具有紋理的元素繪製到VBO上的頂點。

我想要什麼:

  • 現在我要動態地改變VAO。讓我們來想象一下:我想添加一個新的紋理到一個特定的三角形,甚至刪除我的VAO上的一些三角形。但由於VAO被循環之前創建的,我有一個問題...我不知道這是否是「明智的」或「優化」創建循環內的VAO的每次..

我問題:

- 明智的做法是將VAO(VBO和EBO)的創建放置在渲染循環中?如果不是,那麼最好的解決方案是什麼?

考慮我的僞代碼波紋管:

int main (void) 
{ 
    //Init OpenGL, Glew,etc 

    //Load Shaders 

    createVAOs(); //triangles vertices (VBO) and indices (EBO) 

    while (!glfwWindowShouldClose(m_window)) //the LOOP! 
    { 
     //updateEvents(); 

     //use shaders 

     //bindVAO(); 

      /*createVAOs();*/ //<---- is this wise?? 
      draw_textures(); 

     //freeVAO 

     //swapBuffers 
    } 

    return 0; 
} 

void draw_textures() 
{ 
    glBindTexture(GL_TEXTURE_2D, texture.id()); 
    glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)(0)); 
} 

回答

2

要刪除(或插入)三角形更改VBO數據,並通過的很多方法可以做到這一個(例如glBufferDataglSubBufferData更新。 )。

因爲它在VAO創建之外被綁定,所以我沒有看到具有紋理的點。如果需要爲不同的三角形不同紋理那麼有兩種選擇:

  • 綁定多個紋理和通其中一個到着色器作爲頂點
  • 的屬性在多個維也納各組織分裂VBO(與相應的VAO)並逐一繪製它們(當然,由於想要最大限度地減少狀態變化,因此您需要通過着色器/紋理對它們進行分組)。