作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一堆 3D 模型来自好奇号漫游者在火星上行驶时的立体相机。模型正在从磁盘加载,多个模型同时异步加载。现在我需要将这组模型异步上传到 GPU(在运行时),以防止渲染循环出现停滞,这种情况正在发生。
现在上传模型的方式:
glGenVertexArrays(1, &_vaoID);
glGenBuffers(1, &_vbo);
glGenBuffers(1, &_ibo);
glBindVertexArray(_vaoID);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBufferData(GL_ARRAY_BUFFER, _vertices.size() * sizeof(Vertex), _vertices.data(), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<const GLvoid*>(offsetof(Vertex, location)));
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<const GLvoid*>(offsetof(Vertex, tex)));
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
reinterpret_cast<const GLvoid*>(offsetof(Vertex, normal)));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, _indices.size() * sizeof(int), _indices.data(), GL_STATIC_DRAW);
glBindVertexArray(0);
及其呈现方式:
glBindVertexArray(_vaoID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ibo);
glDrawElements(_mode, static_cast<GLsizei>(_indices.size()), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
现在我在渲染循环中每次将大约 20 个模型上传到 GPU(当有模型从磁盘加载并准备好上传到 GPU 时)并且它太多了,应用程序停顿了大约 50-400 毫秒取决于模型的顶点/法线/索引的数量。
VBO 之间的乒乓球(更新一个,从一个读取)可能在当前管道中不起作用,因为每个模型都有随机数量的顶点/法线/索引并且需要连接到一个特定的纹理。
我正在寻找任何可以提高性能的解决方案。
编辑 1
我现在已经成功地创建了指向我的 VBO 和 IBO 的指针,但是我很困惑我应该如何在缓冲区返回到主线程时取消映射。我的第一个想法是像这样单独取消映射 VBO 和 IBO:`
for (int i = 0; i < _vertices.size(); i++) {
_vertexBufferData[i] = _vertices.at(i);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
for (int k = 0; k < _indices.size(); k++) {
_indexBufferData[k] = _indices.at(k);
}
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
但是我收到一条错误消息,指出缓冲区已经未绑定(bind)或未映射。我只需要执行第一个取消映射吗?
最佳答案
您描述的问题称为Buffer Object Streaming .
简而言之,假设您有一个必须加载特定模型的触发器。然后:
glBufferStorage
。很明显,在 1 到 4 之间,您的主线程继续像往常一样渲染,而不渲染挂起的 VAO。
关于c++ - 异步上传多个对象到GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44011690/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!