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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Копирование данных а не отрисовка в paintGL  (Прочитано 11235 раз)
Acrobat
Гость
« : Март 26, 2016, 12:01 »

Добрый день. Есть ли возможно один раз нарисовать, а после при отработки события paintGL просто копировать данные в видеопамять и всё ? Как это организовать?

А вообще ещё такой вопрос. Есть код который выводит графику с помощью QPainter, можно ли как нибудь заставить его рисовать с помощью openGL. Или придётся всё переписывать?
« Последнее редактирование: Март 26, 2016, 12:05 от Acrobat » Записан
Sahsa
Гость
« Ответ #1 : Май 05, 2016, 07:31 »

Я конечно мало знаком о opengl, но что если тебе использовать буфер?)
Записан
Acrobat
Гость
« Ответ #2 : Май 05, 2016, 10:03 »

Знакомо. Я так и делаю, используя QPainter. Я тоже не знаком с опенГЛ, но знаю, что концепция с использованием массивов вершин значительно ускоряем процесс отрисовки чем обычное копирование с заднего буфера на передний, я не прав?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 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 колоссальна, перед тем как затевать буфера и.т.п. убедитесь что "игра стоит свеч"
Записан
Acrobat
Гость
« Ответ #4 : Май 05, 2016, 10:41 »

Спасибо огромное за подробны ответ. Я ещё в прострации нахожусь, но думаю вы правы надо переходить к конкретитике. Вот ещё такой вопрос. Как правильнее организовать рисование графика с помощью openGL и вершин. Должен быть массив вершин, который отвечает за отрисовку осей, массив вершин который отвечает за отрисовку полигона, массив вершин для закраски фона и тд. Как использовать

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

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

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 05, 2016, 10:57 »

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

Спасибо за ответ. А не сильно ли будет геморройно использовать QPainter с GL, ведь paintEvent() для QPainter  и другой для GL.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 05, 2016, 11:47 »

А не сильно ли будет геморройно использовать QPainter с GL, ведь paintEvent() для QPainter  и другой для GL.
Нет, для QOpenGLWidget рисование одно в paintGL, там и используйте QPainter после вызовов glXXX (есть пример в доке Qt, кажется как-то "overpaint").
Записан
Acrobat
Гость
« Ответ #8 : Май 05, 2016, 11:50 »

Спасибо за ответ. А  не подскажите, можно ли на QT написать компонент ActiveX, который можно будет использовать везде, т.е. на Visual c++, Borland c++, возможно другие.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Май 05, 2016, 23:55 »

Нет, для QOpenGLWidget рисование одно в paintGL, там и используйте QPainter после вызовов glXXX (есть пример в доке Qt, кажется как-то "overpaint").

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Acrobat
Гость
« Ответ #10 : Май 06, 2016, 00:22 »

Не вижу препятствий для смешивания. Если надо нарисовать пару линий и вывести текст, то можно позволить QPainter сделать это, не?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Май 06, 2016, 10:35 »

А  не подскажите, можно ли на QT написать компонент ActiveX, который можно будет использовать везде, т.е. на Visual c++, Borland c++, возможно другие.
Этого я не знаю. Кстати, одно их правил форума: "один топик - одна тема"  Улыбающийся

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #12 : Май 06, 2016, 13:44 »

Не вижу препятствий для смешивания. Если надо нарисовать пару линий и вывести текст, то можно позволить QPainter сделать это, не?

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Май 06, 2016, 14:50 »

Ну, если все это добро будет потом работать только на той одной конкретной машине, где оно было собрано - почему бы и нет. Но про переносимость можно забыть.
Не улавливаю ход мысли приведший к таким (печальным) выводам  Улыбающийся Вызовы QPainter все рано сводятся к вызовам OpenGL, так с какой стати это "вдруг перестанет работать"?

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


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