注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/graphics/opengl/environment.html


要在你的应用中使用OpenGL ES绘制图像,你必须为它们创建一个视图容器。一个比较直接的方法是同时实现一个GLSurfaceView和一个GLSurfaceView.RendererGLSurfaceView是那些用OpenGL所绘制的图形的视图容器,而GLSurfaceView.Renderer则用来控制在该视图中绘制的内容。关于这两个类的更多信息,你可以阅读:OpenGL ES开发手册。

使用GLSurfaceView只是一种将你的应用与OpenGL ES合并起来的方法。对于一个全屏的或者接近全屏的图形视图,使用它是一个理想的选择。开发者如果希望把OpenGL ES的图形融合在布局的一小部门里面,那么可以考虑使用TextureView。对于自己动手开发的开发者来说(DIY),还可以通过使用SurfaceView来搭建一个OpenGL ES视图,但这将需要编写更多的代码。

在这节课中,我们将解释如何在一个简单地应用activity中完成GLSurfaceViewGLSurfaceView.Renderer的最小实现。


一). 在配置文件中声明使用OpenGL ES

为了让你的应用能够使用OpenGL ES 2.0接口,你必须将下列声明添加到配置文件当中:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果你的应用使用纹理压缩,那么你必须对你支持的压缩格式也进行声明,这样的话那些不支持这些格式的设备就不会尝试运行你的应用:

<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

使用OpenGL ES的安卓应用就像其它类型的应用有自己的用户接口一样,也拥有多个activity。主要的区别就在于acitivity布局上的不同。在许多应用中你可能会使用TextViewButtonListView,在使用OpenGL ES的应用中,你也需要添加一个GLSurfaceView

下面的代码展示了使用一个GLSurfaceView的最小化实现。它作为主视图:

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView mGLView;

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}

Note:

OpenGL ES 2.0需要Android 2.2(API Level 8)或更高版本的系统,所以确保你的Android项目的API版本满足该要求。


三). 构建一个GLSurfaceView对象

一个GLSurfaceView是一个特定的视图,在视图中你可以绘制OpenGL ES图形。不过它自己所做的事情并不多。对于绘制对象的控制实际上是由你在该视图中配置的GLSurfaceView.Renderer所负责的。事实上,这个对象的代码非常简短,你可能会希望跳过继承它,并且只创建一个未经修改的GLSurfaceView实例,不过请不要这么做。你需要继承该类来捕捉触控事件,这方面知识在Responding to Touch Events(该系列课程的最后一节课)中会做进一步的介绍。

GLSurfaceView的核心代码是很小的,所以对于一个快速地实现,通常可以在acitvity中创建一个内部类并使用它:

class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context){
super(context); // Set the Renderer for drawing on the GLSurfaceView
setRenderer(new MyRenderer());
}
}

当使用OpenGL ES 2.0时,你必须对你的GLSurfaceView构造函数添加另一个调用,以此来指明你希望使用的是2.0版本的接口:

// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);

Note:

如果你在使用OpenGL ES 2.0版本的接口,确保在你的应用配置文件中也进行了相关声明。这在之前的章节中已经讨论过了。

另一个对于GLSurfaceView实现的可选选项,是将渲染模式设置为:GLSurfaceView.RENDERMODE_WHEN_DIRTY,其含义是:仅在你的绘画数据发生变化时才在视图中进行绘画操作:

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

这一配置将防止GLSurfaceView框架被重新绘制,直到你调用了requestRender(),这将让应用的性能及效率得到提高。


四). 构建一个渲染类

GLSurfaceView.Renderer类的实现,或者说在一个应用中使用OpenGL ES来进行渲染,正是事情变得有趣的地方。该类会控制和其相关联的GLSurfaceView,决定在上面画什么。一共有三个渲染器的方法被Android系统调用,以此来明确要在GLSurfaceView上画什么以及如何画:

  • onSurfaceCreated() - 调用一次,用来配置视图的OpenGL ES环境。
  • onDrawFrame() - 每次重画视图时被调用。
  • onSurfaceChanged() - 如果视图的几何形态发生变化时会被调用,例如当设备的屏幕方向发生改变时。

