当前位置: 首页 > article >正文

[6]Opengl ES预览摄像头

    术语:
    VertexShader:顶点着色器,用来描述图形图像位置的顶点坐标;
    FragmentShader:片元着色器,用来给顶点指定的区域进行着色;
    Vertex:顶点
    Texture:纹理,给顶点区域进行渲染的材质,比如图像等;

    这一节通过前面学习的知识,我们直接采用纹理用Opengl ES来对摄像头进行预览,要实现这个功能,需要解决如下问题:
    1)摄像头数据怎么采集到纹理?
    2)摄像头数据更新时怎么收到通知?
    3)采集到的摄像头数据纹理渲染到屏幕?

    首先,我们要明白,摄像头采集到的视屏数据格式一般是YUV的,而Opengl ES能处理的数据是RGB格式的,那怎么样直接到把摄像头数据采集到纹理呢?还记得前面我们讲过,Opengl ES2.0有两种类型的纹理:GL_TEXTURE_2D和GL_TEXTURE_EXTERNAL_OES。而GL_TEXTURE_EXTERNAL_OES这种类型纹理就是处理这种格式转换的,摄像头采集的数据可以直接放到GL_TEXTURE_EXTERNAL_OES这种类型的纹理。
    解决了摄像头数据映射纹理的问题,下面看下实现Opengl ES预览摄像头数据的流程图:


    1. 没错,SurfaceTexture就是摄像头到纹理的数据通道,通过把承载纹理的SurfaceTexture对象设置给摄像机Camera,在底层Camera就会源源不断的把数据采集到SurfaceTexture承载的纹理上,关键代码如下:
    int textureId = GLES20.glGenTexture();
    SurfaceTexture texSurface = new SurfaceTexture(textureId);
    camear.setSurfaceTexture(texSurface);
    老规矩,上面的代码仅仅是说明流程的伪代码,详细代码看对应工程的说明。
    2. 摄像头对应的数据映射到纹理后,接下来我们要接收摄像头源源不断的一帧一帧的数据,通过给SurfaceTexture设置侦听回调接口,当有摄像头数据到达时,我们可以收到通知,代码片段如下:
    texSurface.setFrameAvaiableListenre();
    
    3. 收到数据到达消息后,需要通过调用texSurface.updateTexImage()来把数据更新到纹理,这里要注意,不能直接在回调接口调用此方法,因为这个方法不一定是创建纹理的线程调用,换句话说,此方法必须在创建纹理的线程里调用,具体为什么前面讲过了,这里再提一下,因为涉及到Opengl ES的API调用都必须在当前线程关联的EGLContext上操作,因为EGLContext保存了所有调用的状态,好看,下面是代码片段:
    
    4. 把纹理渲染到屏幕,这里流程和渲染一般的纹理差不多,区别就是片元着色器里的纹理对象是samplerExternalOES,而不是普通的sampler2D,片元着色器代码如下:
    #extension GL_OES_EGL_image_external : require
    
precision mediump float;
    
uniform samplerExternalOES texture; // 定义扩展的的纹理取样器
    
varying vec2 vTexCoor;
    

void main () 
    {
    
       vec4 color = texture2D(texture, vTexCoor);
    
       gl_FragColor = color;
    
}
    到这里,我们就完成了使用Opengl ES的纹理来实现摄像头的视屏预览功能,接下来的章节,我会在此基础上采用FBO实现以及摄像头在多个Surface上预览等功能。


    


http://www.kler.cn/news/318948.html

相关文章:

  • 徐州网站建设的最新趋势与技术
  • 无人机之编程基础原理
  • 接口测试Postman关联,断言,前置,参数化用法
  • 《AI设计类工具系列之三——Magic Design》
  • 程序设计中,day 与 date 这2个单词的区别
  • Unity的Text组件中实现输入内容的渐变色效果
  • Scanner流程控制语句
  • 【kafka-03】springboot整合kafka以及核心参数详解
  • 代码随想录Day17 图论-2
  • PyCharm 的安装和配置
  • 《机器学习》周志华-CH8(集成学习)
  • yolov8环境安装
  • apache paimon简介(官翻)
  • 【第十三章:Sentosa_DSML社区版-机器学习之聚类】
  • 共享单车轨迹数据分析:以厦门市共享单车数据为例(六)
  • 《开题报告》基于SpringBoot的交通管理系统的设计与实现+学习文档+答辩讲解视频
  • 9.25今日错题解析(软考)
  • Error: one input ui-file must be specified(问题已解决)
  • Nature Communications|一种快速响应的智能可穿戴嗅觉接口(可穿戴电子/柔性电子/人机交互)
  • 直播平台美颜功能开发方案:基于视频美颜SDK的集成详解
  • vue3 + ts + vite 初始化 cesium
  • 携手SelectDB,观测云实现性能与成本的双重飞跃
  • STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度
  • 基于springboot垃圾分类网站
  • 这样做PPT也太酷了吧,27.9kstar,适合开发者的ppt工具推荐
  • Spring Boot 点餐系统:提升您的餐饮体验
  • Cannot solve model: no CPLEX runtime found.【macOS系统下问题解决】
  • c# 将调试信息到VS输出窗口
  • 飞驰云联FTP替代方案:安全高效文件传输的新选择
  • 机器学习_神经网络_深度学习