2014-10-28 60 views
2

我正试图找到一种聪明的方式来渲染大的谱图(比如全屏)。谱图是一个坐标系,其中x轴是时间,y轴是频率,颜色强度是频率分量的大小,它看起来很有意思的是每帧,一个新的列(1个像素宽)是新的,,但整个其余的光谱是相同的,只移动左边的一个像素。目前,我只是写了一个像图像一样的循环软件缓冲区,然后绘制该缓冲区 - 但在高帧率和屏幕大小时显然很慢。高效渲染谱图的可视化

是否有任何明显的解决这个问题,使用OpenGL(或一些软件技巧 - 必须跨平台,虽然)?也许通过在GPU内存上使用缓冲区,使用填充它的着色器(不可否认,除了绘制简单的东西外,我对OpenGL有一个非常模糊的理解)?它围绕着保持GPU内存上的旧数据,我看到它。

+0

要计算FFT的源数据集有多大?自从OpenGL支持VBO之后,您可以使用OpenCL来转换数据并将其作为OpenGL纹理吐出。将数据推送到GPU可能会很昂贵。 – BlamKiwi 2014-10-28 22:49:56

+0

最坏的情况是60 fps * 65536个样本。我想将DSP部分保留在CPU上,因为我也对数据进行了插值和分析--FFT也不是我使用的唯一算法。 – Shaggi 2014-10-28 23:11:33

回答

4

为瀑布使用单通道纹理(这是您正在绘制的图形,瀑布图),其中使用glTexSubImage一次更新一列或一行。通过使用GL_WRAP模式,您可以简单地将纹理坐标超出纹理的边界并将其包裹。通过移动与更新相对的纹理,您可以获得瀑布效果(即移动光谱图,更新进入右边缘)。

要使整个事物具有色彩,请使用纹理的值作为使用片段着色器的传递函数LUT纹理的索引。

+0

只是要确定:这是我的瀑布图的想法:http://cdn.head-fi.org/5/50/5072c8ae_colby.txt.jpeg而我想绘制的是完全一样的:http:///upload.wikimedia.org/wikipedia/commons/c/c5/Spectrogram-19thC.png 你在描述哪一个? – Shaggi 2014-10-28 23:22:33

+1

真的无论哪种方式。您可以通过对顶点着色器中的纹理进行采样并使用它来偏移输入顶点的Z坐标来生成3D图。 – genpfault 2014-10-29 00:02:39

+0

@Shaggi:我的意思是你想画什么。 – datenwolf 2014-10-29 08:37:56