OpenGL颜色空间转换

3
有没有人知道如何创建一个YUV色彩空间的纹理,以便我们可以获得基于硬件的YUV到RGB色彩空间转换,而不必使用片段着色器?我正在使用NVidia 9400,我没有看到一个明显的GL扩展似乎可以解决这个问题。我已经找到了使用片段着色器的示例,但我目前正在使用的项目仅支持OpenGL 1.1,我没有时间将其转换为2.0并执行所有必要的回归测试。这也是针对Linux的。在其他平台上,我一直在使用MESA扩展,但它在Nvidia卡上无法运行。
2个回答

1

如果您可以使用扩展,但又担心全面采用OpenGL 2.0,那么考虑使用旧式的ARB_fragment_program扩展提供简单的片段着色器。

或者,您可以使用像DevIL、ImageMagick或FreeImage这样的库来为您执行转换。


使用像DevIL这样的库意味着在CPU上进行转换,而他正试图避免这种情况。 - Amok
我无法使用其中一个包,因为它是BINK电影数据,因此它在每个帧上都会发生。我想我可以研究一下ARB_fragment_program。 - Steven Behnke
抱歉,我的眼睛忽略了问题中的“基于硬件”的部分。 - prideout

0

你提到的MESA扩展是针对YCrCb的吗?如果你的Nvidia显卡没有暴露它,这意味着他们没有暴露对该纹理格式的支持(这是表明显卡支持它的方式)。

你唯一的选择是在纹理过滤块之外进行颜色转换。(在将纹理数据提交给GL之前或在从纹理过滤块获取值之后)

GL仍然可以帮助,因为在GL1.1中进行线性变换是可行的,前提是你有正确的扩展(dot3纹理组合器扩展)。尽管如此,它远非万能药。

就其价值而言,BINK实现似乎正在使用CPU进行转换,使用MMX(虽然这是读行之间的内容)。我可能会做同样的事情,在加载到OpenGL之前使用SSE进行转换。每帧都可以用CPU来完成这项工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接