OpenGL - 在渲染循环中创建 VAO 是个不错的选择吗?
OpenGL - Creation of VAO inside the rendering loop is good option?
我已经为我在 OpenGL 中设计的内容粘贴了一个伪代码。
我有:
- 在下面的函数 createVAOs() 中,我创建了我想要的所有顶点 (VBO),以及用于绘制一些漂亮正方形的索引 (EBO)。
- 然后,在主循环中,在函数 draw_textures() 中,我绑定纹理并将具有纹理的元素绘制到 VBO 上的顶点。
我想要的:
- 现在我想动态改变 VAO。让我们想象一下:我想为一个特定的三角形添加一个新的纹理,或者甚至删除我的 VAO 上的一些三角形。但是由于 VAO 是在循环之前创建的,所以我有一个问题......我不知道是 "wise" 还是 "optimized" 每次在循环内创建 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 拆分为多个 VBO(具有各自的 VAO)并一个一个地绘制它们(当然你需要按 shaders/texture 对它们进行分组,因为你想最小化状态变化)。
我已经为我在 OpenGL 中设计的内容粘贴了一个伪代码。
我有:
- 在下面的函数 createVAOs() 中,我创建了我想要的所有顶点 (VBO),以及用于绘制一些漂亮正方形的索引 (EBO)。
- 然后,在主循环中,在函数 draw_textures() 中,我绑定纹理并将具有纹理的元素绘制到 VBO 上的顶点。
我想要的:
- 现在我想动态改变 VAO。让我们想象一下:我想为一个特定的三角形添加一个新的纹理,或者甚至删除我的 VAO 上的一些三角形。但是由于 VAO 是在循环之前创建的,所以我有一个问题......我不知道是 "wise" 还是 "optimized" 每次在循环内创建 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 拆分为多个 VBO(具有各自的 VAO)并一个一个地绘制它们(当然你需要按 shaders/texture 对它们进行分组,因为你想最小化状态变化)。