我正在尝试渲染多个共享相同vao和顶点格式的模型(遵循这篇文章Render one VAO containing two VBOs上的顶部答案),但我无法使其与GL_ELEMENT_ARRAY_BUFFER
一起工作,也找不到任何资源/示例来帮助我。是否有可能做到这一点,或者元素数组缓冲区的工作方式是否与glVertexAttribFormat
/glBindVertexBuffer
和共享VAOS不兼容?或者我错过了相当于glBindVertexBuffer
的ELEMENT_ARRAY_BUFFER
?
My Vao首先是这样创建的:
glCreateVertexArrays(1, &sharedVao);
glBindVertexArray(sharedVao);
glEnableVertexAttribArray(0);
glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(0, 0);
// (just 1 for the example but there is more)
glBindVertexArray(0);
然后创建我的模型缓冲区,如下所示:
glBindVertexArray(sharedVao); // tried with and without binding vao first, no success
glCreateBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertex), vertices.data(), GL_STATIC_DRAW);
// (just 1 for the example but there is more)
glCreateBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles.size() * sizeof(triangle), triangles.data(), GL_STATIC_DRAW);
glBindVertexArray(0);
最后,我呈现如下:
glBindVertexArray(sharedVao);
for (auto const& model : models)
{
glBindVertexBuffer(0, model.vbo, sizeof(vertex));
// (just 1 for the example but there is more)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model.ebo);
// also tried glVertexArrayElementBuffer(sharedVao, model.ebo);
glDrawElements(GL_TRIANGLES, model.triangleCount * 3, GL_UNSIGNED_INT, nullptr);
}
请注意,如果我使用glDrawArray
(因此没有元素数组缓冲区)开始呈现相同的Vao,它确实可以工作。
这个C++ GLSL Multiple IBO in VAO可能很有价值,但仍然不确定它对共享多个型号的Vao格式意味着什么……(我也意识到,将其称为IBO比EBO能给我带来更多的结果……)
编辑:这个问题最初被认为是Rendering meshes with multiple indices的副本,但它不是。与这个问题不同,我不是在谈论对不同数据有不同的索引(例如:位置的索引、法线的索引、纹理坐标的索引等)。但是每次绘制调用都有不同的索引,同时仍然使用相同的Vao格式(与使用Render one VAO containing two VBOs中的VBO和glBindVertexBuffer
相同的方式)。
1条答案
按热度按时间sf6xfgos1#
共享顶点数组对象的多个绘制调用
这种方法的目的是通过共享Vao并只为每次抽奖重新绑定缓冲区来避免更改Vao格式(参见glVertexAttribPointer and glVertexAttribFormat: What's the difference?或https://www.youtube.com/watch?v=-bCeNzgiJ8I&t=1860)的成本。
下面是一个不使用元素缓冲区数组的明显示例:Render one VAO containing two VBOs
创建共享视频(每个程序只能创建一次):
创建网格缓冲区(每个网格只有一次):
渲染循环: