Russian Qt Forum
Ноябрь 24, 2024, 15:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: OpenGL мерцает под VIsta не рисует под Win 7  (Прочитано 6197 раз)
@!!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 ничего не рисуется кроме шрифтов.

Что может быть не так??
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Сентябрь 20, 2010, 09:46 »

по-моему update() не надо (по идее, он вызовет рекурсивную перерисовку, возможно в этом причина)
да и не мешало всё-таки ресайз и инит настроить:)
Записан
@!!ex
Гость
« Ответ #2 : Сентябрь 20, 2010, 11:32 »

А каким способом кроме update можно сделать постоянную перерисовку?
Вроде бы repaint вызывает перерисовку немедленно, а update - сначала обрабатывает все другие события?

что нужно сделать в init и resize?
Я думал QPainter делает все что нужно?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Сентябрь 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();
}
Записан
@!!ex
Гость
« Ответ #4 : Сентябрь 20, 2010, 12:01 »

Установка матриц и вьюпорта не нужна. QPainter ставит свою. Тоже самое с ресайзом.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Сентябрь 20, 2010, 12:09 »

да, либо за 2 года что-то изменилось, либо я просто не видел этого в доке. В любом случае, в моей проге пейнтер нафиг не нужен.
да, согласен, инит и ресайз не надо. А вот апдейт таки курите
Записан
@!!ex
Гость
« Ответ #6 : Сентябрь 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();
}
Записан
@!!ex
Гость
« Ответ #7 : Сентябрь 20, 2010, 14:09 »

А ларчик просто открывался...
на семерке просто надо было установить последние дрова, с поддержкой OGL шейдеров(DX работал нормально, что меня и сбило).
После этого начало мерцать также как и на Висте.
Тут тоже просто:
setAutoFillBackground(false);
Почему не мерцало на ХР? не знаю...
Записан
@!!ex
Гость
« Ответ #8 : Сентябрь 20, 2010, 14:24 »

Кстати, комментарий насчет использования таймера был правильным.
update не работает как надо на Висте и Семерке. а repaint использовать нельзя, т.к. он ведет к рекурсивной перерисовке.
В итоге и пришлось делать на таймере.
Записан
ufna
Гость
« Ответ #9 : Сентябрь 20, 2010, 19:06 »

а можно скомпилированный пример и минимальный рабочий код с этим багом? Сколько работал с OGL и Qt ничего такого не было.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.