Android核心开发之——OpenGL
OpenGL是一种用于编程计算机图形的应用程序编程接口(API)。它提供了一系列函数和方法,用于绘制2D和3D图形,以及进行渲染和图形处理。OpenGL可以跨平台使用,支持各种操作系统和硬件设备。它被广泛应用于游戏开发、虚拟现实、科学可视化、计算机辅助设计等领域。OpenGL具有高性能、灵活性和可扩展性的特点,可以利用图形硬件的加速功能,实现快速而逼真的图形渲染。
OpenGL的简单使用与解析
以下是一个简单的OpenGL使用代码示例,用于创建一个窗口并绘制一个彩色三角形:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}
int main()
{// 初始化GLFWglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 创建窗口对象GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL);if (window == NULL){glfwTerminate();return -1;}glfwMakeContextCurrent(window);
// 初始化GLEW if (glewInit() != GLEW_OK){return -1;}
// 设置视口大小 int width, height;glfwGetFramebufferSize(window, &width, &height);glViewport(0, 0, width, height);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 定义顶点数据 float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f };
// 创建顶点缓冲对象 unsigned int VBO;glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 创建顶点数组对象 unsigned int VAO;glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);
// 渲染循环 while (!glfwWindowShouldClose(window)){// 输入处理 glfwPollEvents();
// 渲染指令 glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);
// 绘制三角形glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);
// 交换缓冲区glfwSwapBuffers(window);}
// 清理资源glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glfwTerminate();return 0;
}
代码解析:
- 引入必要的头文件:glew.h 和 glfw3.h。
- 定义回调函数 framebuffer_size_callback,用于处理窗口大小变化时的事件。
- 在 main 函数中,初始化 GLFW,设置 OpenGL 版本和配置窗口属性。
- 创建窗口对象,并检查是否创建成功。
- 设置当前上下文为窗口的上下文。
- 初始化 GLEW。
- 获取窗口的帧缓冲大小,并设置视口大小。并设置窗口大小变化时的回调函数。
- 定义顶点数据,这里定义了一个简单的三角形。
- 创建顶点缓冲对象(VBO)并将顶点数据绑定到缓冲区。
- 创建顶点数组对象(VAO)并配置顶点属性指针。
- 进入渲染循环,判断窗口是否需要关闭。
- 处理输入事件,例如键盘输入。
- 清空颜色缓冲区。
- 绑定顶点数组对象和绘制指令,绘制三角形。
- 交换前后缓冲区,更新窗口显示。
- 清理资源,删除顶点数组对象和顶点缓冲对象。
- 终止 GLFW,释放所有的资源。
演示了一个最基本的OpenGL使用流程,包括初始化OpenGL环境、创建窗口、设置视口、创建顶点缓冲区和顶点数组对象、渲染循环以及清理资源等。你可以根据自己的需求,进一步扩展和修改代码,添加纹理映射、光照效果等,实现更复杂的图形渲染。本文主要简单解析了在Android开发中OpenGL技术使用,更多有关Android开发的核心技术可以参考《Android核心技术手册》点击可查看详细类目。
最后
OpenGL是一个跨平台的图形编程接口,用于实现2D和3D图形的渲染和处理。它提供了一系列函数和状态机来操作图形硬件,使开发者能够创建各种复杂的图形效果和交互式应用程序。OpenGL仅仅提供了底层的图形操作接口,开发者需要具备一定的图形学知识和编程技巧,才能充分利用OpenGL的功能。
相关文章:

Android核心开发之——OpenGL
OpenGL是一种用于编程计算机图形的应用程序编程接口(API)。它提供了一系列函数和方法,用于绘制2D和3D图形,以及进行渲染和图形处理。OpenGL可以跨平台使用,支持各种操作系统和硬件设备。它被广泛应用于游戏开发、虚拟现…...
公共服务领域:西安新小区业主自立业主委员会年底分红83万以及103万事件区块链资金透明监管与投票解决方案的尝试
公共服务领域:西安新小区业主自立业主委员会年底分红83万以及103万事件区块链资金透明监管与投票解决方案的尝试 作者 重庆电子工程职业学院 | 向键雄 杜小敏 前言 本项目想法来源于,西安新小区业主开出物业自立业主委员会年底分红83万以及103万事件,对于此类事件,我们刨…...
ID3 决策树
西瓜数据集D如下: 编号色泽根蒂敲声纹理脐部触感好瓜1青绿蜷缩浊响清晰凹陷硬滑是2乌黑蜷缩沉闷清晰凹陷硬滑是3乌黑蜷缩浊响清晰凹陷硬滑是4青绿蜷缩沉闷清晰凹陷硬滑是5浅白蜷缩浊响清晰凹陷硬滑是6青绿稍蜷浊响清晰稍凹软粘是7乌黑稍蜷浊响稍糊稍凹软粘是8乌黑稍蜷浊响清晰…...

