涉及硬件的音视频能力,比如采集、渲染、硬件编码、硬件解码,通常是与客户端操作系统强相关的,就算是跨平台的多媒体框架也必须使用平台原生语言的模块来支持这些功能
本系列文章将详细讲述移动端音视频的采集、渲染、硬件编码、硬件解码这些涉及硬件的能力该如何实现,其中的示例代码,在我们的 Github 仓库 MediaPlayground 中都能找到,与文章结合着一起食用,味道更棒哦
本文为该系列文章的第 5 篇,将详细讲述上一篇文章中 OpenGL 的代码为什么要那样写以及与 OpenGL 相关的部分基础原理,对应了我们 MediaPlayground 项目中 SceneVCVideoRenderOpenGLES 涉及到的内容
往期精彩内容,可参考
音视频基础能力之 iOS 视频篇(一):视频采集
音视频基础能力之 iOS 视频篇(二):视频硬件编码
音视频基础能力之 iOS 视频篇(三):视频硬件解码
音视频基础能力之 iOS 视频篇(四):使用OpenGL进行视频渲染(上)
前言
还没看过上一篇文章的小伙伴,强烈建议把上一篇文章与本篇结合起来一起看,更能方便理解
音视频基础能力之 iOS 视频篇(四):使用OpenGL进行视频渲染(上)
关键细节
渲染管线
在上一篇文章的“宏观流程”章节,我们提到了渲染管线的概念,当时没有深入介绍,而是将它当做一个黑盒。在本篇中,先来详细介绍下渲染管线
有一张渲染管线的图在网络上流传很久了,就是下面这个,我第一次看到它,是在 LearnOpenGL 这个教程里
图中蓝色部分代表我们可以自定义的部分,看到顶点着色器和片段着色器,是不是很熟悉,上一篇文章讲着色器程序时就说到了这两种着色器,在之前的例子中也的确进行了自定义
用比较严谨的说法,简单一句话概括渲染管线的功能,就是接受一组 3D 坐标,然后把它们转变成 2D 像素输出,其中的每一个模块的输入都是上一个模块的输出,下面来简单介绍每个模块的功能
- 顶点着色器:进行 3D 坐标的转化,到此为止就不用深究了,从示例代码里也可以看出,没有太多复杂的东西
- 几何着色器:非必需,先不讲,非本文重点,有兴趣可自行研究
- 图元装配:将坐标点组成图形
- 光栅化:将图形映射为像素(按照上一篇文章的类比,就是把图形画在画纸上)
- 片段着色器:确定每个像素点采用什么颜色(按照上一篇文章的类比,就是在画纸上进行填色)
- 测试与混合:先不讲,非本文重点,有兴趣可自行研究