2010-11-06 2 views
6

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

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

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

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

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

+7

Почему бы не построить растровое изображение из вашей спектрограммы, а затем использовать растровое изображение в качестве текстуры для gl quad? – 2010-11-06 01:57:11

ответ

3

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

+0

Хорошо, я понял, и вроде как это сделал. Одна вещь, о которой я забыл упомянуть, это то, что мои значения пикселей хранятся в круговом буфере, что делает вещи немного более сложными, но с этим можно справиться. Я создаю текстуру из всех пикселей каждый раз, когда добавляю строку, а затем соответствующим образом сопоставляю ее с квадом. Я могу легко обрабатывать смещение от кругового буфера, используя пару дополнительных сопоставлений в квадранте. Его далеко не оптимальный, но он намного быстрее, чем у меня раньше. – MattRS

1

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

+0

Хороший совет, но я уже справляюсь с этим. Эта проблема была моим крайне неэффективным методом рисования. – MattRS

1

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

Используйте круговой буфер для хранения пикселей, а затем просто дважды вызовите 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); 
} 
Смежные вопросы