1

我已经为我在 OpenGL 中设计的内容粘贴了一个伪代码。

我有的:

  • 在下面的函数 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));
}
4

1 回答 1

2

要删除(或插入)三角形,您可以更改 VBO 数据并通过多种方式之一更新它(例如glBufferDataglSubBufferData)。

我看不到纹理的意义,因为它绑定在 VAO 创建之外。如果您需要为不同的三角形提供不同的纹理,那么您有两种选择:

  • 绑定多个纹理并将其中一个作为顶点的属性传递给着色器
  • 将 VBO 拆分为多个 VBO(具有各自的 VAO)并一一绘制(当然,您需要按着色器/纹理对它们进行分组,因为您希望最小化状态变化)。
于 2015-07-09T22:59:57.090 回答