我想用OpenGL的混合兩個(或更多)16位音頻流,我需要一點幫助混合音頻使用的OpenGL
基本上就是我想要做的是把音頻數據轉換成紋理,我提請一個幀緩衝區對象,然後回讀。這不是一個問題,但是提供正確結果的數據的方式會有點問題。
我基本上有兩個問題。
- 爲了通過繪圖混合數據我需要使用混合(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 |
- 音頻樣本被標記爲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();
像素着色器可能會有用。然而,問題在於我如何從像素着色器正確寫入幀緩衝區得到結果,因爲它「應該」與幀緩衝區中已有的內容混合在一起。也許我有點不清楚。但是每個「音頻樣本」都會以單獨的通行證呈現。所以我只能在着色器中訪問它。 – ronag 2010-12-15 14:59:43
您可以將像素着色器呈現到PBO或FBO中,而不必打擾PBO的Alpha通道(您可以禁用它們並直接通過着色器混合兩個紋理) – qdot 2010-12-15 15:04:40
是的,但我無法訪問更多比着色器中的一個紋理更復雜,因爲每個音頻採樣都將以不同的遍數呈現。他們需要在FBO中經過傳球積累。 – ronag 2010-12-15 15:11:11