这是我参与8月更文应战的第2天,活动详情查看:8月更文应战

前面一篇介绍了运用camerax 和 PreviewView进行预览并获取一帧yuv图画的进程。本篇扼要介绍一下使Opengles进行相机数据的预览。

Opengles在安卓中版别

Android 可通过开放图形库 (OpenGL)(特别是 OpenGL ES API)来支撑android电子市场高性能 2D 和 3D 图形。OpenGL 是一种跨途径的图形变量min表明什么类型的变量 API,用于为 3D 图形处理硬变量英文件指定标准的软件接口。OpenGL ES 是 OpenGL 标准的一种方法,适opengles3.1扩展包用于嵌入式设备。Android 支撑多版 OpenGL ES API:

  • OpenGL ES 1.0 和 1.android电子市场1 – 此 API 标准受 An软件droid 1.软件工程0 及更高版其他支撑。
  • OpenGL ES 2.0 – 此 APIopengl烘托gpu怎样设置 标准受 Android 2软件商铺装置.2(API 等级 8)及更高版其他支撑。
  • OpenGL ES 3.0 – 此 API 标准受软件库 Android 4.3(API 等级 18)及更高版其他支撑。
  • OpenGL ES 3.1 – 此 API 标准受 Android 5软件接口是什么意思啊.0(API 等级 21)及更高版其他支撑。

camerex 结合 GlSurfac变量之间的联系eView 完结预览

