音视频开发系列(39)OpenGL ES 实时滤镜

本文介绍了如何在Android中利用OpenGL ES实现Camera预览的实时滤镜效果。通过SurfaceTexture和外部纹理GL_TEXTURE_EXTERNAL_OES,将Camera采集的数据先处理再渲染,详细阐述了创建Camera、加载GLSL、设置滤镜和处理预览数据的步骤。同时,文章中提到了遇到的问题,如视图比例调整和uniform变量绑定错误,并给出了相应的解决方案。
摘要由CSDN通过智能技术生成

一、基本知识介绍

**外部纹理是什么?**

    public static native void glBindTexture(
        int target,
        int texture
    );

我们在前面几篇中target一直是GL_TEXTURE_2D,即一张纹理图片,直接进行渲染。而在播放视频或者Camera预览 对数据进行滤镜、特效处理后在渲染到屏幕上而不是直接渲染到屏幕,这是就需要用到OES外部纹理,GLES11Ext.GL_TEXTURE_EXTERNAL_OES

SurfaceTeture是什么?

我们在前面章节介绍Camera预览时使用的是SurfaceHolder进行的preview。

SurfaceTexture 类是在 Android 3.0 中引入的,它对图像流的处理并不直接显示,而是转为GL外部纹理,可用于图像流数据的二次处理(如Camera滤镜,特效等)

SurfaceTexture从图像流(Camera预览、视频解码)中获得帧数据,调用updateTexImage(),根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象,接下来,就可以像操作普通GL纹理一样操作它了。

二、流程

Camera采集数据后不直接显示到屏幕上,而是先对这个图像做滤镜处理,即先渲染在一个外部纹理上,处理完之后在显示在屏幕上。

OpenGL纹理绘制的基本流程。

  1. 创建Camera

  2. 创建和加载glsl,创建编译链接program, 获取location

  3. 创建外部纹理、绑定纹理、设置参数

  4. 根据创建的纹理id生成一个SurfaceTexture

  5. 设置Camera通过SurfaceTeture方式而不是SurfaceHolder进行预览

  6. Camera将预览数据输出至此SurfaceTexture上,将一帧预览数据推送给外部纹理上

  7. 给此纹理添加滤镜

  8. 处理后的数据通过OpenGL ES绘制出来

三、实践:Camera预览添加实时滤镜(原图、黑白、冷暖色)

1. 创建Camera

private void initCamera(int cameraId) {
        curCameraId = cameraId;
        mCamera = Camera.open(curCameraId);
        Log.d(TAG,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值