glDrawArrays вызывает нехватку памяти

Я создаю приложение Qt с OpenGL, используя VAO и VBO. У меня есть простая справочная сетка, которую я хочу нарисовать с помощью следующего кода

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). Я не могу понять, что происходит.

Кто-нибудь уже сталкивался с этой проблемой и имеет решение?


person TheHube    schedule 24.03.2015    source источник
comment
Просто догадка stackoverflow.com/questions/18795136/   -  person lfn    schedule 24.03.2015


Ответы (1)


Я забыл привязать буфер перед его выделением. Я думал, что 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/

person TheHube    schedule 24.03.2015