OpenGL - 渲染循环内创建VAO是不错的选择?
问题描述:
我已经为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));
}
答
要删除(或插入)三角形更改VBO数据,并通过的很多方法可以做到这一个(例如glBufferData
或glSubBufferData
更新。 )。
因为它在VAO创建之外被绑定,所以我没有看到具有纹理的点。如果需要为不同的三角形不同纹理那么有两种选择:
- 绑定多个纹理和通其中一个到着色器作为顶点
- 的属性在多个维也纳各组织分裂VBO(与相应的VAO)并逐一绘制它们(当然,由于想要最大限度地减少状态变化,因此您需要通过着色器/纹理对它们进行分组)。