QT и OpenCascade не хватает памяти - PullRequest
0 голосов
/ 17 октября 2018

Я начинаю кодировать с OpenCascade в QT, находя этот интересный базовый проект: https://github.com/eryar/occQt/

Я скомпилировал программу с:

QT + = core gui opengl

и когда я его выполняю, я получаю следующую ошибку:

TKOpenGl |Тип: Производительность |ID: 0 |Серьезность: низкая |Сообщение: создание VBO для Primitive Array не удалось для 169 вершин.Недостаточно памяти?

Я также разместил проблему на сайте проекта, но я не уверен в активности в этом месте.Вот почему я спрашиваю вас, есть ли у вас идея обойти это решение.

Мой тестовый стенд:

  • Intel i7 с 8 ГБ памяти
  • Windows 10
  • OpenCascade 6.9.1 vc12-64
  • QT 5.5.1

1 Ответ

0 голосов
/ 22 октября 2018

я не пытался скомпилировать программу, но после быстрого просмотра это может быть проблема с драйвером графического процессора , по какой-то причине glGenBuffer не сгенерировал объект буфера, вот как я вывел это >>в occt6.9.1, файл OpenGl_PrimitiveArray.cxx, функция:

Standard_Boolean OpenGl_PrimitiveArray::initNormalVbo (const Handle(OpenGl_Context)& theCtx) const 

:

  if (!myVboAttribs->init (theCtx, 0, myAttribs->NbElements, myAttribs->Data(), GL_NONE, myAttribs->Stride))
  {
    TCollection_ExtendedString aMsg;
    aMsg += "VBO creation for Primitive Array has failed for ";
    aMsg += myAttribs->NbElements;
    aMsg += " vertices. Out of memory?";
    theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, GL_DEBUG_TYPE_PERFORMANCE_ARB, 0, GL_DEBUG_SEVERITY_LOW_ARB, aMsg);

    clearMemoryGL (theCtx);
    return Standard_False;
  }

, что означает, что в файле OpenGl_VertexBuffer.cxx функция:

bool OpenGl_VertexBuffer::init (const Handle(OpenGl_Context)& theGlCtx,
                                const GLuint   theComponentsNb,
                                const GLsizei  theElemsNb,
                                const void*    theData,
                                const GLenum   theDataType,
                                const GLsizei  theStride)
{
  if (!Create (theGlCtx))
  {
    return false;
  }

  Bind (theGlCtx);
  myDataType     = theDataType;
  myComponentsNb = theComponentsNb;
  myElemsNb      = theElemsNb;
  theGlCtx->core15fwd->glBufferData (GetTarget(), GLsizeiptr(myElemsNb) * theStride, theData, GL_STATIC_DRAW);
  bool isDone = (glGetError() == GL_NO_ERROR); // GL_OUT_OF_MEMORY
  Unbind (theGlCtx);
  return isDone;
}

вернул false,

, потому что

bool OpenGl_VertexBuffer::Create (const Handle(OpenGl_Context)& theGlCtx)
{
  if (myBufferId == NO_BUFFER)
  {
    theGlCtx->core15fwd->glGenBuffers (1, &myBufferId);
  }
  return myBufferId != NO_BUFFER;
}

вернул false, что означает, что myBufferId по-прежнему равен NO_BUFFER, как установлено в конструкторе OpenGl_VertexBuffer, что означает, что

theGlCtx->core15fwd->glGenBuffers (1, &myBufferId);

ничего не изменило.комментарий в строке OpenGl_Context.hxx: 583 говорит, что

  OpenGl_GlCore15Fwd*  core15fwd;  //!< OpenGL 1.5 without deprecated entry points

функция OpenGl_GlCore15Fwd :: glGenBuffers просто вызывает функцию OpenGL, как в файле OpenGl_GlFunctions.hxx

  inline void glGenBuffers (GLsizei n, GLuint *buffers)
  {
    ::glGenBuffers (n, buffers);
  }

, это может быть неправильновычет, но я не копал глубже

...