crossplatform.ru

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

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


Новичок


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

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




Репутация:   0  


У меня нарисовалась линия через вершины и glDrawArrays. Можно мне ее сохранить, потом сместить вниз по Y, и нарисовать еще одну линию в месте где она была в прошлом кадре. И потом постоянное так - новые линии рисуются, старые уходят вниз.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 1.8.2014, 19:55
Сообщение #2


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

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

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




Репутация:   8  


Храните все линии в массиве, каждый кадр смещать точки по Y и перерисовывать. OpenGL и так перерисовывает все каждый кадр, поэтому проблем не должно быть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soaup
  опции профиля:
сообщение 2.8.2014, 8:47
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(lanz @ 1.8.2014, 19:55) *
Храните все линии в массиве, каждый кадр смещать точки по Y и перерисовывать. OpenGL и так перерисовывает все каждый кадр, поэтому проблем не должно быть.

Так как я не все знаю в OpenGL и по этой теме не нашел туториалов, не понимаю как это можно сделать. Не знаю линии или нет, но я храню данные, по которым я рисую линии, в контейнере. Последовательность данных приходят в виде QByteArray. Если число элементов в контейнере превысило некое число, то последний элемент удаляется. И потом для каждого массива из контейнера я расcчитываю и вершины и цвета:
void glwindow::sendSignal(QByteArray &bd) {
    sonoL.prepend(bD); //Поместить пакет в начало контейнера
    updateGL();
}
 
void glwindow::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    int j = 50;
    foreach (QByteArray i, sonoL)
    {
        getVertexSono(i, j);
        getColorSono(i);
        drawSono();
        ++j;
    }
    if (sonoL.count() > this->height()-50)
        sonoL.removeLast(); //Удалять последний
}
 
void glwindow::getVertexSono(QByteArray &bd, int y)
{
    for (int i=0; i<bd.size(); i++)
    {
        VertexSono[i][0] = i;
        VertexSono[i][1] = y;
    }
}
 
void glwindow::getColorSono(QByteArray &bd)
{
    for (int i=0; i<bd.size(); i++)
    {
        ColorSono[i][0] = bd.at(i);
        ColorSono[i][1] = bd.at(i);
        ColorSono[i][2] = bd.at(i);
    }
}
//Функция рисования
void glwindow::drawSono() {
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_INT, 0, &VertexSono);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, &ColorSono);
    glDrawArrays(GL_LINE_STRIP_ADJACENCY, 0, len_view);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
}

Т.е. получается некий рисунок – нарисовалась линия, ушла на 1 пиксель вниз, на ее освободившемся месте нарисовалсь новая линия, потом эти две сместились вниз и по новой.
Каждый раз, как что-то приходит – я расчитываю все координаты вершин и цвета по новой. Дело в том что массивы которые уже отрисовались мне по-хорошему не нужно было-бы перерасчитывать, но нужно сместить уже отрисованные линии по Y вниз. А потом рассчитать новую линию и поместить ее в верх виджета.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 2.8.2014, 12:13
Сообщение #4


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

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

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




Репутация:   8  


Можно тогда рисовать в framebuffer object http://qt-project.org/doc/qt-4.8/qglframebufferobject.html
Потом из него получать текстуру и рисовать ее со смещением вниз на 1 пиксель.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 23.7.2025, 18:56