我想用OpenGL的混合两个(或更多)16位音频流,我需要一点帮助混合音频使用的OpenGL
基本上就是我想要做的是把音频数据转换成纹理,我提请一个帧缓冲区对象,然后回读。这不是一个问题,但是提供正确结果的数据的方式会有点问题。
我基本上有两个问题。
- 为了通过绘图混合数据我需要使用混合(alpha = 0.5),但是结果不应该有任何alpha通道。所以如果我渲染到例如格式为RGB的帧缓冲区将会像我期望的那样继续工作,并且生成的alpha将不会写入fbo? (我想避免读回FBO每个渲染通道)
质地| SR | SG |胆红|
framebuffer(before)| 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)。
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();
像素着色器可能会有用。然而,问题在于我如何从像素着色器正确写入帧缓冲区得到结果,因为它“应该”与帧缓冲区中已有的内容混合在一起。也许我有点不清楚。但是每个“音频样本”都会以单独的通行证呈现。所以我只能在着色器中访问它。 – ronag 2010-12-15 14:59:43
您可以将像素着色器呈现到PBO或FBO中,而不必打扰PBO的Alpha通道(您可以禁用它们并直接通过着色器混合两个纹理) – qdot 2010-12-15 15:04:40
是的,但我无法访问更多比着色器中的一个纹理更复杂,因为每个音频采样都将以不同的遍数呈现。他们需要在FBO中经过传球积累。 – ronag 2010-12-15 15:11:11