目录

  1. OpenGL ES的简介

  2. OpenGL ES的基本流程和概念

篇外话:本来这篇要写SurfaceView和TextureView相关的,但是没有理解清楚,主要是对于纹理和SurfaceFlinger等认知不足,而纹理又是OpenGL的一个重要概念,所以先开启OpenGL的系列,后面再补上SurfaceView和TextureView。

我第一次接触OpenGL ES是一年前,但是看到OpenGL中各种专业名词和专业术语,感觉云里雾里,虽然按照书中的介绍实现了效果,但是终究还是没有理解。这个系列我们一起对OpenGL ES进行重新学习实践,掌握OpenGL ES 3.0,编写迷人的OpenGL ES 3.0的程序。

下面开始今天的主题。

一、OpenGL ES的简介

OpenGL(Open Graphics Library)是一个跨平台图像程序接口,用于二维和三位图片的渲染。OpenGL ES(Open Graphic Library Embedded Systems)是OpenGL的一个子集,用于手机和嵌入式设备
在android中对OpenGL ES的支持如下

  1. OpenGL ES 2.0 支持android2.2以后的版本

  2. OpenGL ES 3.0 支持android4.3以后的版本

  3. OpenGL ES 3.1 支持android5.0以后的版本
    基于目前android系统占比分布和OpenGL ES的版本使用趋势,我们基于OpenGL ES3.0进行学习实践。

有个问题:OpenGL ES在整个系统中的作用是什么?

通过下面两种图我们可以看到OpenGL ES是CPU和GPU交互的桥梁,是一个Lib

图片来源 OpenGL(一) OpenGL入门

图片来源 [Android官方文档]

那为什么需要OpenGL ES 这个桥梁呐?能不能CPU和GPU直接交互呐?

将数据从一块内存复制到另一块内存中,传递速度是非常慢的,CPU主要处理逻辑控制,GPU在逻辑运算方面比较强大,可以高并行处理图形数据和复杂算法,我们对比看下CPU和GPU的内部结构

图片来源 OpenGL(一) OpenGL入门

二、基本流程和概念

OpenGL ES 3.0 实现了具有可编程着色功能的图形管线,有两个规范组成:OpenGL ES 3.0 API 和 GLSL着色器语言。在学习这些规范之前,我们先了解下相关的基本概念

2.1 渲染的基本流程

图片来源 LearnOpenGL CN

OpenGL在处理Shader时,和其他编译器一样。通过编译、链接等步骤,生成了着⾊器程序(glProgram),着⾊器程序同时包含了顶点着⾊器和⽚段着⾊器的运算逻辑。在OpenGL进行绘制的时候,⾸先由顶点着⾊器对传⼊的顶点数据进行运算。再通过图元装配,将顶点转换为图元。然后进行光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传入⽚段着⾊器中进行运算。⽚段着色器会对栅格化数据中的每⼀个像素进行运算,并决定像素的颜⾊。

2.2 管线

它是一系列数据处理的过程,将应用程序的数据最终转换到渲染的图像。下图展示了OpenGL ES 图形管线

图片来源:《OpenGL ES 3.0 编程指南》

2.3 顶点

OpenGL ES 的基本元素有点、线、三角形,就像盖钢架结构的房子一样,先确定好位置,搭出框架,OpenGL ES 也需要确定好位置即顶点

图片来源 通俗易懂的 OpenGL ES 3.0(一)入门必备知识

关注+后台私信我,领取2022最新最全学习提升资料+面试题,内容包括(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)等等

2.4 纹理

纹理通常是一张图片,也可以用来存储大量的数据,这些数据可以发送到着色器。我们这个章节了解下纹理作为一张图片的意义。
那么为什么需要纹理呐?
我们可以为每个顶点添加颜色来丰富图像的细节,如果想让图形开起来更加有趣真实,我们就必须有足够的顶点从而指定足够多的颜色,但这会产生很多额外开销。使用纹理可以避免这个问题

你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。因为我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。

图片来源LearnOpenGL CN

下面是一张怀旧滤镜的纹理图

2.5 顶点着色器(VertexShader)

顶点着色器一般用来处理图形每个顶点的变换,例如 平移、缩放、旋转、投影等
顶点着色器是OpenGL ES中用于计算顶点属性的程序,每个顶点都会并行的执行一次顶点着色器程序。

2.6 图元装配

图元(Primitive)是点、线、三角形等基本几何对象,图元的每个顶点被发送到顶点着色器处理,而图元装配就是把这些顶点做合成图元

2.7 光栅化

光栅化是把顶点数据转换为片元的过程。将有基本元素(点、线、三角形)组成的几何图元变为二维图像的过程。
这个过程包含两部分内容

  1. 确定视图坐标中哪些区域被基本图元占用

  2. 分配一个颜色值和一个深度值到各个区域

2.8 片段着色器(FragmentShader)

片段着色器又叫片元着色器,用来处理图形中每个像素点颜色计算和填充

2.9 逐片段操作

在逐片段操作阶段,每个片段上会执行 像素归属测试、裁剪测试、模版和深度测试、混合、抖动

在测试阶段之后,如果像素依然没有被剔除,那么像素的颜色将会和帧缓冲区中颜色附着上的颜⾊进⾏混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,一般可以通过像素着色器进行实现,当然性能会⽐比原⽣的混合算法差一些.

