crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Рисование линии в OpenGl
soaup
  опции профиля:
сообщение 11.7.2014, 10:03
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 3.6.2014
Пользователь №: 4152

Спасибо сказали: 0 раз(а)




Репутация:   0  


Рисую через цикл линию из массива множетсва точек. Т.е.:
void glwindow::drawLine(QByteArray &bd, int y) { //bd - массив типа QByteArray
    glPointSize(1);
    glBegin(GL_POINTS);
    for (int j = 0; j < bd.size(); ++j) { //Для каждой точки из массива
        glColor3b(bd[j], bd[j], bd[j]); //Рисование точки, значение которой указывается как яркость
        glVertex2f(j, y); //Координаты точки
    }
    glEnd();
}


Есть контейнер содержащий несколько таких массивов точек. Такая функция вызывается в paintGL в цикле, где все массивы из контейнера отрисовываются.
Рисование множества таких линий отнимает довольно много производительности. Можно ли это как то по другому делать, более оптимизированным способом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 11.7.2014, 12:39
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Не очень понятно, в массиве заданы координаты ломаной линии или точек одной линии?
Для рисования одной линии целиком
glBegin(GL_LINES);
    glVertex2f(x1,y1);
    glVertex2f(x2,y2);
glEnd();

Конечно, если точки или отрезки должны иметь разную яркость и т.д., то проще не получится, придётся рисовать по точкам.

Для визуального "ускорения" можно рисовать в бэкбуфере и потом выводить его, как текстуру, уже в видимый буфер.

Сообщение отредактировал Iron Bug - 11.7.2014, 12:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 11.7.2014, 21:32
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


glVertex* это Immediate mode, он довольно медленый.
http://stackoverflow.com/questions/6733934...-mean-in-opengl

Надо использовать glDrawElements/Arrays, будет значительно быстрее
https://www.opengl.org/sdk/docs/man2/xhtml/...rawElements.xml
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soaup
  опции профиля:
сообщение 15.7.2014, 6:27
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 3.6.2014
Пользователь №: 4152

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 11.7.2014, 13:39) *
Не очень понятно, в массиве заданы координаты ломаной линии или точек одной линии?

В массиве QByteArray у меня 6656*8 байтов, каждый из которых нужно нарисовать как точку, используя значение байта как цвет.

Цитата(lanz @ 11.7.2014, 22:32) *
glVertex* это Immediate mode, он довольно медленый.
http://stackoverflow.com/questions/6733934...-mean-in-opengl

Надо использовать glDrawElements/Arrays, будет значительно быстрее
https://www.opengl.org/sdk/docs/man2/xhtml/...rawElements.xml

Не совсем понятно, как это можно сделать, если у меня массив QByteArray, а в нем 6656*8 байтов. Как мне эти байты использовать в качестве вершин?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 18.7.2014, 18:26
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Вот здесь практически все есть:
http://ogldev.atspace.co.uk/www/tutorial02/tutorial02.html
Надо только с аттрибутами правильно определится. Очень хороший туториал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.4.2024, 5:08