故事的背景要从之前的FFMpeg系列文章演示代码说起,有大佬留言工程中的NV12渲染shader中存在一个问题


确实是uv的取值写反了,渲染下来图像的颜色会不对
之前这个shader并没有做过测试,趁着修复这个issue的机会赶紧补上一个Test Case
准备Test Case
渲染相关的逻辑都在librender内,新增RenderTestActivity

运行下useRenderTestActivity,效果如下,可以看到画面颜色异常

RenderTestActivity的逻辑非常简单

NV12的数据我们通过ffmpeg来生成

修复渲染颜色异常
在NV12Drawer中,UV纹理采用的是GL_LUMINANCE_ALPHA

查看官方文档对这个format的解释

结合NV12的YUV排布可以得到U数据从纹理的rgb任意通道读取,V数据从纹理的a通道读取,运行Test Case后观察到效果正常

RenderManager简介
渲染模块librender的对外入口是RenderManager,内部做了一些常用格式的渲染支持、切换和缓存管理,目前能力虽然比较简陋,但是后续还会逐步迭代、重构和支持Vulkan(Vulkan简介)
用法也很简单,可以参考RenderTestActivity

上面NV12渲染的流程控制在draw()中,会先将NV12数据绘制到FBO,中间可以加一些filter处理,最后再draw上屏

完整代码可以点击文末的"阅读原文"获取,欢迎各位大佬提issue和PR
~~END~~