收获

  1. 了解OpenGL ES的版本和android系统兼容性

  2. 了解OpenGL ES在手机CPU和GPU之间的桥梁作用

  3. 了解OpenGL ES中顶点、着色器、图元装配、光栅化等基本概念

  4. 了解OpenGL ES的图形管线渲染的流程

感谢你的阅读

音视频开发系列(32)OpenGL ES 基本概念相关推荐

  1. 音视频开发系列(34) OpenGL ES 绘制平面图形

    我们前两篇介绍了OpenGL ES 基本概念和GLSL及Shader的渲染流程,这篇我们开始实战,通过GLSurfaceView加载着色器,来绘制三角形.正方形和直线这些平面图形.在实践过程中遇到的问 ...

  2. 音视频开发系列(41)OpenGL ES粒子效果-烟花爆炸

    通过该篇的实践实现如下效果 一.烟花爆竹场景和属性 在上一篇OpenGL ES粒子系统 - 喷泉的基础上 实现烟花爆炸效果. 在具体实践之前,先来想一想,烟花爆炸的场景和属性 场景:从中心点开始爆炸, ...

  3. 【音视频开发系列】一学就会,快速掌握音视频开发的第一个开源项目FFmpeg

    快速掌握音视频开发的第一个开源项目:FFmpeg 1.为什么要学FFmpeg 2.FFmpeg面向对象思想分析 3.FFmpeg各种组件剖析 视频讲解如下,点击观看: [音视频开发系列]一学就会,快速 ...

  4. 【音视频开发系列】盘点音视频直播RTSP/RTMP推流一定会遇到的各种坑,教你快速解决

    聊聊RTSP/RTMP推流那些坑 1.推流架构分析 2.推流缓存队列的设计 3.FFmpeg函数阻塞问题分析 [音视频开发系列]盘点音视频直播一定会遇到的各种坑,教你快速解决 更多精彩内容包括:C/C ...

  5. 【音视频开发系列】srs-webrtc-janus开源流媒体服务器分析

    全球最牛开源流媒体服务器源码分析 1.如何学习流媒体服务器 2.全球最牛流媒体服务器架构分析 3.我们能从全球最牛流媒体服务器得到什么 [音视频开发系列]srs-webrtc-janus流媒体服务器分 ...

  6. 音视频开发系列-H264编码原理

    H264简介 来自百度百科的介绍: H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式. H.264是ITU-T以H.26x系列为名称命名的 ...

  7. 音视频开发系列(19)玩转 WebRTC 安全通信:一文读懂 DTLS 协议

    在 WebRTC 中,为了保证媒体传输的安全性,引入了 DTLS 来对通信过程进行加密.DTLS 的作用.原理与 SSL/TLS 类似,都是为了使得原本不安全的通信过程变得安全.它们的区别点是 DTL ...

  8. 音视频开发系列(16)技术解码 | SRT和RIST协议综述

    概要 近些年来,互联网行业出现了几波和音视频相关的热潮:VR.短视频.直播等.除了VR因技术成熟度问题,还在蓄势待发,短视频和直播持续热度不减,以各种方式进入新的行业应用领域.视频直播方向,RTMP仍 ...

  9. 音视频开发系列(62)基于FFmpeg实现简单的视频解码器

    一.FFmpeg解码过程流程图和关键的数据结构 FFmpeg解码涉及的知识点比较多,很容易被函数和结构体搞定不知所错,我们先从整体上对解码流程有个认知,画了张解码流程图,如下 1.1 解码流程如下 a ...

最新文章

  1. CodeBlocks集成Objective-C开发 Windows下学习Objective-C
  2. file的getPath getAbsolutePath和getCanonicalPath的不同
  3. sql优化中in关键字_工作中遇到的一个SQL优化问题与解决方案
  4. LSTM 和 GRU
  5. 通俗易懂,常用线程池执行的-流程图
  6. Java StringBuffer char charAt(int index)方法与示例
  7. ruby array_Ruby中带有示例的Array.sample()方法
  8. linux工具-journalctl查询日志
  9. Windows Server Update Service 3.0 配置向导
  10. FreeMarker语言【页面静态】
  11. 39.Linux/Unix 系统编程手册(下) -- 能力
  12. gcc g++ 参数
  13. Flash Remoting+ Visual Studio .NET学习总结
  14. oracle 嵌套表 例子,什么是Oracle中的嵌套表对象?
  15. hadoop权威指南-MapReduce气象程序实现过程
  16. 【游戏编程扯淡精粹】程序员的Windows技巧
  17. iOS友盟社会化分享完全攻略
  18. 编写一个Python程序,计算任意圆锥体的体积和表面积。
  19. ROS-talker,listener
  20. 泰拉瑞亚 (Terraria v1.4.1.2) ---PC

热门文章

  1. Idea导包自动去除Import xxx.*里的星号
  2. info.plist文件常用属性含义
  3. 博弈论·公平组合游戏 学习笔记
  4. 浙大与北大计算机考研分数线,2017浙大考研复试分数线及相关问题
  5. COM总结 - 转自知乎
  6. Carla 启动时初始化到75%就崩溃,出现“Fatal error”
  7. Java多线程编程——线程同步与线程安全问题及synchronized关键字
  8. 推理规则/经典规则(排中律/反证法双重否定消除)
  9. 039-070前端学习
  10. 【原创】深度学习第7弹:小D识数字(MNIST手写数字集)