Название: Рисование множества точек с OpenGL Отправлено: soaup от Июль 16, 2014, 06:00 Здравствуйте! Нужна помощь! Имеется виджет QGLWIdget. Рисую, с его помощью, через цикл, линию из массива множество точек. При этом массив для отрисовки поступает раз в пол-секунды примерно (данные приходят по сети). И я рисую сначало последнюю линию, а также все предыдущие, ниже чем текущую. Предыдущие массивы для отрисовки помещаю в контейнер QLinkedList, а потом в цикле отрисовываю все элементы из контейнера. Задал, чтобы максимум элементов в контейнере было 130 (так лучше видно всю картину). Т.е. в итоге:
Код: QLinkedList <QByteArray> B; Отправляю в виджет данные для отрисовки вызовом фунции sendBD, которая выглядит вот так: Код: void glwindow::sendBD(QByteArray &bd) { Пакеты данных у меня очень обьемные - 53248 байтов в массиве QByteArray. Значение каждого байта принимается за цвет точки для рисования. Когда придет примерно 50 пакетов, скорость работы снижается. Когда придут все пакеты, все это весьма тормозит. На OpenGL. Следовательно, вопрос - OpenGL для подобных целей (отрисовка больших обьемов данных) подходит лучше всего, если для меня принципиален вопрос скорости? Лучше paintEvent например? И можно ли это оптимизировать? У меня в планах находиться провести децимацию массива, но есть ли еще какие-нибудь способы чисто со стороны OpenGL? Название: Re: Рисование множества точек с OpenGL Отправлено: Hrundel от Июль 16, 2014, 09:49 Нужно передавать массив точек в функцию glDrawElements - будет быстрее
Код
Название: Re: Рисование множества точек с OpenGL Отправлено: Hrundel от Июль 16, 2014, 09:55 и вот еще что
http://ru.wikipedia.org/wiki/Vertex_Buffer_Object Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 16, 2014, 10:07 Натыкался на эту функцию, но не знал как ее применять. Функция применяется сразу для всего массива? И что писать в index?
Название: Re: Рисование множества точек с OpenGL Отправлено: navrocky от Июль 16, 2014, 10:17 А зачем тут вообще OpenGL ?
Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 16, 2014, 10:22 Мне нужна максимальная скорость работы при большом объеме данных. Я слышал, что OpenGL обладает большой производительностью.
Название: Re: Рисование множества точек с OpenGL Отправлено: Igors от Июль 16, 2014, 10:27 Тюкать "точка за точкой" - эта техника устарела уже лет 10 назад. Конечно рисуется массивами. Индексов у Вас не видно, поэтому glDrawArrays
Код При этом points и colors должны быть линейными массивами (напр вектора). Спецификацию OpenGL читайте, этого никто не отменял Название: Re: Рисование множества точек с OpenGL Отправлено: navrocky от Июль 16, 2014, 14:14 Мне нужна максимальная скорость работы при большом объеме данных. Я слышал, что OpenGL обладает большой производительностью. Не уверен, что в 2D будет какое-то преимущество, одна 2D-линия - это отрисовка двух треугольников. Во всяком случае, я не видел, чтобы программа ускорялась от перехода с растра на OpenGL. Ускорение обычно достигается за счет отрисовки масштабированных картинок. Хотя если пойти другим путём и писать на шейдерах, то тогда, я думаю, ты сможешь добиться высокой производительности. Вот, к примеру, как это делается в QtQuick http://qt-project.org/doc/qt-5/qtquick-scenegraph-graph-example.html Название: Re: Рисование множества точек с OpenGL Отправлено: Igors от Июль 16, 2014, 17:28 Не уверен, что в 2D будет какое-то преимущество, одна 2D-линия - это отрисовка двух треугольников. Укажите первоисточник таких таинственных/мистических заявлений. Никогда не слышал о том что линия рисуется 2-мя треугольниками ???... Ускорение обычно достигается за счет отрисовки масштабированных картинок. Во всяком случае, я не видел, чтобы программа ускорялась от перехода с растра на OpenGL. Ожидаемое ускорение - на порядок и больше. Хотите проверим - выкладывайте простое растровое рисование точек/линийНазвание: Re: Рисование множества точек с OpenGL Отправлено: navrocky от Июль 16, 2014, 20:32 Не уверен, что в 2D будет какое-то преимущество, одна 2D-линия - это отрисовка двух треугольников. Укажите первоисточник таких таинственных/мистических заявлений. Никогда не слышал о том что линия рисуется 2-мя треугольниками ???... Ускорение обычно достигается за счет отрисовки масштабированных картинок. Во всяком случае, я не видел, чтобы программа ускорялась от перехода с растра на OpenGL. Ожидаемое ускорение - на порядок и больше. Хотите проверим - выкладывайте простое растровое рисование точек/линийПо поводу тормознутости 2D в OpenGL я сужу по моим наблюдениям. Вот несколько: 1) Всегда в графических пакетах типа 3DMax, blender, wireframe отрисовывался ощутимо тормознее, чем залитая фигура. (включенное аппаратное ускорение) 2) В Qt-шных примерах есть примеры, с QPainter поверх QGLWidget, оно, не смотря на ускорение через OpenGL работает тормознее растра, что видно на глаз. Быстрее только картинки масштабируются, что вполне логично. 3) В нетах тоже периодически всплывают такие темы, вот например: http://www.gamedev.ru/code/forum/?id=176940 По логике вещей сейчас производители железа стремятся к быстрой отрисовки треугольников, т.к. это базовый элемент в 3D графике. И 2D ускорение никого сейчас уже не волнует, скорее всего его выкинули из железа и эмулируют программно в драйвере. Хотя я не отрицаю, что существует и аппаратная поддержка рисования 2D фигур, не зря существует линейка Quadro, которая предназначена для работы с профессиональными графическими пакетами. Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 06:04 Igors Плохо понимаю что значит линейный массив, т.е. одномерный? или должен быть типа QVector? Пытаюсь пробелать это с одним массивом байтов QByteArray, QT мне говорит: ошибка: taking address of temporary.
Название: Re: Рисование множества точек с OpenGL Отправлено: Hrundel от Июль 17, 2014, 07:15 Одномерный массив, желательно определенный GL типом. Например, GLfloat как в следующем коде.
Код
Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 07:32 Ясно, спасибо! Вот еще вопрос, мне нужно получается если отправлять массив в котором значение каждого элемента это координата по y (x расставить автоматически по индексу элемента). А потом все точки с таким координатами отрисовать и соединить линиями. Такое можно сделать этим способом?
Название: Re: Рисование множества точек с OpenGL Отправлено: Igors от Июль 17, 2014, 08:01 Ясно, спасибо! Вот еще вопрос, мне нужно получается если отправлять массив в котором значение каждого элемента это координата по y (x расставить автоматически по индексу элемента). А потом все точки с таким координатами отрисовать и соединить линиями. Такое можно сделать этим способом? Так для этого есть специальный режим который сразу рисует линии последовательно по точкамКод
Одномерный массив, желательно определенный GL типом. Например, GLfloat как в следующем коде. Ну такой массив не создать если переменное число эл-тов. Проще всего std::vector или QVector, а можно и просто new. Главное чтобы в памяти это было "подряд" (а не разбросано в разныз местах). Напр QList здесь не годится Код
Название: Re: Рисование множества точек с OpenGL Отправлено: Old от Июль 17, 2014, 08:21 Напр QList здесь не годится Поэтому, лучше использовать vbo. Тогда и связанные списки сгодяться.Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 08:28 Подождите, а если у меня QByteArray bd, в нем записана последовательсть байтов которые мне нужно отрисовать. И я, до этого, к каждому байту через цикл обращался так - bd.at(i), то теперь мне через цикл надо перегнать все байты в массив GLFloat или QVector, и потом вызвать функцию, гду я укажу первый элемент?
Название: Re: Рисование множества точек с OpenGL Отправлено: Old от Июль 17, 2014, 08:36 Самое простое использовать, например, QVector<GLfloat> и на фход функции давать адрес первого элемента.
Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 09:04 Ну кажется что-то заработало, буду дальше разбираться. Всем спасибо! Не знаю, как тут на форуме плюсы ставить...
Название: Re: Рисование множества точек с OpenGL Отправлено: gil9red от Июль 17, 2014, 10:32 Ну кажется что-то заработало, буду дальше разбираться. Всем спасибо! Не знаю, как тут на форуме плюсы ставить... А вот никак и не поставить :) Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 11:35 Как бы рисуется, но что странно - рисуется только в области 1/10 всего виджета (весь рисунок сжимается раз в 10), причем какие бы настройки я бы не задавал в resizeGL, в glOrtho. Ставлю самые разные значения max x:
Код: void glsignal::resizeGL(int nWidth, int nHeight) { Код: void glsignal::drawLine() { До этого обьявлял GLfloat VertexArray[54000][2]. Отправляю данные отрисовки виджету функцией getVertexArray Код: void glsignal::getVertexArray(QByteArray &bd) Название: Re: Рисование множества точек с OpenGL Отправлено: Igors от Июль 17, 2014, 12:04 По поводу тормознутости 2D в OpenGL я сужу по моим наблюдениям. Вот несколько: В наблюдательности (и здравом смысле) Вам не откажешь, только иногда надо и самому лично разбираться - а не только по слухам :) В аттаче пример рисования 10к разноцветных линий, результаты- QWidget (рисование без OpenGL) = 4 fps - QGLWidget рисование c QPainter = 8 fps - QGLWidget рисование c OpenGL = 60 fps ВНИМАНИЕ: пример требует Qt сборки с opengl desktop. Невдобняк капитальный они сделали с тем ES :'( Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 12:27 Да, и я разобрался с прошлой проблемой, забыл добавить строчку glViewport(0, 0, (GLint)nWidth, (GLint)nHeight);
И последний вопрос на сегодня - хотелось бы знать, если мне нужно отрисовать линию из точек, у которых будет один и тот же y, меняться будет x (с 0 на 1 до некоего числа), и у каждой точки будет свой цвет, это какая функция больше подходит для этого? А еще - как организовывать массив цветов? Название: Re: Рисование множества точек с OpenGL Отправлено: Igors от Июль 17, 2014, 14:33 И последний вопрос на сегодня - хотелось бы знать, если мне нужно отрисовать линию из точек, у которых будет один и тот же y, меняться будет x (с 0 на 1 до некоего числа), и у каждой точки будет свой цвет, это какая функция больше подходит для этого? А еще - как организовывать массив цветов? "Вот я спрошу, ответят - и я быстренько сделаю. Зачем пробовать, думать, читать доки..". Так или нет? :)Не злоупотребляйте помощью форума, это не мамина сися :) Название: Re: Рисование множества точек с OpenGL Отправлено: soaup от Июль 17, 2014, 15:01 Тем не менее, я все таки сделал. Спасибо всем за помощь!
Название: Re: Рисование множества точек с OpenGL Отправлено: Hrundel от Июль 17, 2014, 23:47 ... Не знаю, как тут на форуме плюсы ставить... А вот никак и не поставить :) Слава Богу! Это же, ни какой-нибудь паршивый cyberforum. ;D ;D ;D |