を使用してオーディオをミキシング、私は、OpenGLを使用して2つ(またはそれ以上)の16ビットのオーディオストリームをミックスしたいと私は助けOpenGLの
のビットは、基本的に私が何をしたいのか、私はに描画されたテクスチャにオーディオデータを置くことである必要がありますフレームバッファオブジェクトに格納され、次に読み戻されます。これは問題ではありませんが、正しい結果が得られるようにデータを描画するのはもう少し問題です。
私は基本的に2つの質問があります。
- 描画でデータを混合するには、ブレンド(アルファ= 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 |
- オーディオサンプルは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();
おそらくピクセルシェーダーが役に立ちます。しかし、問題は、フレームバッファにすでに書き込まれているものと「混ざり合っている」ため、フレームシェーダに正しく書き込まれたピクセルシェーダの結果を得る方法です。たぶん私は少し不明でした。しかし、各 "オーディオサンプル"は別々のパスでレンダリングされます。 Soo私はシェーダの中にしかアクセスできない。 – ronag
ピクセルシェーダをPBOまたはFBOにレンダリングさせることができます(PBOまたはアルファチャンネルを無効にするだけで、シェーダで2つのテクスチャを直接ブレンドすることができます) – qdot
はい、しかしもっとアクセスすることはできません各オーディオサンプルは異なるパスでレンダリングされるので、シェーダ内の1つのテクスチャよりも大きい。彼らはFBOで合格に合格する必要があります。 – ronag