Я начинаю кодировать с OpenCascade в QT, находя этот интересный базовый проект:
https://github.com/eryar/occQt/
Я скомпилировал программу с:
QT + = основной графический интерфейс opengl
и когда я выполняю его, я получаю следующую ошибку:
TKOpenGl | Тип: Производительность | ID: 0 | Серьезность: низкая | Сообщение: VBO
Создание примитивного массива не удалось для 169 вершин. Снаружи
объем памяти?
Я также разместил проблему на сайте проекта, но я не уверен в активности в этом месте.
Вот почему я спрашиваю вас, есть ли у вас идея обойти это.
Мой испытательный стенд:
я не пытался скомпилировать программу, но после быстрого просмотра это может быть Драйвер графического процессора проблема, по какой-то причине 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;
}
вернул ложь,
так как
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);
}
это может быть неправильный вывод, но я не копал глубже
Других решений пока нет …