Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: @!!ex от Сентябрь 20, 2010, 09:42



Название: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: @!!ex от Сентябрь 20, 2010, 09:42
Делаю OpenGL 2D проект.

Все рисуется через QPainter. Все связанное с OGL выглядит так:
Код:
void cGLCanvas::initializeGL()
{

}

void cGLCanvas::resizeGL(int nWidth, int nHeight)
{

}

void cGLCanvas::paintGL()
{
    qglClearColor(Qt::black);

    MainWidth = width();
    MainHeight = height();
    Engine->Draw(this);
    update();
}

Под XP работает отлично.
Пoд Mac OS X мерцает курсор.
Под Vista мирцает все.
Под Win 7 ничего не рисуется кроме шрифтов.

Что может быть не так??


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: Авварон от Сентябрь 20, 2010, 09:46
по-моему update() не надо (по идее, он вызовет рекурсивную перерисовку, возможно в этом причина)
да и не мешало всё-таки ресайз и инит настроить:)


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: @!!ex от Сентябрь 20, 2010, 11:32
А каким способом кроме update можно сделать постоянную перерисовку?
Вроде бы repaint вызывает перерисовку немедленно, а update - сначала обрабатывает все другие события?

что нужно сделать в init и resize?
Я думал QPainter делает все что нужно?


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: Авварон от Сентябрь 20, 2010, 11:52
почитайте книжки по опенгл)
QPainter вообще мало связан с OpenGL. Кутешный огл - это ОБЫЧНЫЙ огл с добавлением разных удобств. В ините и ресайзе нужно писать функции инициализации ОГЛ и настройку вьюпорта соотетственно. Пример:
Код:
//
void CastleFight::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
if(h > 0)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, w/(GLfloat)h, 0.1, 1000);
}
}
Метод PaintGL вызывается только когда сцену нужно перерисовать (например при ресайзе окна и тп). Если нужна анимация, то делайте апдейт по таймеру (правильная цепочка timer -> update -> paintGL. А у вас update->paintGL->update->...)
Пример пейнта:
Код:
void CastleFight::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
draw();
glFlush();
}


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: @!!ex от Сентябрь 20, 2010, 12:01
Установка матриц и вьюпорта не нужна. QPainter ставит свою. Тоже самое с ресайзом.


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: Авварон от Сентябрь 20, 2010, 12:09
да, либо за 2 года что-то изменилось, либо я просто не видел этого в доке. В любом случае, в моей проге пейнтер нафиг не нужен.
да, согласен, инит и ресайз не надо. А вот апдейт таки курите


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: @!!ex от Сентябрь 20, 2010, 12:28
Задача вобщем-то простая:
2Д игра, с кучей прозрачных картинок, градиентов и прочей шушеры.
Рисоваться должно хотя бы кадров 25 в секунду.

Если отрубаю OGL и рисую на обычном виджете - все ок, но тормозит адски.
Если включаю OGL, то на висте мерцает, на семерке вообще ничего не работает.

Код:
cGLCanvas::cGLCanvas(QWidget *parent) :
    QGLWidget(parent)
{
    connect( &m_Timer, SIGNAL(timeout()), this, SLOT(onTimer()));
    m_Timer.start( 40);
}

void cGLCanvas::paintGL()
{
    MainWidth = width();
    MainHeight = height();
    Engine->Draw(this);
}

void cGLCanvas::onTimer(){
    updateGL();
}


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: @!!ex от Сентябрь 20, 2010, 14:09
А ларчик просто открывался...
на семерке просто надо было установить последние дрова, с поддержкой OGL шейдеров(DX работал нормально, что меня и сбило).
После этого начало мерцать также как и на Висте.
Тут тоже просто:
setAutoFillBackground(false);
Почему не мерцало на ХР? не знаю...


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: @!!ex от Сентябрь 20, 2010, 14:24
Кстати, комментарий насчет использования таймера был правильным.
update не работает как надо на Висте и Семерке. а repaint использовать нельзя, т.к. он ведет к рекурсивной перерисовке.
В итоге и пришлось делать на таймере.


Название: Re: OpenGL мерцает под VIsta не рисует под Win 7
Отправлено: ufna от Сентябрь 20, 2010, 19:06
а можно скомпилированный пример и минимальный рабочий код с этим багом? Сколько работал с OGL и Qt ничего такого не было.