利用Shader 将 RGBA 转成 NV21 进行 glReadPixels 读取和直接使用 HardwareBuffer 进行读取, 通过测试 5k 分辨率的图像,发现两种方式性能差异并不大。 完整实现代码见项目:https://github.com/githubhaohao/NDK_OpenGLES_3_0,右上角选择 RGB to NV21 demo 。
7 Shader实现YUV中的Y分量计算转化 6 OpenGLES2实现绘制RGB数据 5 OpenGLES2环境建立 4 CPU实现RGB到YUV的转换 3 RGB图片读取 2 开发环境建立 10 代码优化,将YUV数据同时计算输出 拼课》》》 wwit1024
,右上角选择 RGB to NV21 demo 。
// RGB to YUV的颜色转换系数 + "uniform vec4 coeffs;\n" + "\n" + "void main() {\n" // 虽然alpha通道值总是1,我们可以写成一个vec4xvec4的矩阵乘法,但是这样做实际 // 导致了较低帧率,这里用了vec3xvec3乘法。 // tc是texture coordinate,可以理解成输出纹理坐标 + " gl_FragColor.r = ...
Solved: The application developed by Unity engine uses computer shader to convert RGB images into YUV data。 Compute Shader code : Texture2D
在实际处理的时候,会把原来的RGB颜色编码格式转换成YUV颜色编码格式。YUV,是一种常用于影像处理组件的颜色编码格式。其中,Y代表明亮度(luma; brightness),而U和V分别存储色度(色讯; chrominance; color)部分。转换后,我们只需要对比UV两个通道,这样能够更方便地进行处理。
上一篇中,我是用一个RGB格式的纹理来存储每一帧的画面,其中纹理为m_FrameWidth * m_FrameHeight大小,这样,在内存中,就必须要先对YUV的数据进行排序,然后才能当做RGB的数据格式传给纹理内存。我们发现对一个很大帧的图片进行数据重新排序会花费很多时间,为了减少这个时间,当然可以用汇编语言来进行这个排序的操作。然...
对于这条公式,我后来查找到该公式是RGB转YUV的BT709明亮度转换公式,是基于人眼感知的图像灰度处理公式。这条公式通过计算每个像素RGB值对应的灰度值,来把RGB彩色图像转换为灰度图。 YUV颜色模型起初是用于解决彩色电视和黑白电视兼容性问题,其中的Y值表示明亮度,也是灰阶值,这里的luminance值其实就是这个Y值。
上一篇中,我是用一个RGB格式的纹理来存储每一帧的画面,其中纹理为m_FrameWidth * m_FrameHeight大小,这样,在内存中,就必须要先对YUV的数据进行排序,然后才能当做RGB的数据格式传给纹理内存。我们发现对一个很大帧的图片进行数据重新排序会花费很多时间,为了减少这个
饱和度调节中一个重要参数luminanceWeighting,向量算法是:0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b。该公式是RGB转YUV的BT709明亮度转换公式,是基于人眼感知的图像灰度处理公式。通过dot算出纹理灰度值,然后通过mix函数混合,通过saturation调节饱和度。