2010-11-06 88 views
6

我一直在研究一些聲音處理代碼,現在我正在做一些可視化。我完成了一個spectrogram光譜圖,但我如何繪製它太慢了。在OpenGL中繪製大量像素

我正在使用OpenGL做2D繪圖,這使得尋找幫助變得更加困難。另外我對OpenGL很新,所以我不知道標準的方法。

我存儲大矩陣中每個像素的r,g,b值。 每次我得到一個小的聲音片段,我會處理它並將其轉換爲像素列。一切都轉移到左邊的1個像素,並且新行放在最後。

每次我重畫,我循環設置顏色和繪製每個像素單獨,這似乎是一個可怕的低效率的方式來做到這一點。

有沒有更好的方法來做到這一點?是否有一些方法簡單地移動一堆像素?

+7

爲什麼不從你的光譜圖構造一個位圖,然後使用位圖作爲gl四邊形的紋理? – 2010-11-06 01:57:11

回答

3

他們有很多方法來提高你的繪圖速度。 最簡單的方法是分配一個RGB紋理,您將使用屏幕對齊的紋理四邊形進行繪製。 每次你想繪製一條新線,你可以使用glTexSubImage2d加載紋理的新子集,然後重繪四邊形。

+0

好吧,我想通了,有點這樣做。 我忘記提到的一件事是我的像素值存儲在一個循環緩衝區中,使得事情稍微有些挑戰,但可以處理它。 我每次添加一條線時,都會從所有像素創建一個紋理,然後用四邊形適當地映射它。我可以使用quad中的一對額外映射輕鬆處理循環緩衝區中的偏移量。 它遠非最佳,但它比我之前的要快得多。 – MattRS 2010-11-06 06:12:56

1

你可能會傳遞更多的數據到顯卡比你有像素?如果您的FFT尺寸遠大於繪圖區域的高度或者譜線數量比其寬度大得多,則可能會發生這種情況。如果是這樣,瓶頸可能會在公交車上傳遞太多數據。嘗試通過取平均值或拾取來減少譜線數量(每個箱中獲取一組連續線的最大值)。

+0

很好的建議,但我已經處理了。這個問題是我非常低效的繪圖方法。 – MattRS 2010-11-06 06:18:27

1

我知道這是一個老問題,但是。 。 。

使用循環緩衝區來存儲像素,然後使用適當的偏移調用glDrawPixelels兩次。類似這樣的未經測試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); 
}