OpenGL - 在渲染循环中创建VAO是不错的选择?

时间:2015-07-09 22:50:26

标签: c++ opengl vbo vao

我已经在OpenGL中粘贴了一个伪代码。

我有什么:

  • 在函数createVAOs()下面,我创建了我想要的所有顶点(VBO),以及索引(EBO)来绘制一些漂亮的正方形。
  • 然后,在主循环中,在函数draw_textures()中,我绑定纹理并将一个带纹理的元素绘制到VBO上的顶点。

我想要的是什么:

  • 现在我想动态更改VAO。让我们想象一下:我想在特定三角形中添加新纹理,甚至删除VAO上的一些三角形。但由于VAO是在循环之前创建的,我有一个问题......我不知道在循环中每次创建VAO是“明智的”还是“优化的”..

我的问题:

- 将VAO(VBO和EBO)的创建放在渲染循环中是明智的吗?如果没有,那么最佳解决方案是什么?

考虑我的伪代码:

CheckedListbox

1 个答案:

答案 0 :(得分:2)

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

我没有看到纹理的重点,因为它被限制在VAO创建之外。如果您需要不同三角形的不同纹理,那么您有两个选项:

  • 绑定多个纹理,并将哪一个作为顶点属性
  • 传递给着色器
  • 将VBO拆分为多个VBO(使用相应的VAO)并逐个绘制(当然,您需要通过着色器/纹理对它们进行分组,因为您希望最小化状态更改)。