QGLWidget отказывается что-либо рисовать

Я просмотрел массу статей и ТАКИХ вопросов о том, что OpenGL не рисует, о распространенных ошибках и т. д. Этот вопрос ставит меня в тупик.

Я пробовал несколько разных настроек для glOrtho, разных позиций вершин, цветов и т.д., все безрезультатно.

Я могу подтвердить, что состояние OpenGL допустимо, потому что чистый цвет является фиолетовым в коде (это означает, что окно фиолетовое). gDEBugger также подтверждает, что кадры обновляются (как и Fraps).

Вот код. Строки, помеченные как «не помогло», изначально не существовали, и это были вещи, которые я пробовал и не смог.

QTWindow::QTWindow( )
{
    // Enable mouse tracking
    this->setMouseTracking(true);
}

void QTWindow::initializeGL()
{
    // DEBUG
    debug("Init'ing GL");
    this->makeCurrent(); ///< Didn't help
    this->resizeGL(0, 0); ///< Didn't help
    glDisable(GL_CULL_FACE); ///< Didn't help
    glClearColor(1, 0, 1, 0);
}

void QTWindow::paintGL()
{
    // DEBUG
    debug("Painting GL");
    this->makeCurrent(); ///< Didn't help
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0,1,1);
    glBegin(GL_TRIANGLES);
    glVertex2f(500,100);
    glVertex2f(100,500);
    glVertex2f(0,0);
    glEnd();
    this->swapBuffers(); ///< Didn't help
}

void QTWindow::resizeGL(int width, int height)
{
    // DEBUG
    debug("Resizing GL");
    this->makeCurrent(); ///< Didn't help
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1000, 0, 1000, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

Треугольник вообще не отображается, даже если отсечение отключено. Однако все три журнала отладки называются именно так, как и должны быть.

Что мне не хватает?


person Qix - MONICA WAS MISTREATED    schedule 08.02.2013    source источник
comment
Итак, в основном вы получаете фиолетовый экран (в результате glClearColor и glClear), но нет рисования треугольника? Просто хочу уточнения...   -  person Aaron    schedule 08.02.2013
comment
Правильный. Я пробовал с квадрицепсами, и на данный момент я просто буквально пробую разные вещи без всякой рифмы или причины. Я удалил вызовы makeCurrent и заменил updateGL только на update. Еще ничего.   -  person Qix - MONICA WAS MISTREATED    schedule 08.02.2013


Ответы (2)


Попробуйте вызвать функцию glViewport() в самом начале функции QTWindow::resizeGL():

glViewport(0, 0, width, height);

И никогда не вызывайте resizeGL() с параметрами width и height равными 0 ;) Кроме того, вам не обязательно вызывать resizeGL() напрямую, как есть. вызывается Qt всякий раз, когда изменяется размер окна.

Вы можете удалить все вызовы функции swapBuffers() — она вызывается внутри Qt.

Функция makeCurrent() должна вызываться перед всеми другими вызовами GL, поэтому хорошо, что вы вызвали ее в initializeGL(), но вам не нужно вызывать ее в функции paintGL() (если только paintGL() не используется). вызывается из другого потока, но я уверен, что это не в вашем коде).

person Tomek    schedule 10.02.2013
comment
Все это было отладочным кодом, чтобы заставить что-то работать. Я понимаю, что resizeGL сделал с 0,0. Я знаю о glViewport. Я знаю о makeCurrent. Обо всем этом я упоминал в ОП. - person Qix - MONICA WAS MISTREATED; 11.02.2013

Проблема оказалась в версиях. Строка версии, возвращенная с glGetString(GL_VERSION), указывает на то, что используется контекст совместимости 4.2.

Поскольку вызовы треугольников в методе paintGL были удалены в 3.1 (если я правильно помню), было очевидно, почему они ничего не рисовали. Кроме того, никаких ошибок не выдавалось, потому что это было в совместимости. режим.

Поскольку я не мог получить версию ниже 3.0 в QGLWidget (из-за того, что QT требует 2.1, как мне сообщили на другой доске объявлений), я установил версию 3.0 и попытался использовать некоторые вызовы рисования 3.0, и это закончилось до работы.

person Qix - MONICA WAS MISTREATED    schedule 11.02.2013