GPU 实现 RGB -- YUV 转换
前言
RGB --> YUV 转换的公式是现成的,直接在 CPU 端转换的话,只需要遍历每个像素,得到新的 YUV 值,根据其内存分布规律,合理安排分布即可。然而在 CPU 端进行转换,存在的问题运行效率太低,无法满足高效转换的需求。我们将目光投向拥有流水线体系的支持高速浮点数计算的硬件——GPU.
转换公式如下:
GPU 上面的实现
考虑在 GPU 上执行 RGB --> YUV 转换。GPU 的流水线操作:
vertices
----> Pipeline ----> Out color
texture
所以将 RGB 图像作为纹理输入,流水线输出我们需要的 YUV 数据。前面一部分很好理解,图像作为唯一的纹理输入,没有别的选项。后面一部分的话,需要在输出的时候输出我们需要的 YUV 数据即可,在 fragment shader 中的输出按常理就是每一个 fragment 的颜色,为实现读取像素是 YUV 的目标,要调整输出的数据。
考虑 YUV 格式内存分布,以 NV12 为例,一张图片占用内存大小为: