Рисование большого количества пикселей в OpenGL - PullRequest
6 голосов
/ 06 ноября 2010

Я работал над некоторым кодом обработки звука, а сейчас я делаю некоторые визуализации. Я закончил делать спектрограмму спектрограмму , но как я рисую, она слишком медленная.

Я использую OpenGL для 2D-рисования, что затрудняет поиск помощи. Также я очень новичок в OpenGL, поэтому я не знаю, как все устроено.

Я храню значения r, g, b для каждого пикселя в большой матрице. Каждый раз, когда я получаю небольшой звуковой сегмент, я обрабатываю его и преобразую в столбец пикселей. Все смещено влево на 1 пиксель, а новая строка ставится в конце.

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

Есть ли лучший способ сделать это? Есть какой-то метод для простого смещения группы пикселей?

Ответы [ 4 ]

4 голосов
/ 06 ноября 2010

Это много способов улучшить скорость рисования.Простейшим было бы выделить RGB-текстуру, которую вы будете рисовать, используя текстурный квадрант с выравниванием по экрану.Каждый раз, когда вы хотите нарисовать новую линию, вы можете использовать glTexSubImage2d, чтобы загрузить новое подмножество текстуры и затем перерисовать квад.

1 голос
/ 01 июня 2012

Я знаю, что это старый вопрос, но.,.

Используйте круговой буфер для хранения пикселей, а затем просто дважды вызовите glDrawPixels с соответствующими смещениями.Примерно так, непроверенный C:

#define SIZE_X 800
#define SIZE_Y 600
unsigned char pixels[SIZE_Y][SIZE_X*2][3];
int start = 0;

void add_line(const unsigned char line[SIZE_Y][1][3]) {
    int i,j,coord=(start+SIZE_X)%(2*SIZE_X);
    for (i=0;i<SIZE_Y;++i) for (j=0;j<3;++j) pixels[i][coord][j] = line[i][0][j];
    start = (start+1) % (2*SIZE_X);
}
void draw(void) {
    int w;
    w = 2*SIZE_X-start;
    if (w!=0) glDrawPixels(w,SIZE_Y,GL_RGB,GL_UNSIGNED_BYTE,3*sizeof(unsigned char)*SIZE_Y*start+pixels);
    w = SIZE_X - w;
    if (w!=0) glDrawPixels(SIZE_X,SIZE_Y,GL_RGB,GL_UNSIGNED_BYTE,pixels);
}
1 голос
/ 06 ноября 2010

GL_POINTS, VBO , GL_STREAM_DRAW.

1 голос
/ 06 ноября 2010

Возможно, вы передаете намного больше данных на видеокарту, чем у вас есть пиксели? Это может произойти, если ваш размер FFT намного больше, чем высота области рисования, или число спектральных линий намного больше, чем ее ширина. Если это так, возможно, что горлышко бутылки могло передавать слишком много данных через шину. Попробуйте уменьшить количество спектральных линий, усредняя их или выбирая (беря максимум в каждом бине для набора последовательных линий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...