1、背景介绍
视频是一种能够直观、准确的传递信息的媒介,它可以有效提升用户的感官体验,丰富信息的传递形式。以视频的方式进行房产介绍和政策解读,既可以减轻经纪人的带客压力,还能够拓展顾客获取相关信息的渠道。为了制作独具匠心的视频素材,创作者通常会在视频中穿插一定的动画效果以提升视频的视觉冲击力,但是这不仅要求制作人员具备扎实的设计基础,而且需要熟练掌握专业视频编辑软件的使用技巧,这无疑会提高视频生成的技术要求,降低产出效率。因此我们尝试简化特效制作流程,使用户通过简单的属性点击选择就能够生成相应的特效。
2、OpenGL名词解释
视频工厂中的视频云剪辑主要是在后端进行视频合成,所以我们选择利用OpenGL渲染引擎进行相关动画特效的渲染。本文主要介绍一种利用OpenGL进行视频动效生成的方法,通过这种方式可以降低对制作人员的技术要求,提高视频的生产效率。本文主要包含:OpenGL名词解释,OpenGL渲染流程;OpenGL在视频动效生成中的实践;OpenGL使用疑难总结。首先阐述一下本文所涉及的名词含义:
DRI (Direct Rendering Infrastructure, 基层直接渲染) 是允许以直接、有效的方式访问设备中图形硬件的方法,DRI硬件驱动程序一般是显卡生产商提供的显卡驱动程序。
DRM (Direct Rendering Manager, 直接渲染管理)是负责直接与设备显卡交互的linux 内核子系统。DRM支持对图形硬件资源的同步功能,这些资源包括命令队列,显卡寄存器,显存等,确保多个OpenGL程序进程并发访问硬件设备的时候不会相互干扰
VBO (Vertex Buffer Object, 顶点缓冲对象):顶点数组数据保存在CPU内存中,在渲染的过程中需要进行从CPU到GPU的数据同步,如果数据量大或者频繁渲染的时候会造成严重的性能问题,所以在GPU里面提前分配一块显存,将顶点数据直接传入到显存里面,VBO就是管理该显存的对象。
VAO (Vertex Array Object, 顶点数组对象): 是一种特殊类型对象,它封装了与顶点处理有关的所有数据,记录顶点缓存区的引用,以及顶点的各种属性的布局而不是实际的数据,其结构类似于图1。
图 1
顶点着色器:顶点着色器是OpenGL中用于计算顶点属性的程序,主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标从局部坐标系转换到归一化坐标系的运算,也是在顶点着色器里面完成的。
图 2 顶点着色器
片段着色器:片段着色器是OpenGL中用于计算片段颜色的程序,它输出的值是由该图元顶点着色器运算输出的值根据像素位置进行插值得到的。若是有纹理则利用采样器从设定好的纹理中获取像素值。
图 3 片段着色器
3、OpenGL渲染流程
图 4
OpenGL(Open Graphics Library)是由 SGI 公司开发的一套标准的计算机图形接口。其实现方法与底层硬件无关, 屏蔽了不同硬件接口所带来的差异, 对不同操作系统提供了标准的编程接口,使得图形应用程序在多操作系统下具有良好的移植性, 广泛应用于渲染二维或三维动效。2006年7月,OpenGL架构评审委员会投票决定将OpenGL API标准的控制权交给Khronos Group。
现实生活中绘制三角形可能很简单,首先在画板上面铺设画布,然后先绘制三个顶点,确定三角形的位置和大小等信息。接下来连接顶点,并在三角形内填充颜色即可。但是如果把这个过程完全交给计算机利用OpenGL进行渲染的时候就没有描述的那么简单了,因为渲染涉及一系列复杂的流程如图4所示。
状态初始化
在OpenGL应用程序调用OpenGL指令之前,首先需要创建一个OpenGL上下文,这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执行的基础。由图4可以了解到OpenGL程序必须借助DRI驱动程序以及DRM来访问图形硬件。
默认帧缓冲创建
OpenGL是图形API,因此所有的运算结果最终都是需要以图像的形式进行输出。那么绘图必然就需要有一块画板,而帧缓冲区就是OpenGL中的画板。但是它并不是实际存储数据的对象,而是通过定义一个虚拟窗口来接收并存储相关处理数据,类似画画的时候,需要在画板上放一块画布,才能进行绘画,如果没有调用OpenGL提供的帧缓冲对象进行帧缓冲的管理,那么就会使用OpenGL默认的帧缓冲区。
顶点数组定义
准备好了画布之后,就要开始画图了。画图一般是先画好图像的骨架,然后再往骨架里面填充颜色,这对于 OpenGL也是一样的。顶点数据就是要画的图像的骨架,OpenGL中的图像都是由图元组成,它主要有3种类型的图元:点、线、三角形,并通过顶点缓冲对象和顶点数组对象进行管理。
图形渲染
接下来是着色器程序(Shader), 它提供对图形运算的精细操作,具备各式各样的处理能力,极度丰富了图形OpenGL所能实现的效果。常见的着色器主要有顶点着色器(VertexShader),片段着色器(FragmentShader)。通过编译、链接等步骤,生成了着色器程序(glProgram),着色器程序同时包含了顶点着色器和片段着色器的运算逻辑。在OpenGL进行绘制的时候,首先由顶点着色器对传入的顶点数据进行运算,而动画效果中的动态效果就是在该过程中实现。再通过图元装配,将顶点转换为图元。然后进行光栅化,将图元这种矢量图形,转换为栅格化数据。最后,将栅格化数据传入片段着色器中进行运算。片段着色器会对栅格化数据中的每一个像素进行运算,并决定像素的颜色,也可以在这个阶段将某些像素丢弃,这就是相当于绘画中的填色过程。
结果展示
最终将渲染的结果输出到渲染缓冲区,常规的OpenGL程序至少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区数据进行交换,实现图像在屏幕上的显示。
4、OpenGL在视频动效生成中的实践
利用OpenGL在视频中生成动画效果主要是FFmpeg和OpenGL结合来实现的,FFmpeg是一套非常知名且开源的音视频处理工具,它包含了开发完成的工具软件、封装好的函数库以及源代码(如图5所示)供我们使用。FFmpeg提供了非常强大的功能,可以完成视频采集、音视频的编码、解码、转码、后处理(抓图、水印、封装/解封装、格式转换等)等操作。