Android OpenGL ES绘图教程之一 : 构建OpenGL ES 环境

为了在Android应用中使用OpenGL ES绘图,首先必须要创建一个view容器。一个最简单的方法是实现GLSurfaceView和GLSurfaceView.Renderer。GLSurfaceView一个view容器,用来显示OpenGL绘制的图形,GLSurfaceView.Renderer用来控制GLSurfaceView里面图形的绘制。更多的信息,请参考 OpenGL ES 开发向导。

GLSurfaceView是将OpenGL ES图形用到应用的一种方式,对于全屏或者接近全屏的图形view,它是个不错的选择。但是开发者如果想在layout里面一块小区域显示OpenGL ES图形,应该使用TextureView。使用SurfaceView来创建一个OpenGL ES view也是可以的,但这需要写不少的额外代码。

本教程介绍了在一个简单的应用activity中,如何实现GLSurfaceView和GLSurfaceView.Renderer的基本部分。

  1. 在Manifest中声明使用OpenGL ES

为了在你的应用中使用OpenGL ES 2.0 API,必须在manifest中添加下面的声明:

<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开发指南。

2. 创建一个显示OpenGL ES图形的Activity

显示OpenGL ES 的Android应用和其他有用户界面的应用一样,都有activity,和其他应用的一个主要区别就是activity中layout放置的内容。在大多数应用中可能会使用TextView,Button和ListView,在使用OpenGL ES的应用中,你也可以使用GLSurfaceView。

下面的代码展示了一个activity使用GLSurface View作为它的主视图:

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);

}

}

注意:OpenGL ES 2.0需要Android 2.2或者更高的版本,所以确保应用的目标API符合要求。

3. 创建一个GLSurfaceView对象

GLSurfaceView是用来绘制OpenGL ES图形的专用view,它自己本身没有做很多工作。真正的绘制工作是由GLSurfaceView.Renderer控制的,实际上,GLSurfaceView是用来绘制OpenGL对象的代码是那么少,你可能会尝试跳过继承它,只创建一个未修改的GLSurfaceView实例,但是不要这么做,你需要通过这个类来捕获touch事件,这将会在 Responding to Touch Events教程中讲到。

GLSurfaceView的关键代码是很少的,所以比较快的实现是,只在activity中创建一个匿名内部类:

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的API:

// Create an OpenGL ES 2.0 context

setEGLContextClientVersion(2);

另一个可选的添加到GLSurfaceView实现的方法是设置渲染模式为只有在drawing数据改变的时候才画view,使用 GLSurfaceView.RENDERMODE_WHEN_DIRTY进行设置:

// Render the view only when there is a change in the drawing data

setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

这个选项避免了GLSurfaceView被重新绘制,只有当你调用了requestRender()时才会重新绘制,这会提高应用的效率。

4. 创建一个Renderer类

在使用OpenGL ES的应用中,GLSurfaceView.Renderer或者renderer是事情变得有趣的地方,这个类控制了GLSurfaceView上面画什么,renderer中有三个方法被Android系统调用来确定在GLSurfaceView中画什么和怎么画:

onSurfaceCreated() - 在设置view的OpenGL ES环境时会被调用一次

onDrawFrame() - 在每一次重新绘制view的时候被调用

onSurfaceChanged() - 在view的几何形状改变的时候调用,比如设备旋转屏幕。

下面是一个简单的OpenGL ES render实现,在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);

}

}

这就是全部!上面的示例代码创建了一个简单的Android应用程序,使用OpenGL显示一个灰色的屏幕。虽然这些代码没有做一些有趣的东西,但是通过创建这些类,你已经打下了使用OpenGL绘制图形元素所需要的基础。

注意:当你使用OpenGL ES 2.0API时,你可能好奇为什么这些方法有一个GL10参数。其实这样做的目的是让Android框架能够简单的兼容OpenGL ES的各版本。

如果你对OpenGL ES的API比较数序,你现在应该可以设置一个OpenGL ES环境并且开始绘图,但是如果你需要更多的OpenGL帮助,学习下一章教程来获得更多的帮助。

时间: 2024-11-04 19:48:04

Android OpenGL ES绘图教程之一 : 构建OpenGL ES 环境的相关文章

