2010-12-15 67 views
1

我想用OpenGL的混合兩個(或更多)16位音頻流,我需要一點幫助混合音頻使用的OpenGL

基本上就是我想要做的是把音頻數據轉換成紋理,我提請一個幀緩衝區對象,然後回讀。這不是一個問題,但是提供正確結果的數據的方式會有點問題。

我基本上有兩個問題。

  1. 爲了通過繪圖混合數據我需要使用混合(alpha = 0.5),但是結果不應該有任何alpha通道。所以如果我渲染到例如格式爲RGB的幀緩衝區將會像我期望的那樣繼續工作,並且生成的alpha將不會寫入fbo? (我想避免讀回FBO每個渲染通道)

質地| SR | SG |膽紅|

framebuffer(before)| dR | dG | dB | (後) | dR * 0.5 + sR * 0.5 | dG * 0.5 + sG * 0.5 | dB * 0.5 + sB * 0.5 |

  1. 音頻樣本被標記爲16位整數值。這種方式可以做簽名計算嗎?或者我需要首先將值轉換爲無符號的CPU,繪製它們,然後使它們再次在CPU上簽名?

編輯:

我有點不清楚。我的硬件僅限於OpenGL 3.3硬件。我寧願不使用CUDA或OpenCL,因爲我習慣使用OpenGL來處理其他內容。

每個音頻採樣將以單獨遍歷的方式呈現,這意味着它必須與已經渲染到幀緩衝區的內容「混合」。問題是如何將像素着色器的輸出寫入幀緩衝區(據我所知,此混合無法通過可編程着色器訪問,而且必須使用glBlendFunc)。

EDIT2:

每個音頻樣本將在不同的道次來呈現,因此,只有一個音頻樣本將在着色器的時間,這意味着它們需要在FBO被累積可用。

foreach(var audio_sample in audio_samples) 
    draw(audio_sample); 

for(int n = 0; n < audio_samples.size(); ++n) 
{ 
     glActiveTexture(GL_TEXTURE0 + n); 
     glBindTexture(audio_sample); 
} 
draw_everything(); 

回答

1
  1. 即使目標緩衝區沒有alpha,你也應該能夠進行混合。也就是說,渲染到非冪次方(rgb16 = 6bytes/pixel)通常會導致性能損失。

  2. 簽名不是您的典型渲染目標格式,但它確實存在於OpenGL 4.0規範中(表3.12,稱爲RGB16_SNORM或RGB16I,具體取決於您是否需要規範化表示)。

作爲一個方面說明,你也有glBlendFunc(GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT_ALPHA)甚至沒有指定一個alpha每像素。儘管如此,這可能不適用於所有的GL實現。

4

坦率地說,你爲什麼不只是使用該可編程像素着色器?

您是否必須使用OpenGL 1 Fixed Functionality Pipeline?

我只想用一個可編程着色器來處理帶符號的16位灰度線性紋理。

編輯:

foreach(var audio_sample in audio_samples) 
blend FBO1 + audio_sample => FBO2 
swap FBO2, FBO1 

它應該是一樣快,如果不是更快(感謝流管道)。

+0

像素着色器可能會有用。然而,問題在於我如何從像素着色器正確寫入幀緩衝區得到結果,因爲它「應該」與幀緩衝區中已有的內容混合在一起。也許我有點不清楚。但是每個「音頻樣本」都會以單獨的通行證呈現。所以我只能在着色器中訪問它。 – ronag 2010-12-15 14:59:43

+2

您可以將像素着色器呈現到PBO或FBO中,而不必打擾PBO的Alpha通道(您可以禁用它們並直接通過着色器混合兩個紋理) – qdot 2010-12-15 15:04:40

+0

是的,但我無法訪問更多比着色器中的一個紋理更復雜,因爲每個音頻採樣都將以不同的遍數呈現。他們需要在FBO中經過傳球積累。 – ronag 2010-12-15 15:11:11

2

我同意QDot。但是,您能否告訴我們您正面臨的硬件限制?如果你有合理的現代硬件,我甚至可以建議去CUDA或OpenCL路線,而不是通過OpenGL。

+0

編輯我的文章。 – ronag 2010-12-15 15:03:44

+0

是否有真正令人信服的理由通過OpenGL?你需要與特定的東西進行交互嗎? – Bart 2010-12-15 15:31:23

+0

那麼主要原因是我不想在不需要的情況下添加其他依賴項......看起來這並不合理,因爲OpenCL只是爲了這個......特別是如果我可以用OpenGL來完成這項工作,廣泛地在我的項目中。 – ronag 2010-12-15 23:20:23