Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QGLWidget сохранить уже отрисованное для следуюущего кадра
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
soaup
У меня нарисовалась линия через вершины и glDrawArrays. Можно мне ее сохранить, потом сместить вниз по Y, и нарисовать еще одну линию в месте где она была в прошлом кадре. И потом постоянное так - новые линии рисуются, старые уходят вниз.
lanz
Храните все линии в массиве, каждый кадр смещать точки по Y и перерисовывать. OpenGL и так перерисовывает все каждый кадр, поэтому проблем не должно быть.
soaup
Цитата(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
Можно тогда рисовать в framebuffer object http://qt-project.org/doc/qt-4.8/qglframebufferobject.html
Потом из него получать текстуру и рисовать ее со смещением вниз на 1 пиксель.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.