【问题标题】:Color Space Conversion ( ARGB -> YUV420 ) Using OpenGL Shaders使用 OpenGL 着色器的色彩空间转换 ( ARGB -> YUV420 )
【发布时间】:2015-06-19 18:54:41
【问题描述】:

是否可以使用 openGL 帧着色器将 ARGB 图像转换为 YUV420(平面或半平面)图像?

我正在寻找片段着色器代码或任何可帮助我实现此目标的参考指南?

我推荐了RGB to YUV using GLSL。 但这并没有太多的信息。

我需要将 YUV420 图像传递给 h264 编码器。 任何工作或参考着色器代码?

【问题讨论】:

  • 请张贴您的代码并描述什么不能按预期工作。

标签: opengl graphics opengl-es-2.0 shader color-space


【解决方案1】:

如你所见here:

将 R、G 和 B 的加权值相加得出 Y',即 整体亮度或亮度。 U 和 V 按比例计算 Y' 与 B 和 R 值之间的差异。

因此,您可以在着色器中制作一个恒定的 3x3 矩阵,例如:

如果您使用this 标准,该矩阵将是有效的。因此,对原始纹理进行采样,将其乘以该矩阵,然后在 FBO 中烘焙结果。这是一个非常简单的过程。

希望这是足够的信息。如果您需要更多帮助,请随时发表评论。

【讨论】:

  • 感谢 Info Dim,我会按照这个方法告诉你。我是 GLSL 的新手,所以正在寻找一些参考代码。 :)
  • 我现在可以向您推荐的所有信息都是these tutorials。我不知道您是否已经创建并编译了您的第一个着色器,或者您是否正打算开始,所以请查看这些教程。您需要的所有信息都在那里。 :)
【解决方案2】:

除了已经解释了如何进行色彩空间转换的 Dimo Markov 之外,在执行色度二次采样的情况下,您还必须降低色彩平面的分辨率。

要实现这一点,您将使用三个通道,每个通道用于 Y、U 和 V。而不是矩阵向量乘法,事情将归结为一个简单的内部(= 点)积。子采样本身是通过渲染到较小的渲染缓冲区并依赖源纹理 mipmap 过滤来实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2018-09-06
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多