2015-07-09 25 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)并逐一绘制它们(当然,由于想要最大限度地减少状态变化,因此您需要通过着色器/纹理对它们进行分组)。