gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:51:18 24 4
gpt4 key购买 nike

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

我有什么:

  • 在下面的函数 createVAOs() 中,我创建了我想要的所有顶点 (VBO),以及用于绘制一些漂亮正方形的索引 (EBO)。
  • 然后,在主循环中,在函数 draw_textures() 中,我绑定(bind)纹理并将具有纹理的元素绘制到 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 数据并通过多种方法之一更新它(例如 glBufferDataglSubBufferData)。

我看不到带有纹理的点,因为它绑定(bind)在 VAO 创建之外。如果您需要为不同的三角形使用不同的纹理,那么您有两种选择:

  • 绑定(bind)多个纹理并将其中一个作为顶点的属性传递给着色器
  • 将 VBO 拆分为多个 VBO(具有相应的 VAO)并一个一个地绘制它们(当然,您需要按着色器/纹理对它们进行分组,因为您希望最小化状态变化)。

关于c++ - OpenGL - 在渲染循环中创建 VAO 是个不错的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com