高效传输平面图像以便在OpenGL中渲染?

时间:2012-12-17 11:09:03

标签: c++ opengl memory-management

在OpenGL中传输平面YUVA图像以进行渲染的最有效方法是什么?

目前我在每帧中使用4个单独的纹理(Y,U,V,A)从4个独立的PBO上传到该纹理。但是,在少量纹理中传输大量数据似乎更有效。将YUV422转换为单个打包纹理比将相同数据转换为3(Y,U,V)单独纹理快约50%。

我对此事的一些想法是,我是否可以使用2个数组纹理,一个用于(Y,A),一个用于(U,V),是否会更快?

我考虑的另一个替代方案是在将数据复制到PBO以进行传输时将平面转换为打包,但这确实会产生一些CPU开销。

有什么建议吗?

注意:暗淡(Y)==暗淡(A)&&昏暗(U)==昏暗(V)&&昏暗(Y)!=昏暗(U)。

1 个答案:

答案 0 :(得分:0)

我想知道你是如何生成纹理的?即动态生成或从文件加载?如果从文件中加载它们,我建议将纹理加载为单个rgba纹理以加载它并利用片段着色器将其作为yuva处理,然后可以一次性加载数据,并且应该在性能上产生更好的结果

如果有更多关于如何使用纹理的信息,我应该能够给你一个更详细的答案。

编辑:我通常处理YUVA的方式是渲染纹理;使用GPU将RGBA转换为YUVA,然后通过 glGetTexImage 将结果发送回CPU,并将结果数据作为YUVA处理(或删除alpha并将其用作YUV)。

关于不同大小的纹理,我不担心,按照您认为合适的方式打包数据,并在您认为合适的情况下读取它,您可以让每个通道在您不需要的所有区域中都有0个值有任何有效的数据,例如使用和关闭但令人难忘的价值(如你的生日,并有0.17122012(今天的日期)的值),所以你可以很容易地编程忽略它们,或使通道处理代码只读取基于的特定尺寸它运行的通道,无关数据是最小的,或者0甚至更小,利用GPU处理数据的速度增加抵消了它,仍然保留了快速系统。

希望有所帮助。