2

我正在开发视频序列的查看器。我使用基于扫描线的方法,对每一行进行并发计算(获取)。我得到的每一行都在几个缓冲区(通道)中分开,即 R、G、B、A。

因此,将问题想象为:我想将所有通道组合成一个纹理。我曾想过自己做,通过分配一个临时缓冲区,我可以在其中上传多个组件,并使用 glTexSubImage2D(...) 将其提供给 openGL,但解决方案非常昂贵...尤其是对于图像流!

然后我想到了多重纹理:简而言之,为每个通道制作一个单独的纹理(GL_LUMINANCE?),然后将它与 GLSL 着色器结合起来。我认为这可行,不幸的是我没有多重纹理方面的经验。有人可以给我一个完整的多纹理教程的链接吗?

我能从互联网上挖掘出来的最后一件事是使用带有缓冲纹理的 FBO。在缓冲区纹理中,使用具有多个索引的缓冲区对象。但是我无法获得有关缓冲区对象中索引的更多详细信息,以及它是否能满足我的需求。

无论如何,这是最后一个问题:是否可以从 4 个单独的组件(缓冲区)创建一个纹理?或更准确地说:如何在视频序列的上下文中有效地绘制 4 个组合缓冲区?

4

1 回答 1

2

多重纹理确实是要走的路。最重要的是,它允许您为每个通道设置不同的格式,从而允许进行 4:2:2 二次采样或类似的操作。

FBO 是绘图目标,而不是图像源,因此不太适合您。

多重纹理背后的基本思想是,有许多所谓的纹理单元,OpenGL 调用glActiveTexture选择在调用之后的单元glBindTexture将起作用。它需要一些簿记,哪个纹理绑定在哪里,但这不是很困难。

在片段着色器中,您可以通过所谓的sampler uniform从纹理中获取样本。采样器制服绑定到纹理单元。一个重要的陷阱是,它glActiveTexture作为参数GL_TEXTURE0 + n,而传递给采样器的单元号使用glUniformiis just n

如果您只是对上传数据感兴趣,则纹理绑定在哪个纹理单元中并不重要。(我个人希望新版本的 OpenGL 有一个特殊的纹理单元,它不能用作源,但只允许绑定纹理以进行图像上传,并且没有纹理目标优先级。)

于 2012-11-19T10:48:14.073 回答