2

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

目前我正在使用 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)。

4

1 回答 1

0

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

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

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

关于不同大小的纹理,我不担心,按您认为合适的方式打包数据,并在您认为合适的情况下读出它,您可以让每个通道在您没有任何有效区域的所有区域中具有 0 值例如数据或使用和关闭但令人难忘的值(例如您的生日,并且具有沿 0.17122012(今天的日期)的值),因此您可以轻松地以编程方式忽略它们,或者使通道处理代码仅读取基于通道的特定维度运行时,无关数据很少,或者如果为 0 则更少,并且利用 GPU 处理数据的速度增益抵消了它,并且仍然保留了一个快速系统。

希望对您有所帮助。

于 2012-12-17T13:16:33.500 回答