Russian Qt Forum

Qt => OpenGL => Тема начата: Acrobat от Март 26, 2016, 12:01



Название: Копирование данных а не отрисовка в paintGL
Отправлено: Acrobat от Март 26, 2016, 12:01
Добрый день. Есть ли возможно один раз нарисовать, а после при отработки события paintGL просто копировать данные в видеопамять и всё ? Как это организовать?

А вообще ещё такой вопрос. Есть код который выводит графику с помощью QPainter, можно ли как нибудь заставить его рисовать с помощью openGL. Или придётся всё переписывать?


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Sahsa от Май 05, 2016, 07:31
Я конечно мало знаком о opengl, но что если тебе использовать буфер?)


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Acrobat от Май 05, 2016, 10:03
Знакомо. Я так и делаю, используя QPainter. Я тоже не знаком с опенГЛ, но знаю, что концепция с использованием массивов вершин значительно ускоряем процесс отрисовки чем обычное копирование с заднего буфера на передний, я не прав?


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Igors от Май 05, 2016, 10:31
Знакомо. Я так и делаю, используя QPainter. Я тоже не знаком с опенГЛ, но знаю, что концепция с использованием массивов вершин значительно ускоряем процесс отрисовки чем обычное копирование с заднего буфера на передний, я не прав?
Правы, но надо подходить более конкретно. Псевдокод
Код
C++ (Qt)
// вариант 1
glBegin(...);
glVertex(..);
..
glEnd();
 
// вариант 2
glDrawArrays(...);
// или
glDrawElements(...);
 
// вариант 3
painter.fillRect(..);  // QOpenGLWidget
 
Вариант 2 может оказаться в десятки раз (а то и больше) быстрее, особенно с использованием VBO/VAO. Но он требует чтобы данные были подготовлены "как положено". Вариант 1 этого не требует, данные можно брать как угодно, но и скорость куда хуже, поэтому он давно признан deprecated. И наконец вариант 3 сводится к варианту 1, но скорость еще хуже т.к. есть обвязки painter'а. Зато он совместим с "обычным" (CPU) рисованием и не требует никаких переделок.

Вообще мощность GPU колоссальна, перед тем как затевать буфера и.т.п. убедитесь что "игра стоит свеч"


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Acrobat от Май 05, 2016, 10:41
Спасибо огромное за подробны ответ. Я ещё в прострации нахожусь, но думаю вы правы надо переходить к конкретитике. Вот ещё такой вопрос. Как правильнее организовать рисование графика с помощью openGL и вершин. Должен быть массив вершин, который отвечает за отрисовку осей, массив вершин который отвечает за отрисовку полигона, массив вершин для закраски фона и тд. Как использовать

Код:
// вариант 2
glDrawArrays(...);
// или
glDrawElements(...);

для отрисовки нескольких массивов вершин или ... Вы меня поняли?



Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Igors от Май 05, 2016, 10:57
Как правильнее организовать рисование графика с помощью openGL и вершин. Должен быть массив вершин, который отвечает за отрисовку осей, массив вершин который отвечает за отрисовку полигона, массив вершин для закраски фона и тд.
Если тех осей/закрасок с гулькин нос (десяток, ну сотня), то я бы не заморачивался а рисовал бы их со всеми удобствами (QPainter). Вот сами точки графика - другое дело, их потенциально может быть "много". Для них прямо-таки напрашивается glDrawArrays, для этого точки должны лежать "линейно" в векторе, напр так
Код
C++ (Qt)
QVector<QPointF> points;
Что несложно обеспечить. Подробнее курите доку по glDrawArrays


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Acrobat от Май 05, 2016, 11:00
Спасибо за ответ. А не сильно ли будет геморройно использовать QPainter с GL, ведь paintEvent() для QPainter  и другой для GL.


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Igors от Май 05, 2016, 11:47
А не сильно ли будет геморройно использовать QPainter с GL, ведь paintEvent() для QPainter  и другой для GL.
Нет, для QOpenGLWidget рисование одно в paintGL, там и используйте QPainter после вызовов glXXX (есть пример в доке Qt, кажется как-то "overpaint").


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Acrobat от Май 05, 2016, 11:50
Спасибо за ответ. А  не подскажите, можно ли на QT написать компонент ActiveX, который можно будет использовать везде, т.е. на Visual c++, Borland c++, возможно другие.


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Racheengel от Май 05, 2016, 23:55
Нет, для QOpenGLWidget рисование одно в paintGL, там и используйте QPainter после вызовов glXXX (есть пример в доке Qt, кажется как-то "overpaint").

Покажите мне хоть одну современную машину, на которой этот пример работает :)
Мешать кутишный паинтер и opengl - это как к москвичу приклеить крылья из соломы и верить, что он полетит.


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Acrobat от Май 06, 2016, 00:22
Не вижу препятствий для смешивания. Если надо нарисовать пару линий и вывести текст, то можно позволить QPainter сделать это, не?


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Igors от Май 06, 2016, 10:35
А  не подскажите, можно ли на QT написать компонент ActiveX, который можно будет использовать везде, т.е. на Visual c++, Borland c++, возможно другие.
Этого я не знаю. Кстати, одно их правил форума: "один топик - одна тема"  :)

Покажите мне хоть одну современную машину, на которой этот пример работает :)
Мешать кутишный паинтер и opengl - это как к москвичу приклеить крылья из соломы и верить, что он полетит.
Когда я его пробовал - работал, с новыми версиями Qt не проверял. Мой код с использованием QPainter работает. Хотя была пара неприятных моментов, после некоторых вызовов glXXX пайнтер затыкался - но отловил.


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Racheengel от Май 06, 2016, 13:44
Не вижу препятствий для смешивания. Если надо нарисовать пару линий и вывести текст, то можно позволить QPainter сделать это, не?

Ну, если все это добро будет потом работать только на той одной конкретной машине, где оно было собрано - почему бы и нет. Но про переносимость можно забыть.


Название: Re: Копирование данных а не отрисовка в paintGL
Отправлено: Igors от Май 06, 2016, 14:50
Ну, если все это добро будет потом работать только на той одной конкретной машине, где оно было собрано - почему бы и нет. Но про переносимость можно забыть.
Не улавливаю ход мысли приведший к таким (печальным) выводам  :) Вызовы QPainter все рано сводятся к вызовам OpenGL, так с какой стати это "вдруг перестанет работать"?

Тыкнул "overpainting" (Qt 5.4.2) - нормально, правда он сейчас уже legacy. Ну хорошо, вот посвежее qopenglwodget, тоже рисует текст поверх через QPainter - нормально. Думается если б эти примеры не ходили - вой был бы такой что услышали.