Android OpenGL ES绘图教程之二 : 定义形状

在OpenGL ES view中可以定义要绘制图形的形状,是你创建高端图形杰作的第一步.在不知道一些基础的情况下来绘制会有点棘手,比如OpenGL ES是如何定义图形对象的. 本教程解释了OpenGL ES坐标系统与Android设备屏幕的关系,如果定义基础的形状,比如三角形和四边形. 1. 定义一个三角形 OpenGL ES允许你在三维坐标系统中定义绘制对象,所以在绘制三角形之前,必须定义它的坐标.在OpenGL里面,定义坐标的典型方式是定义一个浮点型的顶点坐标数组,为了最大化效率,将这些坐标

Android OpenGL ES绘图教程之三 : 绘制图形

在定义了将要被OpenGL绘制的形状之后,你当然想要绘制它们.使用OpenGL ES 2.0绘制图形需要的代码可能比你想象的要多,因为API提供了大量的图形渲染管道控制接口. 这一章将介绍如何使用OpenGL ES 2.0 API绘制上一章中定义的形状 1. 初始化形状 在你做任何的绘制操作之前,你都必须进行初始化和加载计划绘制的形状.除非在执行的过程中形状所在的结构(原坐标)发生变化,你应该在render中的onSurfaceCreated()方法中初始化它们以提高内存和执行效率. publi

Android OpenGL ES绘图教程之六 :响应触摸事件

使对象根据预设的程序进行运动,比如旋转三角形,可以吸引人的注意力.但是如果你想让用户同你的OpenGL ES图形进行交互会怎么样呢?使你的OpenGL ES应用程序触摸互动的关键是要扩展GLSurfaceView,复写onTouchEvent()方法,来监听touch事件.本教程展示了,如何监听透出事件,让用户旋转一个OpenGL ES对象. 1.   设置一个Touch Listener 为了使你的OpenGL ES应用响应touch事件,你必须在GLSurfaceView类中实现OnTouc

03: OpenGL ES 基础教程02 使用OpenGL ES 基本步骤

第二章:让硬件为你工作(OpenGL ES 应用实践指南 iOS卷) 前言: 1:使用OpenGL ES 基本步骤 2:绘制三角形 3:效果 正文: 一:使用OpenGL ES 基本步骤 1:生成缓存标识符 glGenBuffers(); 2:绑定缓存标识符到当前缓存区域   glBindBuffer(); 3:初始化且分配缓存内存(通常是从CPU控制的内存复制数据到分配的内存)  glBufferData( ); 4:  启用缓存中的数据 glEnableVertexAttribArray()

Android OpenGL ES 开发教程 从入门到精通

From:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

[转]Android OpenGL ES 开发教程 从入门到精通

本文转自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

OpenGL ES 简单教程

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. OpenGL ES 定义了一个在移动平台上可以支持OpenGL最基本功能的精简标准.以适应如手机.PDA或其他消费者移动终端的显示系统. Khronos Group 定义和管理了OpenGL ES标准. OpenGL 与 OpenGL ES的关系OpenGL ES 是基于桌面版本号OpenGL 的

PPAPI中使用OpenGL ES绘图

在PPAPI中使用Chromium的3D图形接口一文中我们介绍了怎么使用PPB_Graphics3D接口,提供了一个简单示例,单机鼠标可以变换插件颜色. foruok原创,如需转载请关注foruok的微信订阅号"程序视界"联系foruok. PPB_Graphics3D是Chromium暴露给PPAPI的3D图形接口,类似衔接Open GL和本地窗口系统的EGL.我们使用PPB_Graphics3D的Create方法来创建context,然后使用PPB_Instance的BindGra

iOS开发-OpenGL ES入门教程1

http://www.jianshu.com/p/750fde1d8b6a 这里是一篇新手教程,环境是Xcode7+OpenGL ES 2.0,目标写一个OpenGL ES的hello world.OpenGL ES系列教程在这里.OpenGL ES系列教程的代码地址 你的star和fork是我的源动力,你的意见能让我走得更远. 核心思路 通过GLKit,尽量简单地实现把一张图片绘制到屏幕. 效果展示 具体细节 1.新建OpenGL ES上下文 - (void)setupConfig { //新