gpt4 book ai didi

c++ - 有效传输平面图像以在 OpenGL 中渲染?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:29 25 4
gpt4 key购买 nike

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

目前我正在使用 4 个单独的纹理(Y、U、V、A),我在每一帧中从 4 个单独的 PBO 上传到这些纹理。然而,在少数纹理中传输大量数据似乎更有效,例如将 YUV422 传输到单个打包纹理比将相同数据传输到 3 个(Y、U、V)单独纹理快约 50%。

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

我考虑过的另一种选择是在将数据复制到 PBO 进行传输时从平面转换为打包,尽管这确实会产生一些 CPU 开销。

有什么建议吗?

注意:dim(Y) == dim(A) && dim(U) == dim(V) && dim(Y) != dim(U)。

最佳答案

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

如果有更多关于如何使用纹理的信息,我应该能够为您提供更详细的答案。

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

关于不同大小的纹理,我不会担心,按你认为合适的方式打包数据,并按你认为合适的方式读出它,你可以让每个 channel 在你不喜欢的所有区域都有 0 值具有任何有效数据,例如或使用和关闭但值得纪念的值(例如您的生日,并且具有 0.17122012(今天的日期)的值),因此您可以轻松地以编程方式忽略它们,或者使 channel 处理代码仅读取特定维度基于它运行的 channel ,无关数据最少,如果为 0,则更少,并且利用 GPU 处理数据的速度增益抵消了它,并且仍然保持快速系统。

希望对您有所帮助。

关于c++ - 有效传输平面图像以在 OpenGL 中渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13912958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com