我一直在研究一些声音处理代码,现在我正在做一些可视化。我完成了一个spectrogram频谱图,但我绘制它的速度太慢了。
我正在使用OpenGL进行2D绘图,这使搜索帮助变得更加困难。我也是OpenGL的新手,所以我不知道事情的标准方式。
我将每个像素的r,g,b值存储在一个大矩阵中。 每次我得到一个小的声音片段,我处理它并将其转换为像素列。一切都转移到左边1像素,新线放在最后。
每次重绘时,我都会循环设置颜色并单独绘制每个像素,这似乎是一种非常低效的方法。
有更好的方法吗?是否有一些方法可以简单地移动一堆像素?
答案 0 :(得分:4)
它们有很多方法可以提高您的绘图速度。 最简单的方法是使用屏幕对齐纹理四边形分配一个RGB纹理。 每次要绘制新行时,都可以使用glTexSubImage2d加载纹理的新子集,然后重绘四边形。
答案 1 :(得分:1)
您是否可能将更多数据传递给显卡而不是像素?如果您的FFT大小远远大于绘图区域的高度或者谱线的数量远大于其宽度,则可能会发生这种情况。如果是这样,瓶颈可能会在总线上传递过多数据。尝试通过平均或拾取来减少谱线的数量(在一组连续行中取每个仓的最大值)。
答案 2 :(得分:1)
GL_POINTS
,VBO,GL_STREAM_DRAW
。
答案 3 :(得分: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);
}