Ошибка сегментации Qt OpenGL
Я изменил пример с веб-сайта ( http://doc.qt.io/qt-5/qtgui-openglwindow-example.html) для работы с 3D-моделями и заметил, что при выполнении моей программы из терминала (без отладчика) моя программа разрушается, Когда я запускаю его из Qt Creator в режиме отладки, он никогда не ломается, и именно поэтому я заметил это прямо сейчас. У меня плохое время, чтобы понять это. Объект, который я пытаюсь визуализировать, составляет около 4 тыс. Вершин.
Код (есть некоторый дополнительный код о чтениях arduino, но это точно не причина ошибки):
#include "h/modelwindow.h"
ModelWindow::ModelWindow(QString modelDestination) : m_program(Q_NULLPTR), angle(0.0f,0.0f,0.0f),
distance(0.0f,0.0f,0.0f)
{
objectModel.LoadObject(modelDestination);
}
ModelWindow::~ModelWindow()
{
delete m_program;
}
void ModelWindow::initialize()
{
m_program = new QOpenGLShaderProgram(this);
if(m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, QDir::currentPath()+"/shaders/basicshader.vert"))
{
qDebug() << "Vertex shader loaded";
}
else
{
close();
qDebug() << "Unable to load vertex shader";
}
if(m_program->addShaderFromSourceFile(QOpenGLShader::Fragment,QDir::currentPath()+"/shaders/basicshader.frag"))
{
qDebug() << "Fragment shader loaded";
}
else
{
close();
qDebug() << "Unable to load vertex fragment";
}
m_program->link();
m_program->bind();
m_positionAttribute = m_program->attributeLocation("posAttr");
m_colorAttribute=m_program->attributeLocation("colAttr");
m_matrixUniform = m_program->uniformLocation("matrix");
}
void ModelWindow::render()
{
arduino.readLine();
//arduino delay in seconds
float aDelay = 0.1f;
float threshold = 0.1f;
float threshold2 = 0.001f;
QVector3D temp = arduino.gyro()* aDelay;
QVector3D temp2 = arduino.acc()* aDelay *aDelay * 10;
if(temp.x() > threshold || temp.x() < -threshold)
{
angle.setX(angle.x()+temp.x());
}
if(temp.y() > threshold || temp.y() < -threshold)
{
angle.setY(angle.y()+temp.y());
}
if(temp.z() > threshold || temp.z() < -threshold)
{
angle.setZ(angle.z()+temp.z());
}
if(temp2.x() > threshold2 || temp2.x() < -threshold2)
{
distance.setX(distance.x()+temp2.x());
}
if(temp2.y() > threshold2 || temp2.y() < -threshold2)
{
distance.setY(distance.y()+temp2.y());
}
if(temp2.z() > threshold2 || temp2.z() < -threshold2)
{
distance.setZ(distance.z()+temp2.z());
}
qDebug() << "Distance: " << distance.y() << " m " << distance.z() << " m " << -distance.x() << " m";
qDebug() << "Angle: " << angle.y() << " deg " << angle.z() << " deg " << -angle.x() << " deg";
glViewport(0, 0, width(), height());
glClear(GL_COLOR_BUFFER_BIT);
m_program->bind();
QMatrix4x4 matrix;
matrix.perspective(60.0f, 4.0f/3.0f, 0.1f, 100.0f);
//axes
//board | OpenGL
// x | -z
// y | x
// z | y
//translations
matrix.translate(0.0f,0.0f,-4.0f);
matrix.translate(-distance.y(),0.0f,distance.x());
//rotations
matrix.rotate(angle.x(), 0, 0, -1);
matrix.rotate(angle.y(), 1, 0, 0);
matrix.rotate(angle.z(), 0, -1, 0);
m_program->setUniformValue(m_matrixUniform, matrix);
QVector <QVector3D> colors;
for(int i=0; i<objectModel.vertices().size(); ++i)
{
QVector3D temp(0.75f, 0.75f, 0.75f);
colors.push_back(temp);
}
glVertexAttribPointer(m_positionAttribute, 3, GL_FLOAT, GL_TRUE, sizeof(QVector3D), &objectModel.vertices()[0]);
glVertexAttribPointer(m_colorAttribute,3, GL_FLOAT, GL_FALSE, sizeof(QVector3D), &colors[0]);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawArrays(GL_TRIANGLES, 0, objectModel.vertices().size());
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
m_program->release();
}
Я думаю, что проблема в
glDrawArrays(GL_TRIANGLES, 0, objectModel.vertices().size());
или мой объект слишком большой.
РЕДАКТИРОВАТЬ: Все данные вершин распределяются статически.
1 ответ
Поскольку вы упомянули терминал, я предполагаю, что вы работаете в Linux.
Помните, что QtCreator не просто запускает вашу программу с помощью gdb. Он также настраивает рабочую среду, обеспечивая правильную настройку LD_LIBRARY_PATH, чтобы ваше приложение могло найти динамические библиотеки Qt.
Если ваша программа падает сразу при запуске, возможно, она не использует правильные библиотеки Qt. Представьте, что у вас установлена система Qt 5.2 через дистрибутивные пакеты, но вы разрабатываете с помощью Qt SDK 5.9. Когда вы запускаете свое программное обеспечение с QtCreator, оно установит LD_LIBRARY_PATH, чтобы позволить вашему программному обеспечению использовать Qt 5.9. Но когда вы запускаете его из терминала, он будет использовать Qt 5.2 из /usr/lib, который не является двоично-совместимым, и, таким образом, вылетает из программы.