Цитата(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 вниз. А потом рассчитать новую линию и поместить ее в верх виджета.