Android OpenGLES2.0开发(一):艰难的开始

生而为人,本质上,都是孤独的!

引言

我一直觉得OpenGL ES 是一块硬骨头,每次用到GLSurfaceView作为Camera的预览视图时,总是去网上找现成的代码。Ctrl+C和Ctrl+V之后总有一种沾沾自喜的感觉,但是你要让我改里面的代码或者结构时,又有一种大战之后的无力感,力不从心呀。直到最近要用MediaCodec+Surface录制视频才真的让我要正视他,这座大山是时候要翻越了。

一、OpenGL

OpenGL诞生于天地初开,一切皆为混沌的时候。那时的世界纷繁复杂,部落之间各自为政,战火不断,民不聊生。。。

当时硬件厂商推出了各种图形卡(GPU)标准不一,操作接口不同。程序员面对众多的硬件接口编程苦不堪言,于是一个组织诞生了Khronos,成员包括Apple、 Intel、AMD、Google、ARM、Qualcomm、Nvidia 等等。他们对电脑GPU定义了统一的接口OpenGL,对手机GPU定义了统一的接口OpenGL ES,程序员只要面向OpenGL接口操作GPU编程即可,至此世界和平了。

二、OpenGL ES是什么

OpenGL ES就是简化版本的OpenGL,更适合嵌入式设备

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。说的直白点,这套API就是用来操作GPU的,可以认为就是GPU的驱动程序。

OpenGL ES相对于OpenGL来说,减少了许多不是必须的方法和数据类型,去掉了不必须的功能,对代价大的功能做了限制,比OpenGL更为轻量。在OpenGL ES的世界里,没有四边形、多边形,无论多复杂的图形都是由点、线和三角形组成的。

三、OpenGL ES能做什么

OpenGL ES是一套图形接口,那么他主要就是用来画图的。

  • 图片处理,如图片色调转换、美颜等
  • 摄像头视频预览效果变换,各种滤镜实现
  • 3D游戏场景实现

OpenGL ES版本支持

OpenGL ES版本 Android版本 Android API
2.0 >=2.2 8
3.0 >=4.3 18
3.1 >=5.1 21
3.2 >=7.0 24

官方支持如上表,但是具体支持情况还得由厂商决定,所以需要在代码中判断是否支持需要使用的OpenGL ES的版本

四、OpenGL ES两个伙伴

1. EGL

EGL(embedded Graphic Interface),是 OpenGL ES 和底层 Native 平台 视窗系统之间的接口。直白讲就是将OpenGL ES渲染的图形绘制到屏幕上。我们在Android OpenGLES开发:EGL环境搭建篇章中详细介绍了EGL,如需了解请移步至该篇。

2. GLSL

GLSL(OpenGL Shading Language),是 OpenGL ES 中使用到的着色器的语言,用这个语言可以编写小程序运行在 GPU 上。代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。

GLSL(GL Shading Language)的着色器代码分成2个部分:

  • Vertex Shader(顶点着色器):顶点着色器主要负责处理输入的顶点坐标,并对这些顶点进行变换
  • Fragment(片断着色器):主要负责处理图形中的每个片段(像素)。它可以计算像素的最终颜色,进行光照计算、纹理映射、颜色插值等

着色器的结构:版本声明 + 输入/输出/全局变量 + main函数

六、OpenGL ES绘制流程

1. 第一步:确定位置

上面我们知道OpenGL ES的世界中,图形都是由三角形组成的。所以我们第一步就是设置三角形的三个顶点位置(复杂图像就是多个三角形顶点),将顶点的坐标、索引、颜色等信息传入VS(Vertex Shader:顶点着色器)中。让OpenGL ES进行一些列的变换(投影、矩阵变化)

2. 第二步:上色

第一步我们已经将图像轮廓绘制完毕,接下来就是要润色了。FS(Fragment Shader:片段着色器)负责处理每个图元(如三角形)的片段(像素),并计算出每个片段的最终颜色值和深度值。它可以进行各种操作,如纹理映射、光照计算、阴影处理等,最终输出最终的颜色和深度信息。

最终将图像信息存储到Frame Buffer中,通过EGL渲染到屏幕上

最后

本章节我们简单讲解了OpenGL ES是什么,刨除了很多晦涩难懂的概念。本质是希望小白也能看懂并产生兴趣,如需深入了解可以看下面的参考文章或自行Google。

参考:

  1. http://geekfaner.com/shineengine/blog2_OpenGLESv2_1.html
  2. https://wuwang.blog.csdn.net/article/details/52793354
  3. https://blog.csdn.net/gongxiaoou/article/details/89199632
相关推荐
晚风叙码8 分钟前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程33 分钟前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓5 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc1236 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium
Dovis(誓平步青云)6 小时前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物