博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 第一个OpenGL ES程序
阅读量:6196 次
发布时间:2019-06-21

本文共 4440 字,大约阅读时间需要 14 分钟。

 

Android 第一个OpenGL ES程序

  在你的Android应用中用OpenGL ES绘制图形,首先需要有一个容器,最直接的方法是实现 和  

  前者是一个放置图形的View容器,后者用来控制在这个View中如何进行绘制。

 

  只是一种选择,比较适合于全屏绘制图形或者近似全屏绘制,其他可以选择的还有 

  

  本文展示一个最基本的Android OpenGL ES绘制Demo。

 

1.在Manifest中添加声明

  为了使用OpenGL ES 2.0 API,需要添加如下声明:

 

  OpenGL ES 2.0 requires Android 2.2 (API Level 8) or higher,所以需要确认系统版本。

 

2.创建Activity

  在Activity的布局中,需要加入来放置绘制的图形。

  一个最简单的版本如下:

public class OpenGLES20 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);    }}

 

 

3.创建GLSurfaceView

  是一个特殊的组件,你可以在其中绘制OpenGL ES图形。

  你需要扩展这个类,在它的构造方法中设置渲染器:

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,还需要加一句声明:

// Create an OpenGL ES 2.0 contextsetEGLContextClientVersion(2);

 

  还有一个可选的设置是,把渲染模式改为  ,这样仅在你的数据有变化时重新进行渲染。

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

 

  除非你调用,这个设置会阻止帧被重画,有些情况下这样效率更高。

 

4.建立一个Renderer类

  Renderer类(渲染器类),即 的实现类,它控制了与它相关联的  上绘制什么。

  其中有三个主要的回调方法:

  •  - Called once to set up the view's OpenGL ES environment.
  •  - Called for each redraw of the view.
  •  - Called if the geometry of the view changes, for example when the device's screen orientation changes.

  

  一个简单的实现例子:

public class MyGL20Renderer implements GLSurfaceView.Renderer {    public void onSurfaceCreated(GL10 unused, EGLConfig config) {        // Set the background frame color        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 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);    }}

 

 

程序例子

  一个简单的程序例子,并没有绘制什么,只是设置了背景色,为了展示方便,GLSurfaceView类和渲染器类都作为Acitivity的内部类写出。

  首先在Manifest中加上声明:

 

Manifest

 

Activity
package com.example.helloopengles;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.app.Activity;import android.content.Context;import android.opengl.GLES20;import android.opengl.GLSurfaceView;import android.os.Bundle;import android.util.Log;public class HelloOpenGLESActivity 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);    }    class MyGLSurfaceView extends GLSurfaceView    {        public MyGLSurfaceView(Context context)        {            super(context);            try            {                // Create an OpenGL ES 2.0 context                setEGLContextClientVersion(2);                // Set the Renderer for drawing on the GLSurfaceView                setRenderer(new MyRenderer());                // Render the view only when there is a change in the drawing                // data                setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);                // 注意上面语句的顺序,反了可能会出错            }            catch (Exception e)            {                e.printStackTrace();            }        }    }    public class MyRenderer implements GLSurfaceView.Renderer    {        public void onSurfaceCreated(GL10 unused, EGLConfig config)        {            // Set the background frame color            GLES20.glClearColor(0.5f, 0.5f, 0.5f, 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);        }    }}

 

 

 

参考资料

  Training: Building an OpenGL ES Environment

  

  OpenGL ES Developer Guide:

  

 

转载地址:http://jqjca.baihongyu.com/

你可能感兴趣的文章
CODING 敏捷实践完全指南
查看>>
unittest测试框架和测试报告的输出实例(一)
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
Asp.Net MVC 分页、检索、排序整体实现
查看>>
python 输出当前行号
查看>>
12C -- 配置Application Continuity
查看>>
Flymeos插桩适配教程
查看>>
Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
查看>>
C#的delegate简单练习
查看>>
还在用PS磨皮去皱?看看如何用神经网络高度还原你的年轻容貌!
查看>>
YARN中内存的设置
查看>>
java 基础2
查看>>
大端模式与小端模式、网络字节顺序与主机字节顺序
查看>>
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
jsp九大内置对象
查看>>
制作一款微信表情
查看>>
高仿Instagram 页面效果android特效
查看>>
jsonp跨域访问+AES,RSA加密
查看>>
我的友情链接
查看>>