2010-12-15 10 views
1

を使用してオーディオをミキシング、私は、OpenGLを使用して2つ(またはそれ以上)の16ビットのオーディオストリームをミックスしたいと私は助けOpenGLの

のビットは、基本的に私が何をしたいのか、私はに描画されたテクスチャにオーディオデータを置くことである必要がありますフレームバッファオブジェクトに格納され、次に読み戻されます。これは問題ではありませんが、正しい結果が得られるようにデータを描画するのはもう少し問題です。

私は基本的に2つの質問があります。

  1. 描画でデータを混合するには、ブレンド(アルファ= 0.5)を使用する必要がありますが、結果にはアルファチャンネルが含まれてはいけません。したがって、たとえばにレンダリングする場合。 RGB形式のフレームバッファは、期待どおりにアルファブレンディングが動作し、結果のアルファはfboに書き込まれませんか? SR | |のsG | sBの|テクスチャ

(私は、レンダーパスを各FBOをリードバックすることを避けるためにしたいです)

フレームバッファ(前)| 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上で再び署名する必要がありますか?

EDIT:

私は少し不明でした。私のハードウェアは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. 宛先バッファにアルファが含まれていなくても、ブレンドすることができます。つまり、2の非累乗(rgb16 = 6バイト/ピクセル)にレンダリングすると、通常、パフォーマンスのペナルティが発生します。

  2. Signedは通常のレンダーターゲットフォーマットではありませんが、OpenGL 4.0仕様(正規化表現の有無に応じて、表3.12、RGB16_SNORMまたはRGB16Iと呼ばれます)に存在します。

補足として、glBlendFunc(GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT_ALPHA)にはピクセル単位でアルファを指定する必要もありません。しかし、それはすべてのGL実装で利用できるわけではありません。

4

率直に言って、なぜあなたはちょうどそれのためのプログラマブルピクセルシェーダを使用していないだろうか?

OpenGL 1固定機能パイプラインを使用する必要がありますか?

私は、符号付き16ビットグレースケールリニアテクスチャで動作するプログラム可能なシェーダを使用します。

編集:

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

それは同じくらい速く、そうでない場合より高速であるべき(ストリーミングパイプラインのおかげで)。

+0

おそらくピクセルシェーダーが役に立ちます。しかし、問題は、フレームバッファにすでに書き込まれているものと「混ざり合っている」ため、フレームシェーダに正しく書き込まれたピクセルシェーダの結果を得る方法です。たぶん私は少し不明でした。しかし、各 "オーディオサンプル"は別々のパスでレンダリングされます。 Soo私はシェーダの中にしかアクセスできない。 – ronag

+2

ピクセルシェーダをPBOまたはFBOにレンダリングさせることができます(PBOまたはアルファチャンネルを無効にするだけで、シェーダで2つのテクスチャを直接ブレンドすることができます) – qdot

+0

はい、しかしもっとアクセスすることはできません各オーディオサンプルは異なるパスでレンダリングされるので、シェーダ内の1つのテクスチャよりも大きい。彼らはFBOで合格に合格する必要があります。 – ronag

2

私はQDotに同意します。しかし、あなたが直面しているハードウェアの制限について少しお伝えしてください。あなたが合理的な現代的なハードウェアを持っているなら、私はOpenGLを経由する代わりに、CUDAまたはOpenCLのルートに行くことを提案するかもしれません。

+0

私の投稿を編集しました。 – ronag

+0

本当に説得力のある理由はありますか?あなたは特に何かに触れる必要がありますか? – Bart

+0

主な理由は、私が必要でない場合には別の依存関係を追加したくないということです。OpenCLを使用することは正当なものではありません。特に、OpenGLを使用すると、私のプロジェクトでは広範囲に及ぶ。 – ronag