//打开相机
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
caandroid/yunosmeraProvandroid下载iderFuture.addListener(Runnable {
bindImage(cameraProviderFuture)
}, ContextCompat.getMainExecutor(topengles3.1是什么his))
//camerax相关GlSurfaceView
private fun bindImage(cameraProviderFuture: ListenableFut软件接口测验ure<Process软件库CameraProvider>) {
cameraProvider变量min表明什么类型的变量 = cameraProviderFuture.get()
preview = Preview.Builder().buil软件库d()
try {
val imageCapture = ImageCapture.Builder().build()
gl_view.at软件接口是什么tachPreview(preview)
cameraProvider?.unbindAll()
val camera:Camera? = cameraProvider?.bindToLife变量与函数cycle(this, cameraSelector,imageCapture ,preview变量类型有哪些)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}
//相机和opegles共用一个纹路
public void attachPreview(Preview preview) {
preview.setSurfaceProvider(new Preview.Sur软件接口图faceProvider() {
@Override
public void onSurfaceRequested(@NonNullopengl版别过低怎样办 SurfaceRequest request) {
mResolution = request.getResolution();
//需求给纹路设置宽高,否则画面可能会很模糊
surfaceTexture.setDefaultBufferSize(mResolution.getWidth(),mResolution.getHeight());
Surface surface = new Surface(surfaceTexture);
req软件接口类型有哪些uest软件接口方法.provideSurf软件接口需求怎样写ace(surface, exe软件工程cutor, new Consumer<SurfaceReq软件接口调整cpu电压uest.Result>() {
@Override
public void accept(SurfaceRequest.Result result) {
surface.rele变量泵ase();
surfaceTexture.release();
}
});
}
});
}

运用Opengles需求设置版别和设置Rendandroid是什么手机牌子er

setEGLContextClientVersi变量泵on(3);
setRenderer(this);
// 设置非接连烘托,需求调变量提高用 requestRender 更新画面
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

在render中处理数据

    @Override
public void o软件工程专业nSurfaceCreated(GL10 gl, EGLConfig conandroid平板电脑价格fig) {
int[] textureIds = new int[1];
GLES30.glGenTextures(1, ids, 0);
textureId = textureIds[0];
surfaceTexture = new SurfaceTexture(textureId);
surfaceTexture.setOnFrameAvai变量类型有哪些lableListener变量泵(thi软件接口规划s);
directDrawer = new DirectDrawer(textureId);
}
@Override
pubopengl是什么意思lOpenGLic void onSurfaceChanged(GL10 gl, int width, int height) {
GLES30.glViewport(0, 0, width, height);软件测验
}
@Override
public void onFraandroid下载meAvailable(SurfaceTexture surfaceTexture) {
requestRender();
}
public class DirectDrawer {
//极点着色器 attribute:输入矩阵变量, varyinAndroidg:传数据给片元着色器
private final String vertexShaderCode =
"attribute变量之间的联系 vec4 vPosition;" +  //极点矩阵
"attri软件接口图bu变量之间的联系te vec2 inputTextureCoandroid/yunosordinate;" + //纹路矩阵
"varying vec2 textureCoordinate;" +
"void main()" +
"{"+
"gl_Position = vPosition;"+
"textureCoordinate = inputTextureCoordinate;" +
"}";
//变量类型有哪些片元着色器,留心此处变量是什么意思必须用samandroid系统plerExternalOES 才华变量min表明什么类型的变量烘托到相机
private final String fragmentShade软件接口类型有哪些rCode =
"#extension GL_OES_EGL_i软件接口怎样写mage_external : requiren软件接口类型有哪些"+
"precision mediump float;" +  //声明float型精度
"varying vec2 textureCoordinate;n"变量提高 +
"uniform samplerExternalOES s_texture;n" +
"void main() {" +
"gl_FragColor = texture2D( s_texture, textur软件库eCoordinate );n" +
"}";
private FloatBuffer vertexBuffer, textureVerticesBuffer;
private变量与函数 ShortBuffer drawListBuffer;软件库
priva变量与函数te final int mP变量的界说rogram;
pri软件商铺装置vate int mP变量泵ositionHandle;
private int mTextureCoordHandle;
//short占2个字节
private static final i变量名的命名规则nt COORDS_PER_VERTEX = 2;
//float占4个字节
private fin软件工程专业al int vertexStride = COORDopengl三重缓冲开不开S_PER软件商铺_VERTEX * 4;
//极点矩阵
static float squareCandroid下载装置oords[] = {
-1.0f,  1.0f,
-1.0f, -1.0f,
1.0f, 1.0f,
1.0f,  -1.0f,
};
//纹路矩阵,留心坐标转化,按原始坐标会朝左旋转90度
static float textureVertic软件工程就业方向及远景es[] = {
0f,1f,
0f,0f,
1f,1f,软件技术
1f,0f
};
private int texture;
p软件ublic DirectDrawer(int texture)
{
this.android手机texture = texture;
ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloopengl版别过低怎样办atBuffer();
vertexBuffer.put(squareCoords);
vertexBuffer软件接口.position(0);
// 将数据转为 Flandroid是什么手机牌子ostBuffer
ByteBuffer dlb = ByteBuffer.alloc软件测验ateDirect(drawOrder.length * 2);
dlb.order(ByteOrder.natandroid是什么手机牌子iveOrder());
drawList软件库Buffer = dlb.asShortBuffer();
drawListBuffer.put(drawOrder);
drawListBuffer.position(0);
ByteBuffer bb2 = ByteBuffer.allocateDiopengl三重缓冲开不开rect(textureVert软件接口方法ices.length * 4);
bb2.ordeandroid下载装置r(ByteOrder.native软件技术Order());
textureVopengl和vulkan哪个好erticesBuffer = bb2.asFloatBuffer();
textuandroid平板电脑价格reVerticesBuffer.put(textureVer软件工程专业tices);
textureVerticesBuffer.position(0);
//创建着色器
in软件接口是什么意思啊t vertexShader    = loadShad软件接口类型有哪些er(GLES30.GL_VERTEX_SHADERandroid电子市场, vertexShaderCode);
int fragmentShader  = loadShader(GLES30.GL_FRAGMENT_SHADER, fragmentShaderCode);
//链接着色器
mProgram = GLES30.glCreateProgra变量泵m(android什么意思);             // crea软件接口需求怎样写te empty OpenGL ES Prog软件工程专业ram
GLES30.glAt软件tachShader(mProgram, vertexShader);   // add the vertex shader to program
GLES30.glAttachShader(mProgram, fragmentShader); // add the fra软件技术专业gment sh变量的界说ader to program
GLES30.glLinkProgram(mProgram);                  // creates OpenGL ES program executables
}
//将极点数据和纹路数据传给程式烘托纹路
public void draw(float[] mtx){
GLES30.gopengl烘托gpu怎样设置lUseProgram(mProg变量提高ram);
GLES30.android什么意思glActiveTexture(GLES30.android电子市场GL_TEXTURE0);
GLES30.glB软件工程indTexture(GLES11Ext.GL_TEX软件接口规划TURE_EXTERNAL_OES, texture);
mPositionHandle = GLES30.glGetAttriOpenGLbLocation(mProgra软件应用m, "vPosition");
GLES30.glEnableVertexAttribArray(mPositionHandle);
GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer);
mTextureCoordHandle = GLES30.glGetAttr软件商铺ibLocation(mProgram,android/yunos "inputT变量类型有哪些extureCoordinate");
GLES30.glEnableVertexAttribArray(mTextureCoordHandopengl版别过低怎样办le变量提高);
GLES30.glVertexAttribPointer(mTextureCoordHaopengl烘托gpu怎样设置n软件接口需求怎样写dle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStr软件接口是什么意思啊ide, textureVerticesBuffer);
//GLopengl是什么意思_TRIANGLE_STRIP这儿运用的是三角形片带,只需求4个极点就可以制作一个矩软件接口调整cpu电压形
//GL_TRIANGLES 三角形 制作需求6个极点
GLES30.glDrawArrayandroid下载s(GLES30.GL_TRIANGLE_STRIP,0,4);
GLES30.glDisableVertexAttribArray(mPositi软件库onHandle);
GLES30.glD软件接口isableVertexAttribArray(mandroid电子市场Texandroid平板电脑价格tureCoordHandle);
}
private  int loadShader(int type, String sAndroidhaderCode){
int shader = GLES30.glCreateShader(type);
GLES30.glShaderSource(shader, shaderCode);
GLEandroid平板电脑价格S30.glCompileShader(shader);
return shader;
}
}

这儿软件工程专业运用了只做了相机预览处理,作用如下图:

音视频开发之相机预览及简略滤镜
下面可软件工程就业方向及远景以做一点矩阵转化,添opengl版别过低怎样办加滤镜作用

private final String fragmentShaandroid下载装置derCode =
"#extension GL_OES_EGL_image_external : requiren"+
"precision mediump float;" +  //声明float型
"varying vecOpenGL2 textureCoordinate;n" +
"uniform samplerExteropengl版别过低怎样办nalOopengles3.1扩展包ES s_text软件工程专业ure;n" +
"void main() {" +
"mediump vec4 textureColoopengl烘托gpu怎样设置r = texture2D(s_textandroid的drawable类ure, textureCoordinate);n"+
"float gray = textureColor.r * 0.2125 + textureColor.g * 0.7154 + textureCoandroid手机lor.b * 0.0721;n"+
"gl_FragColor =  vec4(gray, gray, gray, textureColor.w);"+
"}变量的界说";

作用如下软件接口怎样写图:

音视频开发之相机预览及简略滤镜

ps:本人在纹路坐标的转化尝试了多种组合才将图形变正常,如果有具体opengles3.1扩展包的转化原理,望在评论区指出,不甚感谢