glDrawArrays导致内存不足
glDrawArrays cause out of memory
本文关键字:内存不足 glDrawArrays 更新时间:2023-10-16
我正在使用VAO和VBO用OpenGL构建一个Qt应用程序。我得到了一个简单的参考网格,我想用下面的代码绘制
void ReferenceGrid::initialize()
{
// Buffer allocation and initialization
Float3Array vertices;
for (float pos = -GridSide; pos <= GridSide; pos += 1.0) {
// X line
vertices.push_back(Float3(pos, -GridSide, 0.0f));
vertices.push_back(Float3(pos, GridSide, 0.0f));
// Y line
vertices.push_back(Float3(-GridSide, pos, 0.0f));
vertices.push_back(Float3( GridSide, pos, 0.0f));
LineCount += 2;
}
s_gridVao.create();
s_gridVao.bind();
s_gridBuffer.create();
s_gridBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
s_gridBuffer.allocate(vertices.data(), vertices.memorySize());
// Shader allocation and initialization
s_gridShader.create();
if (!s_gridShader.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/Grid.vert")) {
qWarning() << "Cannot grid vertex shader";
}
if (!s_gridShader.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/Grid.frag")) {
qWarning() << "Cannot grid fragment shader";
}
if (!s_gridShader.link()) {
qWarning() << "Cannot link grid shader";
}
s_gridBuffer.bind();
s_gridShader.enableAttributeArray("vertexPosition");
s_gridShader.setAttributeBuffer("vertexPosition", GL_FLOAT, 0, 3);
s_gridBuffer.release();
s_gridShader.release();
s_gridVao.release();
}
void ReferenceGrid::draw()
{
s_gridVao.bind();
s_gridShader.bind();
s_gridBuffer.bind();
glfuncs->glDrawArrays(GL_LINES, 0, LineCount);
// Return GL_OUT_OF_MEMORY
assert(glfuncs->glGetError() == GL_NO_ERROR);
s_gridBuffer.release();
s_gridShader.release();
s_gridVao.release();
}
问题是在调用glDrawArrays之后,会返回一个错误(GL_OUT_OF_MEMORY)。我不明白发生了什么事。
有人已经遇到这个问题并有解决方案吗?
我在分配缓冲区之前忘记了绑定缓冲区。我以为Qt是自动完成的,但我错了。所以正确的做法是:
s_gridBuffer.create();
s_gridBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
s_gridBuffer.bind();
s_gridBuffer.allocate(vertices.data(), vertices.memorySize());
我找到了一个很好的教程,http://www.kdab.com/opengl-in-qt-5-1-part-2/
相关文章:
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 在内存不足之前,我可以声明多少个 const 变量?
- 如何避免由于内存不足而导致 gcc 崩溃
- 检测到由于操作系统内存不足而导致子进程终止
- 导出 vulkan 内存分配句柄会导致设备内存不足
- 如何消除ROS打开CV中的内存不足错误?
- 32 位应用程序内存不足
- 在本机 Android 应用中处理内存不足
- 在 Linux 上C++的无限循环中捕获内存不足的错误 bad_alloc()
- 处理静态数组内存C++的内存不足情况
- 访问违规可以是一个伪装的内存不足错误吗
- g++ 内存不足为 std::bitset 分配
- C++ 分配器在内存不足时使应用程序崩溃
- 使用队列的非递归回溯:内存不足
- C++ : 内存不足时应返回什么?
- 使用 sqlite3 时内存不足
- std::int 和 struct 内存不足的映射 (std::Bad_alloc) c++
- SQLITE 内存不足 无法执行语句
- 内存不足的概念
- 从 c# 内存不足异常调用 c++ 委托