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

news/2024/9/24 10:10:55/

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

引言

我一直觉得OpenGL ES是一块硬骨头,每次用到GLSurfaceView作为Camera的预览视图时,总是去网上找现成的代码。Ctrl+CCtrl+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.28
3.0>=4.318
3.1>=5.121
3.2>=7.024

官方支持如上表,但是具体支持情况还得由厂商决定,所以需要在代码中判断是否支持需要使用的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

http://www.ppmy.cn/news/1529769.html

相关文章

决策树与随机森林在机器学习中的应用

决策树与随机森林在机器学习中的应用 在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和…

ES6中JS类实现的解读

在ES5及以前版本,是没有真正意义上类的概念,只是通过构造函数来模拟类的运用。尽管JS脚本语言是一门解释型弱语言,对类的需求意义不大,但ES6还是引入类的实现,让JS真正够上面向对象编程门槛,尽管对类的功能…

Elastic 的 OpenTelemetry PHP 发行版简介

作者:Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

ELK-01-elasticsearch-8.15.1安装

文章目录 前言一、下载elasticsearch二、将tar包放到服务器三、解压tar包四、更改配置文件五、添加启动用户六、用elasticserch用户启动6.1 报错6.2 解决问题16.3 解决问题26.4 再次用elasticserch用户启动6.5 windows浏览器打开 七、设置开机自动启动7.1 创建启动脚本7.2 在脚…

C++ set 和 map学习

一、set(multiset)的基本知识和使用 set也是一种我们直接可以使用的容器&#xff0c;使用应该包含 #include <set> 这个头文件。此处暂且不讨论其底层&#xff0c;只探讨set如何使用即可。 我们看到&#xff0c;set 的模板参数有三个&#xff0c;第一个就是其存储的数据…

秋招面试准备:《小米2024数字芯片岗面试题》

在数字芯片设计的浪潮中&#xff0c;验证工程师的角色愈发重要。他们如同守门人&#xff0c;确保每一块芯片在投入市场前都能稳定、高效地运行。小米&#xff0c;作为全球知名的智能设备制造商&#xff0c;对数字芯片岗位的人才选拔尤为严格。 本文分享《小米2024数字芯片岗面…

GitLab 批量创建用户

GitLab 批量创建用户 引言 在团队管理中&#xff0c;经常需要为多个新成员创建 GitLab 账户。手动创建每个账户不仅耗时&#xff0c;而且容易出错。为了提高效率&#xff0c;我们可以编写一个简单的 Bash 脚本来批量创建用户。本文将详细介绍如何使用 GitLab API 和 Bash 脚本…

【教程】最新可用!Docker国内镜像源列表

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 镜像加速器地址 用法示例 一、自动配置地址 二、配置单次地址 镜像加速器地址 Docker镜像加速站https://hub.uuuadc.top/docker.1panel.live…