怎样搭建opengl es 2.0 例子环境

1002人阅读
OpenGL ES2.0(4)
一、所用到的工具和软件:
1.AMD的OpenGL ES 2.0的模拟器:
2.Visual Studio 2015
3.《OpenGL ES2.0 Programming guide》里的例子源码:
二、安装步骤:
1.安装VS,我使用的版本是VS2015;
1.AMD的模拟器:安装步骤相对简单在这里就不细说了,关键在于将其类库导入到VS中以方便程序对类库的引用和编译。
& & & & 安装完成后如下图:
& & & & 在模拟器的安装目录下,找到bin目录下的文件libEGL.dll和libGLESv2.dll,以及lib目录下的libEGL.lib和libGLESv2.lib,将这四个文件都复制到VS下面的VC目录中的bin和lib文件目录下面。
三、环境测试:
1.解压下载好的案例程序压缩包;
2.定位到OpenGL_ES_Programming_Guide_v1.0.2\Chapter_2\Hello_Triangle,并且用VS打开工程文件Hello_Triangle.sln
3.假如我们用的VS是相同版本的,由于与源码的版本不同,则可能在打开工程文件时会提示更新和需要安装一些与C++有关的插件补丁:
4.更新完毕后,我们再次打开工程,在解决方案栏可以看到展开的工程结构:
5.选中工程,鼠标右键选择Build Solution,运行工程,此时会报错:类似于does not match the Linker’s OutputFile property value…的警告信息,程序运行会提示没有找到exe文件。
解决方案:
(1) 右键项目esUtil,配置属性-库管理器-常规-输出文件,把$(OutDir)esUtil_d.lib改成$(OutDir)esUtil.lib
(2) 右键项目Hello_Triangle:
配置属性-链接器-常规,把输出文件改成:Debug\$(ProjectName).exe
输入-附加依赖项:esUtil_d.lib改成esUtil.lib
补充:生成.exe文件后,双击打开提示&...计算机中丢失xxx.dll...&,解决方法是直接将关联到的.dll文件直接复制到.exe文件所在的目录之下。
重新生成解决方案,运行效果如下:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:335527次
积分:4819
积分:4819
排名:第6219名
原创:152篇
转载:28篇
评论:182条
文章:10篇
阅读:14925
文章:16篇
阅读:25713
文章:16篇
阅读:15113
阅读:58247
文章:23篇
阅读:76848
阅读:10921
阅读:16998
(4)(9)(6)(8)(8)(9)(7)(5)(4)(8)(1)(1)(7)(12)(9)(9)(15)(31)(12)(1)(5)(10)(1)中国领先的IT技术网站
51CTO旗下网站
Android系统下OpenGL ES 2.0学习入门
《Android游戏开发案例与关键技术》第6章OpenGL ES 2.0入门教程,本章主要介绍如何在Android上简单使用OpenGL ES 2.0,我们将一步步地认真介绍如何创建一个OpenGL ES 2.0上下文(OpenGL ES 2.0 context)并绘制到屏幕上,还将介绍渲染器(shaders)的概念和工作原理,以便为后面章节的游戏中使用OpenGL ES 2.0做好准备。本节为大家介绍Android系统下OpenGL ES 2.0学习入门。
作者:华清远见3G学院/郑萌来源:电子工业出版社| 15:17
6.3& Android系统下OpenGL ES 2.0学习入门
完成工具的安装以后,继续在Eclipse中创建一个新的Android项目。项目名称虽然不重要,但是该节将与主要活动有关,因此应认真学习掌握。
首先看一段代码:
/**&新建一个GLSurfaceView对象&*/ &private&GLSurfaceView&mGLSurfaceV&
GLSurfaceView是一个特殊的视图,它为我们管理OpenGL表面并将其绘制到Android视图系统中。它还添加许多可以简化OpenGL使用的功能,包括但并不局限于:
它为OpenGL提供一个专用的渲染线程,使主线程得以继续。
它支持连续或按需渲染,维护屏幕设置以及OpenGL和底层窗口系统之间的接口。代码如下:@Override &public&void&onCreate(Bundle&savedInstanceState) &{ &&&&&super.onCreate(savedInstanceState); && &&&&&mGLSurfaceView&=&new&GLSurfaceView(this); && &&&&&//&检测系统是否支持&OpenGL&ES&2.0 &&&&&final&ActivityManager&activityManager&=&(ActivityManager)&getSystemService(Context.&ACTIVITY_SERVICE); &&&&&final&ConfigurationInfo&configurationInfo&=&activityManager.getDeviceConfigurationInfo(); &&&&&final&boolean&supportsEs2&=&configurationInfo.reqGlEsVersion&=&0x20000; && &&&&&if&(supportsEs2) &&&&&{ &&&&&&&&& &&&&&&&&&mGLSurfaceView.setEGLContextClientVersion(2); && &&&& &&&&&&&&&mGLSurfaceView.setRenderer(new&LessonOneRenderer()); &&&&&} &&&&&else &&&&&{ &&&&&&&& &&&&&&&&& &&&&&} && &&&&&setContentView(mGLSurfaceView); &} &
在onCreate()方法里面主要是创建OpenGL ES 2.0上下文以及做一些初始化工作。在onCreate()中,调用超类之后的第一件事情就是创建GLSurfaceView。然后确定系统是否支持OpenGL ES 2.0。因此,我们需要一个可以与全局系统状态相交互的ActivityManager实例,以及使用这个实例来得到设备配置信息,该信息将通知我们设备是否支持OpenGL ES 2.0。
一旦确定设备是否支持OpenGL ES 2.0后,就会通知表面视图需要一个与OpenGL ES 2.0相兼容的视图,然后传递一个自定义渲染。这个渲染将在任何需要调整表面或者绘制一个新的帧的时候被系统调用。我们还通过传递一个不同的渲染来支持OpenGL Es 1.x,尽管可能由于APIs的不同,导致我们需要编写不同的代码,但在这一节中,我们将只关注OpenGL ES 2.0。
最后,我们为GLSurfaceView设置内容视图,它通知Android活动内容应该填补OpenGL表面,代码如下:@Override &protected&void&onResume() &{ &&&&&&&&&super.onResume(); &&&&&mGLSurfaceView.onResume(); &} && &@Override &protected&void&onPause() &{ &&&&&&&&&super.onPause(); &&&&&mGLSurfaceView.onPause(); &} &
GLSurfaceView要求我们在任何父Activity的onResume()和onPause()方法被调用的时候调用onResume()和onPause()方法。【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:27162人学习过
讲师:153476人学习过
讲师:12063人学习过
精选博文论坛热帖下载排行
本书是根据全国计算机技术与软件专业技术资格(水平)考试《网络管理员考试大纲》所要求的考试范围而编写的试题集。全书共分10个单元,同步...
订阅51CTO邮刊Win 10 + VS 2015 如何搭建 OpenGL 环境? - 知乎134被浏览13707分享邀请回答84 条评论分享收藏感谢收起opengl-tutorial.org/这个网站,用CMAKE + glew + glfw的。glfw是用来代替glut的。glew是通过动态加载OpenGL的动态链接库中的函数,以防止出现各个系统中的头文件,库文件的不一致性。不要用OpenGL的固定管道的书籍来学习,可直接学习上面的tutorial或者 看这几本新的书籍。OpenGL编程指南第八版OpenGL ES 3.0编程指南45 条评论分享收藏感谢收起查看更多回答使用Android OpenGL ES 2.0绘图之一:构建一个OpenGL ES环境
& 为了能够在应用程序中使用OpenGL ES绘制图形,你必须创建一个视图作为容器。而更直接的做法是从GLSurfaceView和 GLSurfaceView.Renderer各派生一个实现类。GLSurfaceView作为使用OpenGL绘制的容器,GLSurfaceView.Renderer将用于控制绘图的动作。对这些类的更多信息,请参阅OpenGL ES开发人员指南。
&&&&&&& 使用GLSurfaceView几乎是整合OpenGL ES到你的应用中的唯一方式。对于一个需要全屏或近乎屏幕图形视图,它是一个合理的选择。如果开发人员只是期望借助OpenGL ES在某个布局中一小部分绘图,则应该考虑使用TextureView。如果觉得自己是&大牛&,完全可以使用SurfaceView建立一个OpenGL ES视图,但这样做需要编写相当多的额外的代码。
&&&&&&& 这一节将介绍如何在一个简单应用的activity中完成一个最小的GLSurfaceView和GLSurfaceView.Renderer的实现。
一、在Manifest文件中声明使用OpenGL ES
&&&&&&& 为了能够使用OpenGL ES 2.0 API,你必须在manifest文件中添加以下声明:
&uses-feature android:glEsVersion=&0x& android:required=&true& /&&
&uses-feature android:glEsVersion=&0x& android:required=&true& /&&&&&&&& 如果你的应用需要使用纹理压缩功能,还要声明设备需要支持什么样的压缩格式:
&supports-gl-texture android:name=&GL_OES_compressed_ETC1_RGB8_texture& /&&
&supports-gl-texture android:name=&GL_OES_compressed_paletted_texture& /&&
&supports-gl-texture android:name=&GL_OES_compressed_ETC1_RGB8_texture& /&
&supports-gl-texture android:name=&GL_OES_compressed_paletted_texture& /&&&&&&&& 更多关于纹理压缩格式的信息,请参阅OpenGL开发人员指南。
二、为OpenGL ES图形创建一个Activity
&&&&&&& 这个Activity跟任何其他的应用程序中的Activity一样,也有一个用户界面。唯一的区别是在它的布局文件中存放的视图不是TextView、Button和ListView,而是一个GLSurfaceView。
&&&&&&& 下面的代码演示了使用GLSurfaceView作为主视图的Acitivity的核心代码:
public class OpenGLES20 extends Activity {&
&&& private GLSurfaceView mGLV&
&&& @Override&
&&& public void onCreate(Bundle savedInstanceState) {&
&&&&&&& super.onCreate(savedInstanceState);&
&&&&&&& //创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentView&&
&&&&&&& mGLView = new MyGLSurfaceView(this);&
&&&&&&& setContentView(mGLView);&
public class OpenGLES20 extends Activity {
&&& private GLSurfaceView mGLV
&&& @Override
&&& public void onCreate(Bundle savedInstanceState) {
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& //创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentView
&&&&&&& mGLView = new MyGLSurfaceView(this);
&&&&&&& setContentView(mGLView);
}&&&&&&& 注:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本,所以请确保你的Android项目的运行目标的API等级不低于8或更高。
三、构造一个GLSurfaceView对象
&&&&&&& 事实上GLSurfaceView并没有提供很多功能,实际上绘制对象的任务都在GLSurfaceView.Renderer中进行。所以GLSurfaceView中代码也非常少,甚至可以直接使用GLSurfaceView。但最好别这样做,因为你需要扩展这个类来响应触摸事件。
&&&&&&& 通常在当前Activity中以内部类的方式创建GLSurfaceView,这样实现起来非常快,核心代码如下:
class MyGLSurfaceView extends GLSurfaceView {&
&&& public MyGLSurfaceView(Context context){&
&&&&&&& super(context);&
&&&&&&& //为了在GLSurfaceView中绘制图形而设置Renderer&&
&&&&&&& setRenderer(new MyRenderer());&
class MyGLSurfaceView extends GLSurfaceView {
&&& public MyGLSurfaceView(Context context){
&&&&&&& super(context);
&&&&&&& //为了在GLSurfaceView中绘制图形而设置Renderer
&&&&&&& setRenderer(new MyRenderer());
}&&&&&&& 当使用OpenGL ES 2.0时,你必须在GLSurfaceView构造器中调用另外一个方法,它指定了你将要使用2.0版的API:
// 创建一个OpenGL ES 2.0 context&&
setEGLContextClientVersion(2);&
// 创建一个OpenGL ES 2.0 context
setEGLContextClientVersion(2);&&&&&&& 注:如果你使用的是OpenGL ES 2.0的API,那么请确保在Manifest文件中作出相关API版本声明。有关更多信息,请参见在Manifest文件中声明使用OpenGL ES。
&&&&&&& 另一个可以添加到你的GLSurfaceView中可选操作是设置渲染模式为仅当绘制数据发生改变时才绘制view。该渲染模式常量是GLSurfaceView.RENDERMODE_WHEN_DIRTY。
// 只有在绘制数据改变时才绘制view&&
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);&
// 只有在绘制数据改变时才绘制view
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);&&&&&&& 该设置可以防止GLSurfaceView帧重绘,直到调用requestRender()方法。这样的绘制机制更高效。
四、构造一个Renderer类
&&&&&&& Renderer类负责控制在GLSurfaceView中绘制任务,并提供三个回调方法供Android调用,用来计算在GLSurfaceView中绘制什么以及如何绘制。
1.onSurfaceCreated():仅调用一次,可用来设置view的OpenGL ES环境。
2.onDrawFrame():每次View被重绘时被调用。
3.onSurfaceChanged():如果view的几和形状发生变化了就调用,例如当竖屏变为横屏时。
&&&&&&& 下面是一个OpenGL ES renderer的最基本的实现,仅在GLSurfaceView上画了一个灰色的背景:
public class MyGL20Renderer implements GLSurfaceView.Renderer {&
&&& public void onSurfaceCreated(GL10 unused, EGLConfig config) {&
&&&&&&& //设置背景色&&
&&&&&&& GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);&
&&& public void onDrawFrame(GL10 unused) {&
&&&&&&& // 重绘背景色&&
&&&&&&& GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);&
&&& public void onSurfaceChanged(GL10 unused, int width, int height) {&
&&&&&&& GLES20.glViewport(0, 0, width, height);&
public class MyGL20Renderer implements GLSurfaceView.Renderer {
&&& public void onSurfaceCreated(GL10 unused, EGLConfig config) {
&&&&&&& //设置背景色
&&&&&&& GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
&&& public void onDrawFrame(GL10 unused) {
&&&&&&& // 重绘背景色
&&&&&&& GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
&&& public void onSurfaceChanged(GL10 unused, int width, int height) {
&&&&&&& GLES20.glViewport(0, 0, width, height);
}&&&&&&& 以上就是所有要做的东西!上面的代码示例创建了一个简单的Android应用,它使用OpenGL显示了一个灰色的屏幕。虽然这段代码并没有做什么有趣的事情,但是通过创建这些类,已经为你使用OpenGL绘制图形奠定了基础。
&&&&&&& 注:当你使用OpengGLES 2.0 API时,可以不用去明白这些方法们为什么都有一个GL10参数。其实这样做的目的是让Android框架能够简单的兼容OpenGL ES的各版本。
&&&&&&& 如果你对OpenGL ES API很熟悉,你现在应该能够在应用程序中建立一个OpenGL ES环境并开始绘制图形了。然而,如果你想要学习更多的相关知识,那么就请继续关注下一节吧。学习OpenGL-ES: 2 - EGL解析 - kiffa - 博客园
在前文()中提到EGL是本地平台和OpenGL ES之间的抽象层,其完成了本地相关的环境初始化和上下文控制工作,以保证OpenGL ES的平台无关性。主要包含如下工作:
a,选择显示设备
b,&选择像素格式。
c,&选择某些特性,比如如果你打算画中国水墨画,你需要额外指定宣纸和毛笔。&
d,&申请显存。&
e,&创建上下文(Context),上下文本质上是一组状态的集合,描述了在某个特定时刻系统的状态,&用于处理暂停、恢复、销毁、重建等情况;
f, 指定当前的环境为绘制环境&。
总体流程上,EGL按顺序分为若干步骤:
1, 选择显示设备display,即上述的a.
2,指定特性,包括上述的像素格式(b)和特定特性(c),根据指定的特性来获取多个满足这些特性的config(比如你指定RGB中的R为5bits,那么可能会有RGB_565和RGB_555两种像素格式均满足此特性),用户从这些可用的configs中选择一个,根据display和config获取绘制用的buffer(一般为显存),即上述的d。
3,使用display、config、buffer来创建context,及即上述的e.
4, 使用display、buffer、context 设置当前的渲染环境,即上述的f.
本文将以Android下EGL的使用为例逐一进行讲解。
2,选择显示设备及确认EGL版本
EGL有1.0、1.1、1.2、1.3、1.4这几个版本,Android中使用的是1.4,EGL提供了查询版本的API,以下为Android中例子:
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); //获取显示设备
int[] version = new int[2];
egl.eglInitialize(display, version); //version中存放EGL 版本号,int[0]为主版本号,int[1]为子版本号
String vendor = egl.eglQueryString(display, EGL10.EGL_VENDOR);
WLog.d("egl vendor: " + vendor); // 打印此版本EGL的实现厂商
String version = egl.eglQueryString(display, EGL10.EGL_VERSION);
WLog.d("egl version: " + version);// 打印EGL版本号
String extension = egl.eglQueryString(display, EGL10.EGL_EXTENSIONS);
WLog.d("egl extension: " + extension); //打印支持的EGL扩展
1,虽然Android使用(实现)的是EGL 1.4(从打印的版本号中可见), 但在Android 4.2(API 17)以前的版本没有EGL14,只有EGL10和EGL11,而这两个版本是不支持OpengGL ES 2.x的,因此在老版本中某些ES 2.x相关的常量参数只能用手写的硬编码代替,典型的如设定EGL渲染类型API的参数EGL10.EGL_RENDERABLE_TYPE,这个属性用不同的赋值指定的不同的渲染API,包括OpenGL,OpenGL ES 1.x, OpenGL ES 2.x,OpenVG等,如果采用ES 2.0,应该设置此值为: EGL14.EGL_OPENGL_ES2_BIT,但是在Android 4.2之前,没有EGL14接口,只能采取手写的硬编码来指定,类似: EGL_RENDERABLE_TYPE&= 4;
2,egl.eglQueryString()用来查询EGL的相关信息,详见这里:
3,EGL10.EGL_DEFAULT_DISPLAY 默认对应手机主屏幕。
3,指定(buffer)特性,获取config
1,构造需要的特性列表
int[] attributes = new int[] {
EGL10.EGL_RED_SIZE, 8,
//指定RGB中的R大小(bits)
EGL10.EGL_GREEN_SIZE, 8, //指定G大小
EGL10.EGL_BLUE_SIZE, 8,
//指定B大小
EGL10.EGL_ALPHA_SIZE, 8, //指定Alpha大小,以上四项实际上指定了像素格式
EGL10.EGL_DEPTH_SIZE, 16, //指定深度缓存(Z Buffer)大小
EGL10.EGL_RENDERABLE_TYPE, 4, //指定渲染api类别, 如上一小节描述,这里或者是硬编码的4,或者是EGL14.EGL_OPENGL_ES2_BIT&
EGL10.EGL_NONE };
//总是以EGL10.EGL_NONE结尾
&2, 获取所有可用的configs,每个config都是EGL系统根据特定规则选择出来的最符合特性列表要求的一组特性。
EGLConfig config = null;
int[] configNum = new int[1];
//获取满足attributes的config个数。
egl.eglChooseConfig(display, attributes, null, 0, configNum);
int num = configNum[0];
if(num != 0){
EGLConfig[] configs = new EGLConfig[num];
//获取所有满足attributes的configs
egl.eglChooseConfig(display, attributes, configs, num, configNum);
config = configs[0]; //以某种规则选择一个config,这里使用了最简单的规则。
1,display和attributes都来自之前的步骤。
2,eglChooseConfig(display, attributes, configs, num, configNum); 用于获取满足attributes的所有config,参数1、2其意明显,参数3用于存放输出的configs,参数4指定最多输出多少个config,参数5由EGL系统写入,表明满足attributes的config一共有多少个。如果使用eglChooseConfig(display, attributes, null, 0, configNum)这种形式调用,则会在configNum中输出所有满足条件的config个数。
3,一般习惯是获取所有满足attributes的config个数,再据此分配存放config的数组,获取所有config,根据某种特定规则,从中选择其一。
4,API详细说明和所有可指定的attributes见这里:
5,打印config中的常用attributes:
* 打印EGLConfig信息
* @param egl
* @param display
* @param config
: 指定的EGLConfig
public static void printEGLConfigAttribs(EGL10 egl, EGLDisplay display, EGLConfig config) {
int value = findConfigAttrib(egl, display, config, EGL10.EGL_RED_SIZE, -1);
WLog.d("eglconfig: EGL_RED_SIZE: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_GREEN_SIZE, -1);
WLog.d("eglconfig: EGL_GREEN_SIZE: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_BLUE_SIZE, -1);
WLog.d("eglconfig: EGL_BLUE_SIZE: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_ALPHA_SIZE, -1);
WLog.d("eglconfig: EGL_ALPHA_SIZE: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_DEPTH_SIZE, -1);
WLog.d("eglconfig: EGL_DEPTH_SIZE: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_RENDERABLE_TYPE, -1);
WLog.d("eglconfig: EGL_RENDERABL_TYPE: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_SAMPLE_BUFFERS, -1);
WLog.d("eglconfig: EGL_SAMPLE_BUFFERS: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_SAMPLES, -1);
WLog.d("eglconfig: EGL_SAMPLES: " + value);
value = findConfigAttrib(egl, display, config, EGL10.EGL_STENCIL_SIZE, -1);
WLog.d("eglconfig: EGL_STENCIL_SIZE: " + value);
* 在指定EGLConfig中查找指定attrib的值,如果没有此属性,返回指定的默认值
* @param egl
* @param display
* @param config
: 指定的EGLConfig
* @param attribute
: 指定的attrib
* @param defaultValue
: 查找失败时返回的默认值
* @return: 查找成功,返回查找值;查找失败,返回参数中指定的默认值
static public int findConfigAttrib(EGL10 egl, EGLDisplay display, EGLConfig config,
int attribute, int defaultValue) {
int[] val = new int[1];
if (egl.eglGetConfigAttrib(display, config, attribute, val)) {
return val[0];
return defaultV
4, 获取显存
EGLSurface surface = egl.eglCreateWindowSurface(display, config, surfaceHolder, null);
&1,详细的参数说明见这里:
&2,参数surfaceHolder是android.view.SurfaceHolder类型,负责对Android Surface的管理,后续将对此进行较详细说明,参看第8小节。
3,参数4用于描述WindowSurface类型,初始化方式如同前面小节的egl attributes, 其中一个attribute是EGL_RENDER_BUFFER, 用于描述渲染buffer(所有的绘制在此buffer中进行)类别,取值为EGL_SINGLE_BUFFER以及默认的EGL_BACK_BUFFER,前者属于单缓冲,绘制的同时用户即可见;后者属于双缓冲,前端缓冲用于显示,OpenGL ES 在后端缓冲中进行绘制,绘制完毕后使用eglSwapBuffers()交换前后缓冲,用户即看到在后缓冲中的内容,如此反复。其他attributes见官方文档。
5, 创建context
int attrs[] = {
EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
EGL10.EGL_NONE, };
EGLContext context = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, attrs);
函数原型&&& &EGLContext &eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list);
share_context: 是否有context共享,共享的contxt之间亦共享所有数据。EGL_NO_CONTEXT代表不共享。
attrib_list: 目前可用属性只有EGL_CONTEXT_CLIENT_VERSION, 1代表OpenGL ES 1.x, 2代表2.0。同样在Android4.2之前,没有EGL_CONTEXT_CLIENT_VERSION这个属性,只能使用硬编码0x3098代替。
函数详细描述:
6, 设置为当前的渲染环境
egl.eglMakeCurrent(display, surface, surface, contxt);
比较简单,不做赘述,详细描述:
7,环境初始化完毕,开始使用OpenGL ES 2.0 API 进行绘制。
// 开始使用OpenGL ES 2.0 API 进行绘制。
GLES20.glClearColor(0, 0, 0, 1);
GLES20.clear(GL_COLOR_BUFFER_BIT);
8,关于SurfaceHolder
一般在Android中使用OpenGL ES,总是会从GLSurfaceView和Renderer开始,但是由上面描述的过程可知,只需要提供一个合适的SurfaceHolder,就可以完成整个环境初始化,并进行绘制。GLSurfaceView和Renderer事实上只是在本文描述的基础上封装了一些便利的功能,便于开发者开发,比如渲染同步、状态控制、主(渲染)循环等。那么,如何提供一个SurfaceHolder,具体的Surface分配过程又是怎样的呢,这涉及到Android窗口机制,属于比较大的话题,将在下一节进行描述。

我要回帖

更多关于 android opengl es2.0 的文章

 

随机推荐