1

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

基本的に私がやりたいのは、オーディオデータをテクスチャに入れてフレームバッファオブジェクトに描画してから読み戻すことです。これは問題ではありませんが、正しい結果が得られる方法でデータを描画することは、もう少し問題があります。

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

  1. 描画によってデータを混合するには、ブレンディング(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 |

  1. オーディオサンプルは、符号付き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();
4

3 に答える 3

4

率直に言って、そのためにプログラム可能なピクセルシェーダーを使用しないのはなぜですか?

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

署名された16ビットグレースケール線形テクスチャで動作するプログラム可能なシェーダーを使用します。

編集:

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

高速ではないにしても、同じくらい高速である必要があります(ストリーミングパイプラインのおかげで)。

于 2010-12-15T14:54:52.340 に答える
2

QDotに同意します。ただし、直面しているハードウェアの制限について少し教えていただけますか?合理的な最新のハードウェアをお持ちの場合は、OpenGLを使用する代わりに、CUDAまたはOpenCLルートを使用することをお勧めします。

于 2010-12-15T14:57:36.250 に答える
1
  1. デスティネーションバッファにアルファがない場合でも、ブレンディングを実行できるはずです。とはいえ、2の累乗以外のサイズ(rgb16 = 6バイト/ピクセル)にレンダリングすると、通常、パフォーマンスが低下します。

  2. 署名付きは一般的なレンダリングターゲット形式ではありませんが、OpenGL 4.0仕様には存在します(表3.12、正規化された表現が必要かどうかに応じて、RGB16_SNORMまたはRGB16Iと呼ばれます)。

ちなみに、glBlendFunc(GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT_ALPHA)ピクセルごとにアルファを指定する必要もありません。ただし、これはすべてのGL実装で利用できるわけではありません。

于 2010-12-15T16:15:05.327 に答える