【OpenGL】用OpenGL shader实现将YUV转RGB-(直接调用GPU实现,纯硬件方式,效率高)
2013-03-14 13:42
399 查看
这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV格式转RGB格式转换成功了。下面就来介绍一下:
由于我的工程是在vs2008中的,其中包含一些相关头文件和库,所以下面只是列出部分核心代码,并不是全部代码。
上述代码中1.yuv就是YUV数据文件
上述片段shader中就是根据yuv转rgb的公式得来的。也就是说是在shader中实现转换的。
扫描下面二维码即可加关注:
由于我的工程是在vs2008中的,其中包含一些相关头文件和库,所以下面只是列出部分核心代码,并不是全部代码。
1、下载一个包含YUV数据的文件也可以自己制作一个该文件
下载地址:YUV数据文件2、读入YUV数据文件中的yuv数据:
关键代码如下:2.1读文件代码
unsigned char * readYUV(char *path) { FILE *fp; unsigned char * buffer; long size = 1280 * 720 * 3 / 2; if((fp=fopen(path,"rb"))==NULL) { printf("cant open the file"); exit(0); } buffer = new unsigned char[size]; memset(buffer,'\0',size); fread(buffer,size,1,fp); fclose(fp); return buffer; }
2.2读入数据,并将YUV数据分别制作成3个纹理
GLuint texYId; GLuint texUId; GLuint texVId; void loadYUV(){ int width ; int height ; width = 640; height = 480; unsigned char *buffer = NULL; buffer = readYUV("1.yuv"); glGenTextures ( 1, &texYId ); glBindTexture ( GL_TEXTURE_2D, texYId ); glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); glGenTextures ( 1, &texUId ); glBindTexture ( GL_TEXTURE_2D, texUId ); glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, width / 2, height / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer + width * height); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); glGenTextures ( 1, &texVId ); glBindTexture ( GL_TEXTURE_2D, texVId ); glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, width / 2, height / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer + width * height * 5 / 4 ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); }
上述代码中1.yuv就是YUV数据文件
3、将纹理传入OpenGL shader进行显示
</pre></h1><h2>3.1 顶点shader和片段shader代码</h2><div><pre name="code" class="cpp"> GLbyte vShaderStr[] =
"attribute vec4 vPosition; \n"
"attribute vec2 a_texCoord; \n"
"varying vec2 tc; \n"
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n"
" tc = a_texCoord; \n"
"} \n";
GLbyte fShaderStr[] =
"precision mediump float;\n"
"uniform sampler2D tex_y; \n"
"uniform sampler2D tex_u; \n"
"uniform sampler2D tex_v; \n"
"varying vec2 tc; \n"
"void main() \n"
"{ \n"
" vec4 c = vec4((texture2D(tex_y, tc).r - 16./255.) * 1.164);\n"
" vec4 U = vec4(texture2D(tex_u, tc).r - 128./255.);\n"
" vec4 V = vec4(texture2D(tex_v, tc).r - 128./255.);\n"
" c += V * vec4(1.596, -0.813, 0, 0);\n"
" c += U * vec4(0, -0.392, 2.017, 0);\n"
" c.a = 1.0;\n"
" gl_FragColor = c;\n"
"} \n";
上述片段shader中就是根据yuv转rgb的公式得来的。也就是说是在shader中实现转换的。4、显示结果
结果如下:注意:该shader是OpenGL ES格式的,与OpenGL格式的shader有一点差别。
欢迎关注我的微信公众号“中华文化精选”(微信号:goto_china),每天清晨,我们将为您送上精选历史故事一篇以及点评。扫描下面二维码即可加关注:
相关文章推荐
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高) 这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
- 用OpenGL shader 实现将YUV转RGB(直接调用GPU实现)
- GPU 实现 RGB -- YUV 转换 (OpenGL)
- SubClasing用法--子类重写父类方法,父类直接调用实现方式
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- springMVC两种方式实现多文件上传及效率比较
- java 实现WebService 以及不同的调用方式
- 直接调用阿里云视频点播API实现视频播放
- 改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
- springMVC两种方式实现多文件上传及效率比较
- java 实现WebService 以及不同的调用方式
- neon内嵌汇编实现一个yuv转rgb的功能stopped原因
- java 实现WebService 以及不同的调用方式
- ios中javascript直接调用oc代码而非通过改变url回调方式(转)
- 基于WebService实现远程调用方式的系统间通信
- HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理
- 实现RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法
- html5的postmessage实现js前端跨域訪问及调用解决方式
- Spring事务处理时自我调用的解决方案及一些实现方式的风险