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();
}

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

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

2

Решение

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

glViewport(0, 0, width, height);

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

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

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

0

Другие решения

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

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

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

0

По вопросам рекламы [email protected]