美文网首页
三、MagicCamera3#OpenGL滤镜

三、MagicCamera3#OpenGL滤镜

作者: YongtaoHuang | 来源:发表于2019-11-09 15:29 被阅读0次

    OpenGLJniLib

    OpenGLJniLib是我们通过kotlin使用OpenGL的核心衔接处

    kotlin代码中使用到OpenGLJniLib的地方如下图:


    OpenGLJniLib.png

    kotlin一共调用了8个函数。

    object OpenGLJniLib{
        init {
            System.loadLibrary("magicjni")
        }
        /**
         * 初始化magicBaseView
         */
        external fun magicBaseInit(surface:Surface, width:Int, height:Int, manager: AssetManager):Int
        /**
         * 绘制
         */
        external fun magicBaseDraw(matrix:FloatArray)
        external fun magicBaseRelease()
        /**
         * 相机滤镜创建
         */
        external fun magicFilterCreate(surface:Surface,manager: AssetManager):Int
        external fun magicFilterChange(width:Int,height:Int)
        external fun magicFilterDraw(matrix:FloatArray,isTakePhoto:String)
        external fun magicFilterRelease()
        /**
         * 获取滤镜列表
         */
        external fun getFilterTypes():IntArray
        /**
         * 设置滤镜类型
         */
        external fun setFilterType(type:Int)
        /**
         * 摄像头保存图片
         */
        external fun savePhoto(address:String):Boolean
    }
    

    C++部分代码

    cpp.png

    magicjni.cpp

    magicjni.cpp和OpenGLJniLib.kt有一一对应的关系,是OpenGLJniLib中声明的函数的具体实现。

    Camera

    Camera是有关摄像头的底层驱动和渲染方案。

    EGL

    依赖于libEGL.so
    作为Khronos组织为开发内容所提供的API家族的一员,平台无关的API-EGL可以用于管理绘图表面。EGL提供以下机制:
    1、与设备的原生窗口系统通信
    2、查询绘图表面的可用类型和配置
    3、创建绘图表面
    4、在OpenGL ES 3.0和其他图形渲染API之间同步渲染
    5、管理纹理贴图等渲染资源
    EGL提供了OpenGL ES 3.0和运行机器上的原生窗口系统之间的结合,两者之间有通信渠道。

    Filter

    依赖于libGLESv3.so
    内部通过OpenGL语言实现各类型滤镜。

    utils

    一个工具包类,主要实现更种数学运算。

    通过JNI调用了C++的代码

    CameraFilterSurfaceCallbackV2中这一行代码将这个SurfaceView和这个应用的assets(内部主要包含glsl语言)传递给C++底层操作了。

    OpenGLJniLib.magicFilterCreate(surface,BaseApplication.context.assets)
    

    这里通过JNI调用了C++的代码

    CameraFilter *glCameraFilter = nullptr;
    AAssetManager *aAssetManager = nullptr;
    
    //相机滤镜surfaceView初始化的时候创建
    JNIEXPORT jint JNICALL
    Java_com_cangwang_magic_util_OpenGLJniLib_magicFilterCreate(JNIEnv *env, jobject obj,
                                                            jobject surface,jobject assetManager) {
        std::unique_lock<std::mutex> lock(gMutex);
        if(glCameraFilter){ //停止摄像头采集并销毁
            glCameraFilter->stop();
            delete glCameraFilter;
        }
    
        //初始化native window
        ANativeWindow *window = ANativeWindow_fromSurface(env,surface);
        //初始化app内获取数据管理
        aAssetManager= AAssetManager_fromJava(env,assetManager);
        //初始化相机采集
        glCameraFilter = new CameraFilter(window,aAssetManager);
        //创建
        return glCameraFilter->create();
    }
    

    相关文章

      网友评论

          本文标题:三、MagicCamera3#OpenGL滤镜

          本文链接:https://www.haomeiwen.com/subject/buegvctx.html