下面是一个非常基本的OpenGL ES渲染器的实现,作用仅仅是在GLSurfaceView中画一个灰色的背景:

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
} public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
} public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}

就仅仅是这样!上面的代码创建了一个简单地应用程序,它在使用OpenGL显示一个灰色的屏幕。虽然它的代码做的事情并不怎么有趣,但是通过创建这些类,你已经为使用OpenGL绘制图形有了基本的认识和铺垫。

Note:

你可能想知道为什么这些方法有一个GL10的参数,在你明明使用的是OpenGL ES 2.0的接口的时候。这是因为这些方法在2.0接口中被简单地重用了,以此来保持Android框架尽量简单。

如果你对OpenGL ES接口很熟悉,那么你现在就可以在你的应用中部署一个OpenGL ES的环境并绘制图形。然而, 如果你希望获取更多的帮助来学会使用OpenGL,那么请继续学习下一节课程获取更多的知识。

【Android Developers Training】 62. 搭建一个OpenGL ES环境的更多相关文章

  1. 【Android Developers Training】 61. 序言:使用OpenGL ES显示图像

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. Android 中建立一个OpenGL ES的开发环境

    转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...

  3. Android OpenGL ES 开发(二): OpenGL ES 环境搭建

    零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...

  4. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 1. 创建一个Android项目工程

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 105. 显示一个位置地址

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 96. 运行一个同步适配器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 95. 创建一个同步适配器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. 清理我的 Mac

    在Macbook使用久之后,会发现本来还富裕的硬盘,变得越来越少,尤其现在Macbook使用容量很小的固态硬盘.在此种情况下,该如何清理Macbook垃圾文件,以保证Macbook有足够空间做其他事情 ...

  2. 关于web程序快速开发个人见解以及经历

    由于在之前公司业务的发展,需要在基于核心业务的基础上开发其他较为独立的业务系统,所以就有了这个基于Dapper,DDD概念的基础框架,由于个人基于这个框架已经经历过两个系统的开发,也因为其他项目团队需 ...

  3. 《Android进阶》之第三篇 深入理解android的消息处理机制

    Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 android的消息处理机制(图+源码分析)——Looper,Handler,Message an ...

  4. 简易数据加密传输电路(VHDL)(原创)

    LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.std_logic_unsigned.ALL; ENTITY KEKE IS --定义实体wsj ...

  5. Zepto源码分析-deferred模块

    源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT l ...

  6. void main(), int main() 和int main(void)的区别

    1.区别是main()函数是否有返回值.2.void定义的函数没有返回值,int定义的函数返回整型值.3.void,字面意思是"无类型",常用在程序编写中对定义函数的参数类型.返回 ...

  7. 基于HTML5 Canvas 实现弹出框

    用户鼠标移入时,有弹出框出现,这样的需求很常见.这在处理HTML元素实现时简单,但是如果是对HTML5 Canvas 构成的图形进行处理,这种方法不再适用,因为Canvas使用的是另外一套机制,无论在 ...

  8. 泛型(java菜鸟的课堂笔记)

                1. 泛型的简单运 用和意义   2. 泛型的上限与下限   3. 泛型和 子类继承的限制   4. 泛型类和泛型 方法   5. 泛型嵌套和泛型擦除             ...

  9. 我做的第一个程序(菜鸟的java课堂笔记)

    内存: 堆区,栈区,常量区,计数区,代码区: 数据类型: 基本数据类型:整形,浮点型,布尔型 boolean 只能返回真假值,字符型: 引用数据类型:类,数组: 基本数据类型-->直接存放到栈区 ...

  10. java并发编程(Exchanger)

    package org.bianqi.demo1; import java.util.concurrent.Exchanger; import java.util.concurrent.Executo ...