Короткий ответ:
На большинстве платформ состояние вашего резервного буфера не определено после выполнения замены буфера. Вы можете найти более подробную информацию здесь. а>. Следовательно, вы не можете полагаться на то, что поведение вашего буфера останется таким, каким вы его оставили до операций подкачки. Затем, чтобы убедиться, что ваша программа является кросс-платформенной, у вас нет другого выбора, кроме как вызывать glClear()
при каждом рисовании.
На практике:
Возможно, ваша платформа/конфигурация гарантирует, что ваш буфер не изменится, или не гарантирует этого, но на практике это все еще имеет место. Если вы знаете, что находитесь в этих случаях после экспериментов (см. ниже), но ваш экран по-прежнему становится черным, это означает, что каким-то образом в вашем коде вы сделали что-то «неправильное», что заставляет Qt явно вызывать glClear()
со своим собственным glClearColor()
.
Вы можете использовать этот код, чтобы увидеть, остается ли буфер неизменным после swapBuffers(). На самом деле это так в моей конфигурации: Qt 4.8 на 64-битном Linux:
// -------- main.cpp --------
#include <QApplication>
#include "GLWidget.h"
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
GLWidget * w = new GLWidget();
w->show();
return app.exec();
}
// -------- GLWidget.h --------
#include <QGLWidget>
#include <QTimer>
class GLWidget: public QGLWidget
{
Q_OBJECT
public:
GLWidget() : i(0), N(60)
{
timer.setInterval(16);
connect(&timer, SIGNAL(timeout()),
this, SLOT(animationLoop()));
timer.start();
}
protected:
void initializeGL()
{
glClearColor(1.0, 0.0, 0.0, 1.0);
}
void resizeGL(int w, int h)
{
glViewport(0, 0, (GLint)w, (GLint)h);
}
void paintGL()
{
bool test = false;
if(i<N)
{
if(test)
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
else
{
if(test)
{
glClearColor(0.0, 1.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
}
}
private slots:
void animationLoop()
{
i++;
if(i>2*N) i=0;
updateGL();
}
private:
int i, N;
QTimer timer;
};
если test == true
, то я всегда вызываю glClearColor()
, за которым следует glClear()
, но чередуя красный цвет и зеленый цвет каждую секунду. Я действительно вижу, как цвет переключается между красным и зеленым.
если test == false
, то glClearColor()
я вызываю только раз и навсегда в initializeGL()
. Затем в paintGL
я попеременно вызываю glClear()
или не вызываю его. Экран остается красным, т.е. никогда не становится черным (и не отображает единорога), даже если glClear()
не вызывается.
Следовательно, что касается вашей проблемы:
Либо ваша конфигурация отличается от моей (реализация swapBuffers предоставляется Qt и различается в зависимости от базовой оконной системы)
Или ваш код не работает.
Простой способ проверить: скомпилируйте мой код и посмотрите, воспроизводит ли он проблему. Если да, то вы находитесь в случае 1., и вы ничего не можете с этим поделать (можно считать багом Qt, скорее несоответствием, так как в документации нигде не указано правильное поведение). В противном случае вы находитесь в случае 2., и тогда вы должны предоставить больше своего кода, чтобы мы могли определить, в чем проблема.
person
Boris Dalstein
schedule
25.06.2013