图像处理之基础---用Shader实现的YUV到RGB转换:使用3重纹理实现 .
上一篇中,我是用一个RGB格式的纹理来存储每一帧的画面,其中纹理为m_FrameWidth * m_FrameHeight大小,这样,在内存中,就必须要先对YUV的数据进行排序,然后才能当做RGB的数据格式传给纹理内存。我们发现对一个很大帧的图片进行数据重新排序会花费很多时间,为了减少这个时间,当然可以用汇编语言来进行这个排序的操作。然而,有一种更好的方法。
我们发现在上一次所用到的YUV420数据格式是一种平面格式,他的数据排列十分有规律,这里,考虑用3重纹理来实现他的转换。
先定义3个纹理,格式都为GL_LUMINANCE格式,其中一个纹理的大小为m_FrameWidth * m_FrameHeight,这是用来存放Y数据的,另两个纹理的大小为(m_FrameWidth / 2) * (m_FrameHeight / 2),分别用来存放U和V数据。好啦,我们可以直接使用内存拷贝memcpy()函数分别将YUV的数据拷出来,再生成纹理。
那么frame shader中的程序就要改成:
- uniform sampler2D yTexture;
- uniform sampler2D uTexture;
- uniform sampler2D vTexture;
- void main()
- {
- float yuv0 = (texture2D(yTexture,gl_TexCoord[0].st)).r;
- float yuv1 = (texture2D(uTexture,gl_TexCoord[0].st)).r;
- float yuv2 = (texture2D(vTexture,gl_TexCoord[0].st)).r;
- vec4 color;
- color.r = yuv0 + 1.4022 * yuv2 - 0.7011;
- color.r = (color.r < 0.0) ? 0.0 : ((color.r > 1.0) ? 1.0 : color.r);
- color.g = yuv0 - 0.3456 * yuv1 - 0.7145 * yuv2 + 0.53005;
- color.g = (color.g < 0.0) ? 0.0 : ((color.g > 1.0) ? 1.0 : color.g);
- color.b = yuv0 + 1.771 * yuv1 - 0.8855;
- color.b = (color.b < 0.0) ? 0.0 : ((color.b > 1.0) ? 1.0 : color.b);
- gl_FragColor = color;
- }
其中需要注意的两点是:
1: uniform的值是要在每次绘制前调用的。
- m_loc=glGetUniformLocation(m_Program,"yTexture");
- glUniform1i(m_loc,0); /* Bind Utex to texture unit 1 */
- m_loc=glGetUniformLocation(m_Program,"uTexture");
- glUniform1i(m_loc,1); /* Bind Utex to texture unit 1 */
- m_loc=glGetUniformLocation(m_Program,"vTexture");
- glUniform1i(m_loc,2); /* Bind Utex to texture unit 1 */
m_Program就是shader的程序。
2:在使用shader和多重纹理之前,都要进行初始化:glewInit();
- int m = m_FrameWidth * m_FrameHeight;
- int l = (m_FrameWidth / 2) * (m_FrameHeight / 2);
- unsigned char * pyuv = m_y;
- unsigned char * ptemp = cTemp[0];
- __asm
- {
- mov ecx, m
- mov ebx, ptemp
- mov edx, pyuv
- label_y:
- mov al, [ebx]
- mov [edx], al
- add ebx, 1
- add edx, 1
- dec ecx
- jnz label_y
- }
- pyuv = m_u;
- ptemp = cTemp[1];
- __asm
- {
- mov ecx, l
- mov ebx, ptemp
- mov edx, pyuv
- label_u:
- mov ah, [ebx]
- mov [edx], ah
- add ebx, 1
- add edx, 1
- dec ecx
- jnz label_u
- }
- pyuv = m_v;
- ptemp = cTemp[2];
- __asm
- {
- mov ecx, l
- mov ebx, ptemp
- mov edx, pyuv
- label_v:
- mov al, [ebx]
- mov [edx], al
- add ebx, 1
- add edx, 1
- dec ecx
- jnz label_v
- }
图像处理之基础---用Shader实现的YUV到RGB转换:使用3重纹理实现 .的更多相关文章
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV格式转RGB格式转换成功了.下面就来介绍一下: 由于我的工程是在vs2008中的,其中包含一些相关头文件和库,所以下面只是列出部分核心代码 ...
- OpenCV探索之路(二):图像处理的基础知识点串烧
opencv图像初始化操作 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using n ...
- [译]Vulkan教程(13)图形管道基础之Shader模块
[译]Vulkan教程(13)图形管道基础之Shader模块 Shader modules Unlike earlier APIs, shader code in Vulkan has to be s ...
- 【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比
[视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...
- 图像色彩空间YUV和RGB的差别
http://blog.csdn.net/scg881008/article/details/7168637 假如是200万像素的sensor,是不是RGB一个pixel是2M,YUV是1M? 首先, ...
- 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface)
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
- 【视频处理】YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
随机推荐
- 浅谈JS之text/javascript和application/javascript
问题描述: JS在IE8以下浏览器运行异常 代码: <script>标签是这样子写的: <script type="application/javascript" ...
- java正则表达式进阶运用20181023
直接上代码. package org.jimmy.autotranslate20181022.test; import java.util.regex.Matcher; import java.uti ...
- Lua表(table)的用法_个人总结
Lua表(table)的用法_个人总结 1.表的创建及表的介绍 --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意 ...
- hdfs深入:08、hdfs的JavaAPI以及如何解决winutils的问题
/** * 通过url注册的方式访问hdfs,了解,不会用到 * @throws Exception */ 以下为详细代码://1.注册hdfs的url,让java代码能识别hdfs的url形式URL ...
- iOS缓存到内存
前面一片文章介绍了如何上传和下载文件,这篇文章将介绍一下如何在iOS设备中进行缓存. 这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容. 使用缓存的目的是为了使用的应 ...
- Failed to resolve filter报错原因
问题 页面写过滤器,控制台报错,Failed to resolve filter 分析 语法错误?先检查 ``` {{ params | filterA }} filters: { filterA: ...
- jquery.form.min.js
/*! * jQuery Form Plugin * version: 3.51.0-2014.06.20 * Requires jQuery v1.5 or later * Copyright (c ...
- [luoguP1041] 传染病控制(DFS)
传送门 n <= 300 结果裸的dfs就直接过了.. 枚举每一层,枚举删除每一层的边,然后把删除的边所连接的子树全部删去 代码 #include <vector> #include ...
- 【裸的并查集】POJ 1611 The Suspects
http://poj.org/problem?id=1611 [Accepted] #include<iostream> #include<cstdio> #include&l ...
- 【HDOJ5714】拍照(线性扫描)
题意:小明在旅游的路上看到了一条美丽的河,河上有许多船只,有的船只向左航行,有的船只向右航行.小明希望拍下这一美丽的风景,并且把尽可能多的船只都完整地拍到一张照片中. 小明位于河的边上,并且可以在河边 ...