QGLWidget игнорирует glClear

Я в тупике. У меня есть виджет внутри основного окна приложения QT 4.6, которое было настроено как виджет openGL. Он рисует просто отлично, за исключением того, что я не могу очистить фон между кадрами. Я получаю черный фон, когда открывается окно, и он никогда не очищается после этого, поэтому со временем я получаю беспорядочную смесь визуализированных объектов. Мне также приходится вызывать swapBuffers() в конце функции paintGL(), чтобы виджет отображал самый последний кадр, что меня озадачило, поскольку у меня сложилось впечатление, что swapBuffers() вызывается автоматически. Я настроен на двойную буферизацию, и виджет не используется совместно. Вот соответствующий код:

void GLWidget::paintGL ( )
{
    m_Input.Draw();
    QGLWidget::swapBuffers();
}

void GLWidget::initializeGL ( )
{
    qglClearColor(QColor(0,0,255,128));
    glClear(GL_COLOR_BUFFER_BIT);
}

Кажется, что-то не так с двойной буферизацией. Очистка экрана до фонового цвета довольно проста. Но это сводит меня с ума, почему это не работает. Остальная часть кода рисования работает нормально. Любые идеи? (Это в системе Linux.)


person QuickGrip    schedule 07.12.2013    source источник


Ответы (1)


glClear — это операция рисования. Он принадлежит не initializeGL, а paintGL. Цвет очистки также должен быть установлен непосредственно перед вызовом glClear, поэтому переместите этот [q]glClearColor вперед.

Обновлять

Метод paintGL должен выглядеть так:

void GLWidget::paintGL()
{
    qglClearColor(QColor(0,0,255,128));
    glClear(GL_COLOR_BUFFER_BIT);
    // you probably also want to clear the depth and stencil buffers
    // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    m_Input.Draw();

    QGLWidget::swapBuffers();
}

Конечно, вы должны убедиться, что m_Input.Draw() снова ничего не испортит. Вы не показали код для этого, так что я здесь вслепую.

person datenwolf    schedule 07.12.2013
comment
Я это понимаю. glClear был перемещен повсюду. Независимо от того, где он находится (внутри glInitialize, glPaint или внутри процедур рисования), он игнорируется. Показанный код был основан на предположении, что, поскольку Qt выполняет много других рисунков, он перехватывает вызов glClear и делает это самостоятельно на основе того, что вы сказали ему в подпрограмме glInitialize. Эта идея тоже не удалась. - person QuickGrip; 07.12.2013
comment
@QuickGrip: Qt ничего не перехватывает, а glClear принадлежит методу paintGL. Я не могу сказать это лучше, но вы, вероятно, используете это неправильно. Порядок операций имеет значение, см. схему моего кода. - person datenwolf; 07.12.2013
comment
Как я уже упоминал выше, я попробовал точный код, который вы разместили. Это не работает. Я пробовал размещать glClear практически везде, где только можно. Это не имеет никакого эффекта, независимо от того, где оно вызывается, и в этом проблема. - person QuickGrip; 07.12.2013
comment
@QuickGrip: Когда вы говорите, что это не имеет эффекта, каков ваш желаемый результат и что вы получаете вместо этого? (скриншоты было бы здорово). Также было бы здорово увидеть код метода ???::Draw. - person datenwolf; 07.12.2013
comment
На данный момент я хотел бы очистить экран до цвета, указанного в glClearColor. Код в ::Draw просто устанавливает матрицы вида и рисует каркасную модель. Я мог бы опубликовать скриншот экрана, но все, что вы увидите, это черный фон с беспорядком линий от проволочной каркасной модели, которая рисуется и не очищается между кадрами. - person QuickGrip; 07.12.2013