简单线性回归:预测事物间简单关系的利器
文章目录 🍀简介🍀什么是简单线性回归?🍀简单线性回归的应用场景使用步骤:注意事项: 🍀代码演示🍀结论 🍀简介 在数据科学领域,线性回归是一种基本而强大的统…...

Vue2-收集表单数据、过滤器、内置指令与自定义指令、Vue生命周期
🥔:我徒越万重山 千帆过 万木自逢春 更多Vue知识请点击——Vue.js VUE2-Day4 收集表单数据1、不同标签的value属性2、v-model的三个修饰符 过滤器内置指令与自定义指令1、内置指令2、自定义指令定义语法(1)函数式(2&am…...
正则表达式学习详解
正则表达式 正则表达式(Regular Expression),通常简称为正则或正则表达式,是一种用于描述字符串模式的工具。它是由一系列字符和特殊字符组成的字符串,用于定义搜索模式或进行字符串匹配、替换、提取等操作。 正则表…...
工具箱:在线免费使用的文档工具:(PDF转换,图片压缩等)
这些都是博主亲自使用过的,可以使用。 PDF转换器: http://www.pdfdo.com/ 图片压缩: 免费在线图片/视频压缩工具 | 图片压缩 | 免费 JPG PNG GIF 图像压缩 (yalijuda.com) 文档OCR转EXCEL: 文字识别 OCR_ 图片文字识别_图片文字智能识别…...

Qt6之QStackedWidget——Qt仿ToDesk(2)
一、 QStackedWidget概述 QStackedWidget也叫堆栈窗体类,它继承于QFrame,主要与QListWidget等结合使用,实现“一个界面多个页面切换”。 二、QStackedWidget示例 如下图,当点击左边 QListWidget里的菜单时,右边跟随切…...

Harbor企业镜像仓库部署(本地)
简述: Docker 官方镜像仓库是用于管理公共镜像的地方,大家可以在上面找到想要的镜像,也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网,或者不希望将自己的镜像放到互联网上,那么就需要用到 Docker Regis…...
【Linux】如何打包成动静态库,第三方动静态库如何使用?
文章目录 1. 打包成静态库2. 打包成动态库(共享库)3. 使用第三方静态库4. 使用第三方动态库 5. 动态库的加载6. 注意事项 库的名称:去掉前面的 lib 去掉后面的 .a(版本号) .so(版本号) 剩下的,才是库正真的名称。 查看文件依赖库…...
SAP MM学习笔记20- SAP中的英文2 - SD中英文,日语,中文
SD模块中的英文,日语,中文 对照。 販売管理 日本語英語中国語受注伝票sales order销售订单出荷伝票delivery order交货订单ピッキングリストpicking list领货清单シップメント伝票shipment document发运单据出庫確認post goods issue发货确认請求伝票b…...
计算机网络中的一些基本概念
IP地址: 址用于定位主机的网络地址。是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节).**端口号:**在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单…...

pytest 用例运行方式
一、命令行方式运行 执行某个目录下所有的用例,符合规范的所有用例 进入到对应的目录,直接执行pytest; 例如需要执行testcases 下的所有用例; 可以进入testcases 目录; 然后执行pytest 进入对应目录的上级目录,执行pytest 目录名称/ ; ; 例如需要执行testcases 下…...

简单入门seleniumUI自动化测试
目录 一、selenium的介绍 二、selenium的原理 三、selenium的八种元素定位的方法 1、ID定位: 2 、name定位: 3、class定位: 4、tag定位: 5、link_text定位: 6、partial_link_text定位: 7、css定位…...

Excel(1):表头或列头冻结
1.需求 对于较大的excel,通常需要固定一部分内容,另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格,需要注意的是,选择冻结窗格时,窗格的左上方的表格区域是固定不动的,只可以向下或者向右活动。...

通达OA SQL注入漏洞【CVE-2023-4166】
通达OA SQL注入漏洞【CVE-2023-4166】 一、产品简介二、漏洞概述三、影响范围四、复现环境POC小龙POC检测工具: 五、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损…...

全网最细,Python接口自动化测试-Session会话保持(实战详细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在接口测试的过程…...
Java项目初始化ES、MYSQL表结构及表数据
一、初始化MYSQL数据 public boolean initMysql() throws Exception {log.info("initMysql.start");//获取所连接的数据库名称String database systemMapper.getDatabase();if (StringUtils.isBlank(database)) {throw new BusinessException("连接数据库失败,…...
2023-08-13力扣每日一题
链接: 88. 合并两个有序数组 题意: 如题 解: 从后往前(从大到小)插入排序,这样就不会影响原先的有序性 实际代码: #include<bits/stdc.h> using namespace std; void merge(vector…...

下一代深度学习的思考与若干问题
下一代深度学习的思考和若干问题...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...