OpenGLを使用して2つ(またはそれ以上)の16ビットオーディオストリームをミキシングしたいのですが、少し助けが必要です
基本的に私がやりたいのは、オーディオデータをテクスチャに入れてフレームバッファオブジェクトに描画してから読み戻すことです。これは問題ではありませんが、正しい結果が得られる方法でデータを描画することは、もう少し問題があります。
基本的に2つの質問があります。
- 描画によってデータを混合するには、ブレンディング(alpha = 0.5)を使用する必要がありますが、結果にはアルファチャネルが含まれていてはなりません。したがって、たとえばRGB形式のフレームバッファにレンダリングした場合、アルファブレンディングは期待どおりに機能し、結果のアルファはfboに書き込まれませんか?(レンダリングパスごとにfboを読み戻す必要はありません)
テクスチャ|sR| sG | sB |
フレームバッファ(前)| dR | dG | dB |
フレームバッファ(後)| dR * 0.5 + sR * 0.5 | dG * 0.5 + sG * 0.5 | dB * 0.5 + sB * 0.5 |
- オーディオサンプルは、符号付き16ビット整数値です。この方法で署名された計算を行うことは可能ですか?または、最初に値をCPUで符号なしに変換し、描画してから、CPUで再度符号を付ける必要がありますか?
編集:
少しわかりませんでした。私のハードウェアはOpenGL3.3ハードウェアに制限されています。私は他のものにOpenGLを使用しているので、CUDAやOpenCLは使用したくないです。
各オーディオサンプルは別々のパスでレンダリングされます。つまり、フレームバッファにすでにレンダリングされているものと「ミックス」する必要があります。問題は、ピクセルシェーダーからの出力がフレームバッファーにどのように書き込まれるかです(私が知る限り、このブレンディングはプログラム可能なシェーダーからはアクセスできず、glBlendFuncを使用する必要があります)。
EDIT2:
各オーディオサンプルは異なるパスでレンダリングされるため、シェーダーで一度に使用できるオーディオサンプルは1つだけです。つまり、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();