OpenGL ES入门教程(一)编写第一个OpenGL程序

OpenGL ES入门教程(一)编写第一个OpenGL程序

前言

从本文开始我将参考学习OpenGL ES应用开发实践指南 Android卷 [(美)KevinBrothaler著](提取码: 394m),并基于自己的理解以更加通俗易懂的方式讲解如何应用OpenGL ES。本系列教程的目标是应用OpenGL,所以不会涉及太多的理论知识,主要讲解方式是基于简单功能的代码拆解,学会对OpenGL ES的应用。原著文章的代码都是在eclipse工具实现,本系列教程采用Android studio工具进行实现。

既然你都看到这篇文章了,想必已经知道什么是OpenGL ES了,我也就不做赘述,本篇教你编写第一个Android上的OpenGL程序,万事开头难,但头开了,就成功了一半了。

文章内容都是个人理解,必然存在表述不专业甚至错误的情况,如有错误,还请各位博友积极指出,感谢。

1. 新建android项目

新建一个空的项目,默认Activity的代码框架如下:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

2. 初始化OpenGL

上面我们显示的页面是xml布局的页面,如果采用OpenGL绘制页面,就需要用OpenGL自己的载体,而不必采用xml,OpenGL绘制的载体是GLSurfaceView类,首先初始化该类,示例代码如下:

public class MainActivity extends AppCompatActivity {private GLSurfaceView mGLSurfaceView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGLSurfaceView = new GLSurfaceView(this);setContentView(mGLSurfaceView);}
}

3. 判断是否支持OpenGL ES 2.0

我们采用OpenGL ES 2.0的接口,因此在程序运行前需要先判断是否支持,完善是否支持OpenGL ES 2.0后的代码如下:

public class MainActivity extends AppCompatActivity {private GLSurfaceView mGLSurfaceView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGLSurfaceView = new GLSurfaceView(this);// Check if the system supports OpenGL ES 2.0.ActivityManager activityManager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000if (supportsEs2){//设置渲染器//...}else{Toast.makeText(this, "This device does not support OpenGL ES 2.0.",Toast.LENGTH_LONG).show();return;}setContentView(mGLSurfaceView);}
}

4. 编写渲染类,并可视化OpenGL

OpenGL的绘制操作都在渲染类GLSurfaceView.Renderer中,因此,我们需要自定义一个类继承自GLSurfaceView.Renderer,然后编写绘制操作,主要重写三个方法,实现绘制红色屏幕的示例代码如下:

public class AirHockeyRenderer implements GLSurfaceView.Renderer {@Overridepublic void onSurfaceCreated(GL10 glUnused, EGLConfig config) {glClearColor(1.0f, 0.0f, 0.0f, 0.0f);//设置清除背景颜色为红色,即调用glClear方法时,背景颜色设置为红色}@Overridepublic void onSurfaceChanged(GL10 glUnused, int width, int height) {// Set the OpenGL viewport to fill the entire surface.glViewport(0, 0, width, height);}@Overridepublic void onDrawFrame(GL10 glUnused) {// Clear the rendering surface.glClear(GL_COLOR_BUFFER_BIT);}
}public class MainActivity extends AppCompatActivity {private GLSurfaceView mGLSurfaceView;private boolean mIsRendererSet=false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGLSurfaceView = new GLSurfaceView(this);// Check if the system supports OpenGL ES 2.0.ActivityManager activityManager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;if (supportsEs2){mGLSurfaceView.setEGLContextClientVersion(2);//设置OpenGL版本为2.0mGLSurfaceView.setRenderer(new AirHockeyRenderer(this));//设置渲染类//GLSurfaceView也具有类似Activity的生命周期,//需要在Activity对应的生命周期,执行GLSurfaceView的生命周期,避免一些奇怪的bug。mIsRendererSet = true;}else{Toast.makeText(this, "This device does not support OpenGL ES 2.0.",Toast.LENGTH_LONG).show();return;}setContentView(mGLSurfaceView);}@Overrideprotected void onPause() {super.onPause();if (mIsRendererSet){mGLSurfaceView.onPause();}}@Overrideprotected void onResume() {super.onResume();if (mIsRendererSet){mGLSurfaceView.onResume();}}
}

5. 程序运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/158200.html

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

相关文章

docker 下安装mysql8.0

在docker中查询mysql镜像 PS C:\Users\admin> docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation……

QT+SQLite数据库配置和使用

一、简介 1.1 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 二、下载和配置 2.1 SQLite下载…

零日漏洞预防

零日漏洞,是软件应用程序或操作系统(OS)中的意外安全漏洞,负责修复该漏洞的一方或供应商不知道该漏洞,它们仍然未被披露和修补,为攻击者留下了漏洞,而公众仍然没有意识到风险。 零日攻击是如何…

90 数组中的第K个最大元素

数组中的第K个最大元素 题解1 最小堆(STL实现)题解2 快排的partition思想题解3 手撸大根堆(记忆理解)参考link: 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k…

偶数矩阵判断【C语言作业】

题目 若一个布尔矩阵所有行和所有列的和都是偶数&#xff0c;则称为偶数矩阵。请编写一个程序&#xff0c;判断一个布尔矩阵是否是偶数矩阵。 要求&#xff1a; &#xff08;1&#xff09;输入:首先输入一个正整数n(n<100),代表该矩阵的大小&#xff0c;接下来是n行n列的矩…

【数据结构】希尔排序

文章目录 前言一、希尔排序的演示图例二、希尔排序&#xff1a;插入排序的优化版本☆三、核心算法思路四、算法思路步骤&#xff08;一&#xff09;预排序 gap>1&#xff08;二&#xff09;gap1 插入排序 完成排序收尾 五、码源详解&#xff08;1&#xff09;ShellSort1 ——…

nodejs+vue高校实验室预约管理系统-计算机毕业设计

开发一款实验室预约管理系统&#xff0c;解决当前学校存在的实验室信息不透明&#xff0c;实验室空余时间不清晰&#xff0c;预约实验室过程繁琐费时的问题。提高实验室利用率。 对于学生&#xff0c; 系统应该分为实验室管理员模块和用户模块。实验室管理员模 块使用者为用户进…

从用户角度出发,探索低代码服务商选择本地部署模式的内在逻辑

随着越来越多的企业开始关注本地部署模式&#xff0c;很多低代码服务商也将视角转向了本地部署模式。毕竟只有将各种软件和程序部署在本地&#xff0c;才能够更好地保护企业的数据安全。但是&#xff0c;选择恰当的本地部署模式&#xff0c;对于服务商来说是一个非常复杂的过程…

React的useEvent 和 ahooks 的 useMemorizedFn 的深度分析和对比

父组件 const TestParent: React.FC<any> () > {const [State, setState] useState(0);const changeFun useCallback(() > {console.log(useCallback closure 里的 State, State);}, [State]);const changeFun_useEvent useEvent(() > {console.log(useEv…

Redis-命令操作Redis

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.Redis简介 1.1.什么是Redis Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据…

【Python3】【力扣题】219. 存在重复元素 II

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;哈希表。遍历每个元素&#xff0c;将元素及下标添加到字典&#xff0c;若当前元素已在字典中且下标之间距离k&#xff0c;则存在重复元素。 知识点&#xff1a;{}&#xff1a;创建空字典…

Express框架开发接口之前台分类导航

1.初始化 const handleDB require(../handleDB/index) // 获取全部导航 exports.allNav (req, res) > {(async function () {})() } // 更新或者添加导航 exports.upNav (req, res) > {(async function () {})() } // 根据id删除 exports.delNav (req, res) > {(a…