我想使用 OpenGL 混合两个(或更多)16 位音频流,我需要一些帮助
基本上我想要做的是将音频数据放入我绘制到帧缓冲区对象然后读回的纹理中。这不是问题,但是以给出正确结果的方式绘制数据有点问题。
我基本上有两个问题。
- 为了通过绘图混合数据,我需要使用混合(alpha = 0.5),但是结果不应该有任何 alpha 通道。因此,如果我渲染到例如格式为 RGB 的帧缓冲区,alpha 混合仍然可以按我的预期工作,并且生成的 alpha 不会被写入 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 上再次使它们签名?
编辑:
我有点不清楚。我的硬件仅限于 OpenGL 3.3 硬件。我宁愿不使用 CUDA 或 OpenCL,因为我已经将 OpenGL 用于其他东西。
每个音频样本将在单独的通道中渲染,这意味着它必须与已经渲染到帧缓冲区的内容“混合”。问题是如何将像素着色器的输出写入帧缓冲区(据我所知,这种混合无法通过可编程着色器访问,并且必须使用 glBlendFunc)。
编辑2:
每个音频样本将在不同的通道中渲染,因此着色器中一次只有一个音频样本可用,这意味着它们需要在 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();