YUV数据转化为纹理对象(YUV色彩模型,RGB模型)

YUV色彩模型来源于RGB模型(RGBA,A-alpha通道,一般不透明度参数)。

YUV采样率4:4:4,4:2:2,4:2:0,4:1:1等。

视频=图像、图片(摄像头)+声音(麦克风)。

-- YUV数据转化为纹理对象
  图像处理之基础---用Shader实现的YUV到RGB转换:使用3重纹理实现 .
  在内存中,就必须要先对YUV的数据进行排序,然后才能当做RGB的数据格式传给纹理内存。获取相机YUV格式的数据,转换为RGB格式,并渲染到屏幕上。

 从移动端技术角度去看,特效相机模块的基本结构是:
从相机获取图像帧数据;
将图像 数据喂给特定的算法,获取算法输出;
利用算法输出对图像帧进行修改(也可以是叠加其他图像,如3D渲染出的虚拟模型);
将处理完的图像帧渲染到手机屏幕上。

 YUV格式相机帧渲染:
 配置相机,输出图像帧数据(YUV格式),并以此创建两个MTLTexture对象(一张纹理包含Y通道数据,即灰度图数据,一张纹理包含UV通道数据)
 
借助Metal的Compute Pipeline,用上一步获取的两张纹理,合成出RGBA格式的纹理

 借助Metal的Render Pipeline 将RGBA格式的纹理渲染的手机屏幕上。

  获取相机YUV格式的图像帧数据,利用Metal的ComputePipeline转换为RGB格式数据,并渲染到手机屏幕上-https://github.com/SXCC/camera_preview_with_metal
  对于YV12视频数据,可以创建三个纹理,分别填充Y、U、V视频数据。对于缺失的U、V采样点,我们可以利用显卡内置的双线性滤波算法插值出来,这是简单的方法。当然,也可以采用更好的图像插值算法,以达到更高的图像质量,这需要我们通过Shader实现我们的插值算法,然后分别把U、V渲染到纹理,实现更好的插值。相对与双线性滤波,缺点是复杂更度高,效率低。U、V插值后,视频数据从YUV420转换为YUV444,然后做颜色空间转换,从YUV444转换为RGB32,转换的Shader代码很简单,就是一个矩阵乘法运算。对于I420数据,就是把YV12数据的U、V数据在内存中的位置对调,其他处理和YV12一样。
  一般ffmpeg解码后的数据类型都是I420,即YUV420P,OpenGL没有提供直接渲染yuv的接口,我们可以通过可编程渲染管线,利用多重纹理将Y、U、V纹理分别传入,在片元着色器GL_FRAGMENT_SHADER中将yuv进行矩阵转化成RGB,然后进行渲染。YUV是一种颜色编码格式,常用的格式有YUV444,YUV422P,YUV420P,YUV420SP等。

OpenGL中有两种shader:

vertex shader(顶点着色器):
  vertex shader在每个顶点上都执行执行一次,通过不同世界的坐标系转化定位顶点的最终位置。它可以数据给fragment shader,如纹理坐标、顶点坐标,变换矩阵等。
  
fragment shader(片段着色器):fragment shader在每个像素上都会执行一次,通过插值确定像素的最终显示颜色。

猜你喜欢

转载自blog.csdn.net/ShareUs/article/details/89060932
今日推荐