2010-12-15 71 views
1

我想用OpenGL的混合两个(或更多)16位音频流,我需要一点帮助混合音频使用的OpenGL

基本上就是我想要做的是把音频数据转换成纹理,我提请一个帧缓冲区对象,然后回读。这不是一个问题,但是提供正确结果的数据的方式会有点问题。

我基本上有两个问题。

  1. 为了通过绘图混合数据我需要使用混合(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 |

  1. 音频样本被标记为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(); 

回答

1
  1. 即使目标缓冲区没有alpha,你也应该能够进行混合。也就是说,渲染到非幂次方(rgb16 = 6bytes/pixel)通常会导致性能损失。

  2. 签名不是您的典型渲染目标格式,但它确实存在于OpenGL 4.0规范中(表3.12,称为RGB16_SNORM或RGB16I,具体取决于您是否需要规范化表示)。

作为一个方面说明,你也有glBlendFunc(GL_CONSTANT_ALPHA,GL_ONE_MINUS_CONSTANT_ALPHA)甚至没有指定一个alpha每像素。尽管如此,这可能不适用于所有的GL实现。

4

坦率地说,你为什么不只是使用该可编程像素着色器?

您是否必须使用OpenGL 1 Fixed Functionality Pipeline?

我只想用一个可编程着色器来处理带符号的16位灰度线性纹理。

编辑:

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

它应该是一样快,如果不是更快(感谢流管道)。

+0

像素着色器可能会有用。然而,问题在于我如何从像素着色器正确写入帧缓冲区得到结果,因为它“应该”与帧缓冲区中已有的内容混合在一起。也许我有点不清楚。但是每个“音频样本”都会以单独的通行证呈现。所以我只能在着色器中访问它。 – ronag 2010-12-15 14:59:43

+2

您可以将像素着色器呈现到PBO或FBO中,而不必打扰PBO的Alpha通道(您可以禁用它们并直接通过着色器混合两个纹理) – qdot 2010-12-15 15:04:40

+0

是的,但我无法访问更多比着色器中的一个纹理更复杂,因为每个音频采样都将以不同的遍数呈现。他们需要在FBO中经过传球积累。 – ronag 2010-12-15 15:11:11

2

我同意QDot。但是,您能否告诉我们您正面临的硬件限制?如果你有合理的现代硬件,我甚至可以建议去CUDA或OpenCL路线,而不是通过OpenGL。

+0

编辑我的文章。 – ronag 2010-12-15 15:03:44

+0

是否有真正令人信服的理由通过OpenGL?你需要与特定的东西进行交互吗? – Bart 2010-12-15 15:31:23

+0

那么主要原因是我不想在不需要的情况下添加其他依赖项......看起来这并不合理,因为OpenCL只是为了这个......特别是如果我可以用OpenGL来完成这项工作,广泛地在我的项目中。 – ronag 2010-12-15 23:20:23