Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍

Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍

Android OpenGL+Camera2渲染(2) —— OpenGL实现Camera2图像预览

Android OpenGL+Camera2渲染(3) —— 大眼,贴纸功能实现

Android OpenGL+Camera2渲染(4) —— 美颜功能实现

Android OpenGL+Camera2渲染(5) —— 录制视频,实现快录慢录

什么是OpenGL?

      Open Graphics Library     图形领域的工业标准,是一套跨编程语言、跨平台的、专业的图形编程(软件)接口。它用于二维、三维图像,是一个功能强大,调用方便的底层图形库。     与硬件无关。可以在不同的平台如Windows、Linux、Mac、Android、IOS之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。

版本介绍

OpenGL ES 1.0 和 1.1 :Android 1.0和更高的版本支持这个API规范。

OpenGL ES 2.0 :Android 2.2(API 8)和更高的版本支持这个API规范。(2.0 广泛使用)

OpenGL ES 3.0 :Android 4.3(API 18)和更高的版本支持这个API规范。

OpenGL ES 3.1 : Android 5.0(API 21)和更高的版本支持这个API规范。

 

OpenGL 的使用需要配置EGL环境,在Android平台下,可直接使用GLSurfaceView,GLSurfaceView内部已经配置好了EGL环境。

 

GLSurfaceView

       继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。

       管理Surface与EGL   

       允许自定义渲染器(render)。     

       让渲染器在独立的线程里运作,和UI线程分离。      

       支持按需渲染(on-demand)和连续渲染(continuous)。

 

OpenGL是一个跨平台的操作GPU的API,但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层, EGL就是连接OpenGL ES和本地窗口系统的接口,引入EGL就是为了屏蔽不同平台上的区别。

 

OpenGL的工作流程

Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍_第1张图片 OpenGl绘制流程

 

OpenGL中必不可少的两个概念,vertex shader(顶点着色器)和fragment shader(片元着色器)。

顶点着色器:在OpenGL的世界坐标顶点坐标中,三个点确定一个三角形的形状,顶点坐标决定了我们绘制出画面的形状。但这里需要注意OpenGL世界坐标 、纹理坐标 、android屏幕坐标三个概念。下边介绍。

片元着色器:决定了绘制出图像画面的颜色。比如我们预览camera采集的图像,就需要把camera离屏buffer的纹理ID传给片元着色器,片元着色器从纹理ID中取出每一个像素值来进行显示。

OpenGL的绘制首先需要经过顶点着色器,进行光栅化(光栅化就是把顶点坐标连接后,途径的像素点进行关联),然后用片元着色绘制预览画面的像素值。

 

OpenGL世界坐标 、纹理坐标 、android屏幕坐标

Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍_第2张图片Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍_第3张图片Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍_第4张图片

 

想要把摄像头数据正常的显示到屏幕上或者使用FBO转换后的图像的方向也是正确的,就需要结合上面这三幅图了。

首先 那FBO是什么呢?

Frame Buffer Object

帧缓冲对象:FBO。默认情况下,我们在GLSurfaceView中绘制的结果是显示到屏幕上,然而实际中有很多情况并不需要渲染到屏幕上,这个时候使用FBO就可以很方便的实现这类需求。FBO可以让我们的渲染不渲染到屏幕上,而是渲染到离屏Buffer中。

也就是我们帧缓存,从一个纹理缓存到另一个FBO的纹理中(比如加美颜滤镜贴纸都需要用FBO)。因为是纹理缓存到纹理上,所以我们就需要把纹理坐标和OpenGL世界坐标对应上。

如:顶点坐标

float[] VERTEXT = {
        -1.0f, 1.0f,
        1.0f, 1.0f,
        -1.0f, -1.0f,
        1.0f, -1.0f
};

纹理坐标:

float[] TEXTURE = {
        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f,
};

 

摄像头图像画到屏幕中,我的顶点坐标和纹理坐标:

顶点坐标

float[] VERTEXT = {
        -1.0f, 1.0f,
        1.0f, 1.0f,
        -1.0f, -1.0f,
        1.0f, -1.0f
};

纹理坐标:

float[] TEXTURE = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f, 1.0f,
        1.0f, 1.0f,
};

 

GLES中的数据类型:

float                 浮点型 vec2                 含两个浮点型数据的向量

vec4                 含四个浮点型数据的向量(xyzw,rgba,stpq)

sampler2D             2D纹理采样器(代表一层纹理)

 

修饰符

attribute 属性变量。只能用于顶点着色器中。 一般用该变量来表示一些顶点数据,如:顶点坐标、纹理坐标、颜色等。

uniforms 一致变量。在着色器执行期间一致变量的值是不变的。与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。

varying 易变变量。是从顶点着色器传递到片元着色器的数据变量。

 

内建函数

texture2D (采样器,坐标)  采样指定位置的纹理

 

内建变量

Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍_第5张图片

 

Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍_第6张图片

你可能感兴趣的:(Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍)