【问题标题】:Colorspace conversion in OpenGLOpenGL中的色彩空间转换
【发布时间】:2012-10-07 00:11:51
【问题描述】:

有没有办法在 OpenGL 中进行颜色转换(例如来回从 RGB 到 YUV420p)? 我可以使用后台缓冲区的内容、纹理或 FBO。我在这里看到了这个问题,但仅限于 OpenGL 1.1,而且我不受任何特定版本的 OpenGL 的限制。 OpenGL Colorspace Conversion

我想知道是否有更新/更快的方法可以使用较新的版本来执行此操作。我不希望使用任何特定于硬件的东西,但如果需要,我正在使用 Nvidia GPU。

【问题讨论】:

  • 您可以使用 glsl 着色器代替 ARB_FRAGMENT 程序。 This answer 给出了转换为 YIQ 的示例。 Y'CbCr 相似,但矩阵略有不同。
  • 谢谢!我希望它是一项常见的任务,并有一些库来完成它,但这绝对有效。那肯定会给我RGB-> YUV444。您将如何为 YUV420p 进行下采样色度通道?每四个像素只有一个样本。从您的代码中,我必须在这里做一些不同的事情,我认为 float I = dot (color, kRGBToI); float Q = dot (color, kRGBToQ);
  • 我不知道有任何库,但您可能会进行某种重新采样以降低到 4:2:0。 Cb/Cr 通道上的框模糊是我的第一次尝试,但其他重采样滤波器(如 Gaussian 或 Lanczos)可能质量更高。
  • 我想我需要去实现它。我认为这应该有效。如果您将所有 cmets 作为答案,我会接受。

标签: opengl 3d nvidia yuv color-space


【解决方案1】:

由于您想要更新/更快,是的,您可以尝试使用 CUDA 或 OpenCL。它们是否会比着色器快得多...我不知道,请告诉我们。如果有的话,它可以让您更好地控制资源分配给任务的方式。

两个框架都有与 OpenGL 共享内存的方式,因此您应该能够只编写一个内核并将您的 opengl 纹理/fbo 传递给它。

我碰巧为 xpra 编写了许多这样的模块,你可以在这里找到它们的链接:xpra wiki: CSC(代码是 GPL2+)

【讨论】:

  • 这非常有用。我还需要一段时间才能有机会尝试这个,因为必须先解决更紧迫的问题,但我会回来发布我的结果。