首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用OpenGL ES 2.0将YUV420P转换为RGBA

使用OpenGL ES 2.0将YUV420P转换为RGBA
EN

Stack Overflow用户
提问于 2013-01-13 05:15:54
回答 1查看 6.3K关注 0票数 1

我正在使用安卓系统上的OpenGL ES 2.0处理视频。图片数据被拉取为YUV420P,我需要在我的OpenGL片段着色器中以某种方式在RGBA中处理它们。

如何将YUV420P数据转换为RGBA?(性能是关键,因为它是视频)

更新:由于Brad Larsson的回答,我得到了更多的帮助,但看起来不太对。

UPDATE2:嗯,我还在使用我的RGBA片段着色器。当然,这看起来是错的。但现在我有了另一个问题。让我再深入挖掘一下。

UPDATE3:好的,这里有些不对劲。

我正在为纹理使用这个。这是正确的吗?

代码语言:javascript
复制
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, luminanceBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width / 2, height / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, chrominanceBuffer);

UPDATE4:使用GL_LUMINANCE_ALPHA解决了隔行扫描问题,但图片仍然损坏,但...我刚刚了解到问题出在我的字节缓冲区中,所以将这个标记为已回答。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-13 06:01:36

苹果有几个iOS的示例,它们在OpenGL ES 2.0着色器中从YUV420平面数据转换为RGBA。虽然不是专门针对Android的,但您仍然可以使用此GLSL着色器代码来完成您想要的操作。

这是我在基于它们的示例的转换片段着色器中使用的:

代码语言:javascript
复制
 varying highp vec2 textureCoordinate;

 uniform sampler2D luminanceTexture;
 uniform sampler2D chrominanceTexture;

 void main()
 {
     mediump vec3 yuv;
     lowp vec3 rgb;

     yuv.x = texture2D(luminanceTexture, textureCoordinate).r;
     yuv.yz = texture2D(chrominanceTexture, textureCoordinate).rg - vec2(0.5, 0.5);

     // BT.601, which is the standard for SDTV is provided as a reference
     /*
      rgb = mat3(      1,       1,       1,
      0, -.39465, 2.03211,
      1.13983, -.58060,       0) * yuv;
      */

     // Using BT.709 which is the standard for HDTV
     rgb = mat3(      1,       1,       1,
                0, -.21482, 2.12798,
                1.28033, -.38059,       0) * yuv;

     gl_FragColor = vec4(rgb, 1);
 }

luminanceTexture是作为纹理的图像的Y平面,chrominanceTexture是UV平面。

我相信上面的设置是针对视频范围YUV进行调整的,因此您可能需要针对全范围YUV调整这些值。对于iPhone 4S上的1080p视频帧,该着色器的运行时间为几分之一毫秒。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14298028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档