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

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

引言

我一直觉得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.rhkb.cn/news/435038.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础知识

计算机的组成部件 CPU CPU 由运算器和控制器组成,在下面的冯诺依曼体系中,我直接将控制器和运算器直接合并一起来说,也就是CPU,所以你可能在一些书籍上看到冯诺依曼体系是由五大部件构成的,其中CPU 就包含了两大部件…

docker 部署 Seatunnel 和 Seatunnel Web

docker 部署 Seatunnel 和 Seatunnel Web 说明: 部署方式前置条件,已经在宿主机上运行成功运行文件采用挂载宿主机目录的方式部署SeaTunnel Engine 采用的是混合模式集群 编写Dockerfile并打包镜像 Seatunnel FROM openjdk:8 WORKDIR /opt/seatunne…

提示词工程 (Prompt Engineering) 最佳实践

prompt Engineering 概念解析 提示工程是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力&#xf…

深度学习之入门书籍

自学深度学习,书籍很重要。 从我个人来说,我不太习惯英译版本,或者那些牛人说的,直接读英文,我是水平不够。只讲自己的经验。牛人绕道。 推荐书籍: 深度学习:从入门到精通,这本书不错。把基础的深度学习的…

傅里叶变换(对称美)

傅里叶变换(对称美) 冲浪时发现的有趣文章,学习自https://zhuanlan.zhihu.com/p/718139299 摘下来的内容: 傅里叶变换之所以“怪美的嘞”,根本在于它有一种内在的对称性,这一点在上面的图并没有表现出来…

【Golang】关于Go语言字符串转换strconv

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【操作系统】三、内存管理:2.虚拟内存管理(虚拟内存特:局部性原理、请求分页管理方式、页面置换算法)

七、虚拟内存管理 文章目录 七、虚拟内存管理1.常规存储器特征1.1一次性1.2驻留性 2.虚拟内存特征2.1局部性原理2.2多次性2.3对换性2.4虚拟性2.5虚拟存储器的容量 3.虚拟内存的实现❗3.1缺页率3.2请求分页(请求页表)3.2.1页表机制❗3.2.2缺页中断机构3.2…

猝发传输和非猝发传输

猝发传输和非猝发传输是两种不同的数据传输方式,主要区别在于数据传输的连续性以及数据包的发送方式。 猝发传输 (Burst Transmission): 定义: 猝发传输是指在一段时间内,大量数据包集中发送,然后在一段时间内没有数据传输,这种…

Facebook公共主页bug问题解决措施清单

在使用Facebook的过程中,许多用户可能会遇到一些让人困扰的BUG,这些问题往往会让人感到无奈。为了帮助大家更好地应对这些情况,本文将总结一些常见的BUG以及对应的解决方案,主要集中在公共主页的相关问题。如果感兴趣就请读下去吧…

uniapp 使用Vue3 setup引入 uniapp 的onReachBottom

在page.json中加入**“onReachBottonDistance”: 50**,这是距离底部多少开始触发 然后再对应的页面通过import将uniapp的api引入进去 dcloudio/uni-app是不用单独下载的,直接用就行 import {onReachBottom,} from dcloudio/uni-app;然后直接使用就好

【ArcGIS Pro实操第三期】多模式道路网构建(Multi-model road network construction)原理及实操案例

ArcGIS Pro实操第三期:多模式道路网构建原理及实操案例 1 概述1.1 原理 2 GIS实操2.1 新建文件并导入数据2.2 创建网络数据集2.3 设置连接策略(Setting up connectivity policies)2.4 添加成本(Adding cost attributes&#xff09…

【C++报错已解决】std::ios_base::sync_with_stdio

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

java项目之作业管理系统设计与实现源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的作业管理系统设计与实现源码。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 作业管理系统…

引入的pyside2后 Lib\site-packages\PySide2中没有pyside2-uic.exe

只有uic.exe 没有pyside2-uic.exe 去Scripts目录下查看就能找到

Unity实战案例全解析:RTS游戏的框选和阵型功能(1) 基础要素

本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程 【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered…

架构师:消息队列的技术指南

1、简述 消息队列(Message Queue, MQ)是一种异步通信机制,允许系统的各个组件通过消息在彼此之间进行通信。消息队列通过解耦系统组件、缓冲高峰期请求和提高系统的可扩展性,成为分布式系统中不可或缺的一部分。 2、工作原理 消息队列的基本工作原理是生产者将消息发布到…

Wed前端--HTML基础

目录 一、开发工具 二、HTML文档结构 2.1头部head 2.1.1title标记 2.1.2元信息meta标记 具体实例 ​编辑 一、开发工具 最基础的开发工具是:HBuilder 二、HTML文档结构 HTML文档由头部head和主体body组成 头部head标记中可以定义标题样式,头部信…

初始C++模板

1.泛型编程 1.1什么事泛型编程 在学习C语言时,我们时常会有这样的烦恼: 在针对每一种不同的类型变量进行函数传参或者是运算处理时,我们总是编写不同的函数或者是进行不同的处理,才能达到目的,这时,我们…

(undone) 阅读 MapReduce 论文笔记

参考:https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf 摘要:简单介绍了 MapReduce 是在大型分布式系统上工作的 Introduction 的内容总结: 1.介绍背景:为什么我们需要分布式系统?MapReduce 的意义是哪些 2.简…

2024.9.26C++作业

1. 什么是虚函数,什么是纯虚函数? 1.虚函数在基类中声明,使用virtual关键字修饰成员函数,并且允许在派生类中重写。 2.在运行时,允许基类指针或者引用调用这个函数时,根据实际对象类型调用派生类&#xff…