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

news2024/9/24 6:52:01

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

引言

我一直觉得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.coloradmin.cn/o/2159727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript --- 字符串常用方法(1)

chartAt(索引)&#xff0c;返回索引对应字符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

Java | Leetcode Java题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; class Solution {public int minMutation(String start, String end, String[] bank) {int m start.length();int n bank.length;List<Integer>[] adj new List[n];for (int i 0; i < n; i) {adj[i] new ArrayList<Intege…

chsharp文件如何查找在unity中使用的 位置?

在 Unity 中&#xff0c;C 脚本文件&#xff08;.cs 文件&#xff09;被用于控制游戏对象的行为。要查找某个 C 文件在 Unity 项目中被使用的位置&#xff0c;你可以通过以下几种方法&#xff1a; 1. 查找依赖项&#xff08;References&#xff09; Unity 提供了一个工具&#…

物联网助力智慧交通:优势与前景

智慧交通是当今城市发展的必然趋势&#xff0c;而物联网技术在交通运输领域的应用正是为实现智慧交通建设提供了前所未有的机遇和优势。物联网作为连接和控制物理世界的重要技术手段&#xff0c;在交通领域的应用极大地改善了交通系统的效率、安全性和环保性。 首先&#xff0c…

LabVIEW软件出现Bug如何解决

在LabVIEW开发中&#xff0c;程序出现bug是不可避免的。无论是小型项目还是复杂系统&#xff0c;调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug&#xff0c;包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…

使用vite+react+ts+Ant Design开发后台管理项目(二)

前言 本文将引导开发者从零基础开始&#xff0c;运用、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术工具…

C语言 | Leetcode C语言题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; #define MAX_LEVE_SIZE 1000 #define MAX_NODE_SIZE 10000int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {int ** ans (int **)malloc(sizeof(int *) * MAX_LEVE_SIZE);*returnColumnSizes (int *)mal…

如何利用 opencv 进行 ROI(感兴趣)获取和实现 VR(虚拟现实) 演播室的播放

我是从事医疗软件的开发的。 经常需要从拍摄的医疗视频中获取出病理区域。并计算病理区域的周长和面积。 用 opencv 的术语,这就是感兴趣区域的获取。 (因为都是实时视频,所以速度很关键。代码效率很重要) 有时,需要标注出病理区域,并将非病理区域从视频中去除掉。 如果将…

云栖大会上我遇见了站长转型自媒体最成功的人

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 非常荣幸参加了第十六届2024云栖大会。文章很短&#xff0c;但很精。 这次大会有3大特点&#xff1a;人巨多、热、信号差&#xff0c;而且云栖大会上我遇见了站长转型自媒体最成功的人。甚至还有人说&#xff1a;云…

光子架与电子架 -- 光子架与电子架

电子架 指插放交叉板、OTU单板、支/线路板、保护类单板的子架。 在通用型平台子架和平台子架中如果仅插放OTU单板&#xff08;非中继模式&#xff09;视为电子架。光电混合的子架视为电子架。 电子架主要实现将客户侧信号转换成标准波长的光信号&#xff0c;供光子架调度。 光子…

免费的高质量、美观的甘特图模板

呈现您的项目规划新高度&#xff0c;精选几款高品质、视觉出众的甘特图模板。 甘特图Excel模板-Ganttable系统风格甘特图Excel模板-专业甘特图Excel模板-浅蓝色甘特图Excel模板-深灰色 这些 Excel 甘特图模板均源自 Ganttable 甘特图AI工具的智能生成与导出。利用 Ganttable&a…

ARM单片机的中断详细过程(重要)

ARM单片机的中断详细过程&#xff08;重要&#xff09; 一、ARM异常中断 ARM的异常&#xff08;中断源&#xff09;总共分为三类&#xff08;八种&#xff09;&#xff1a; 三类&#xff1a; &#xff08;1&#xff09;执行指令引起的直接异常&#xff1a;软件中断&#xff…

Golang | Leetcode Golang题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; func diffOne(s, t string) (diff bool) {for i : range s {if s[i] ! t[i] {if diff {return false}diff true}}return }func minMutation(start, end string, bank []string) int {if start end {return 0}m : len(bank)adj : make([][…

MFC - 复杂控件_2

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天讲解剩下的复杂控件知识点 IP地址栏 绘图准备: 调整windows窗口大小、设置 ip address control设置 Button按钮&#xff0c;修改名称 添加IP栏 变量&#xff1a;m_IP 获取IP栏内容 void CMFCApplication3Dlg::…

C++ | Leetcode C++题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; class Solution { public:int minMutation(string start, string end, vector<string>& bank) {int m start.size();int n bank.size();vector<vector<int>> adj(n);int endIndex -1;for (int i 0; i < n; i)…

滚动轴承故障诊断、预测与分类综合数据集

独家整理 滚动轴承数据集 故障诊断&#xff0c;预测、分类 最全套数据集 可做对比实验 拍就发自动发货 1.CWRU西储大学轴承数据集 2.MFPT机械故障协会数据集 3.XJTU西安交通大学数据集 4.渥太华变速轴承轴承数据集 5.江南大学轴承数据集 滚动轴承故障诊断、预测与分类综合数据集…

CORS解决浏览器跨域请求(同源策略)限制原理、后端springboot CROS跨域解决方案

文章目录 1 浏览器的同源策略1.1 什么是源&#xff08;origin&#xff09;&#xff1f;1.2 跨域请求&#xff1f;1.3 同源策略&#xff08;跨域限制&#xff09;是什么&#xff1f;1.3.1 同源策略的具体限制&#xff1f;1.3.2 浏览器CORS校验 2 CORS解决Ajax跨域问题2.1 CORS概…

周家庄智慧旅游小程序

项目概述 周家庄智慧旅游小程序将通过数字化手段提升游客的旅游体验&#xff0c;依托周家庄的自然与文化资源&#xff0c;打造智慧旅游新模式。该小程序将结合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和人工智能等技术&#xff0c;提供丰富的…

Java 中的垃圾回收综合讲解

Java 垃圾收集综合指南 Java 中的垃圾收集 (GC) 是 Java 虚拟机 (JVM) 通过删除应用程序中不再可访问的对象来自动回收内存的过程。这有助于防止内存泄漏并优化活动对象的可用内存&#xff0c;从而保持 Java 应用程序的性能和效率。 在 Java 中配置垃圾收集器 要在 Java 中…

Java语言程序设计基础篇_编程练习题***18.33 (游戏:骑士旅途的动画)

目录 ***18.33 (游戏:骑士旅途的动画) 习题思路 代码示例 动画演示 ***18.33 (游戏:骑士旅途的动画) 为骑士旅途的问题编写一个程序&#xff0c;该程序应该允许用户将骑士放到任何一个起始正方形&#xff0c;并单击Solve按钮&#xff0c;用动画展示骑士沿着路径的移动&…