`
h416756139
  • 浏览: 365751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

介绍GLSurfaceView

阅读更多

 

android.opengl.GLSurfaceView类让你更容易地使用OpenGL ES渲染你的应用程序,其主要通过一下几点:

1、提供粘合代码把OpenGL ES连接到你的视图系统

2、提供粘合代码使得OpenGL ES按照Acticity(活动)的生命周期工作

3、使它容易选择一款合适的框架缓冲区像素格式

4、创建和管理一个独立的渲染线程,产生平滑的动画

5、提供更容易使用的调试工具来跟踪OpenGL ES 的API 并能找出错误。

 

GLSurfaceView是一个很好的基类对于构建一个使用OpenGL ES进行部分或全部渲染的应用程序。一个2D或3D的动作游戏就是一个很好的例子,例如一个2D或3D的可视化应用如谷歌地图。

 

 

以下是一个简单的GLSurfaceView的应用:

一个最简单的OpenGL ES应用代码如下:

 

package  com.javaeye.googlers

 

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

 

import android.app.Activity;

import android.opengl.GLSurfaceView;

import android.os.Bundle;

 

public class ClearActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mGLView = new GLSurfaceView(this);

        mGLView.setRenderer(new ClearRenderer());

        setContentView(mGLView);

    }

 

    @Override

    protected void onPause() {

        super.onPause();

        mGLView.onPause();

    }

 

    @Override

    protected void onResume() {

        super.onResume();

        mGLView.onResume();

    }

 

    private GLSurfaceView mGLView;

}

 

class ClearRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        // Do nothing special.

    }

 

    public void onSurfaceChanged(GL10 gl, int w, int h) {

        gl.glViewport(0, 0, w, h);

    }

 

    public void onDrawFrame(GL10 gl) {

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    }

}

 

这个程序并没有做太多东西:它在每帧是清除屏幕到黑色。但是它是一个完整的OpenGL应用程序,正确地按照Activity(活动)的生命周期实现。当活动暂停渲染它也暂停渲染,活动恢复它也恢复。你可以把这个例子作为一个基本的交互的示例程序。仅仅更多地调用了ClearRenderer.onDrawFrame() 方法。注意你甚至不需要子类化一个GLSurfaceView视图。

 

GLSurfaceView.Renderer 有三个方法:

onSurfaceCreated() :在开始渲染的时候被调用,无论什么时候OpenGL ES 渲染不得不重新被创建。(渲染是典型的丢失并重新创建当活动被暂停或恢复。)该方法一个创建长生命周期OpenGL资源(如材质)的好地方。

onSurfaceChanged():该方法在surface大小改变时被调用。这是设置你opengl视图端的好地方。如果相机是固定的,不会围着场景移动,你也可以在这里设置你的相机。

onDrawFrame():每帧的时候该方法都会被调用,这个用于画场景是可靠的。你完全可以通过调用glClear方法开清楚帧缓存,接着通过其他的opengl ES来调用画当前的场景。

 

用户如何输入?

假如你想做一个可以交互的程序(如游戏),通常你会实现GLSurfaceView子类,因为这是很容易获取用户输入事件。以下代码是一个清晰的长例子展示给你怎样做到这个:

 

package com.javaeye.googlers;

 

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

 

import android.app.Activity;

import android.content.Context;

import android.opengl.GLSurfaceView;

import android.os.Bundle;

import android.view.MotionEvent;

 

public class ClearActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mGLView = new ClearGLSurfaceView(this);

        setContentView(mGLView);

    }

 

    @Override

    protected void onPause() {

        super.onPause();

        mGLView.onPause();

    }

 

    @Override

    protected void onResume() {

        super.onResume();

        mGLView.onResume();

    }

 

    private GLSurfaceView mGLView;

}

 

class ClearGLSurfaceView extends GLSurfaceView {

    public ClearGLSurfaceView(Context context) {

        super(context);

        mRenderer = new ClearRenderer();

        setRenderer(mRenderer);

    }

 

    public boolean onTouchEvent(final MotionEvent event) {

        queueEvent(new Runnable(){

            public void run() {

                mRenderer.setColor(event.getX() / getWidth(),

                        event.getY() / getHeight(), 1.0f);

            }});

            return true;

        }

 

        ClearRenderer mRenderer;

}

 

class ClearRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        // Do nothing special.

    }

 

    public void onSurfaceChanged(GL10 gl, int w, int h) {

        gl.glViewport(0, 0, w, h);

    }

 

    public void onDrawFrame(GL10 gl) {

        gl.glClearColor(mRed, mGreen, mBlue, 1.0f);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    }

 

    public void setColor(float r, float g, float b) {

        mRed = r;

        mGreen = g;

        mBlue = b;

    }

 

    private float mRed;

    private float mGreen;

    private float mBlue;

}

 

这个应用每帧都在清楚屏幕。当你点击屏幕时,它清除颜色基于你触屏时间的X、Y坐标。注意在 ClearGLSurfaceView.onTouchEvent()中使用queueEvent()。queueEvent()方法被安全地用于在UI线程和渲染线程之间进行交流。如果你愿意,你还可以使用一些其他的java线程间交流技术,例如Renderer 类本身的同步方法。然而,queueing 事件经常是一种用于处理线程间信息交流的更简单方式。

 

 

其他的GLSurfaceView示例:

如果你厌烦了上面的示例,你还可以从android的ApiDemo中找到更经典的示例,所有的openGL ES示例都是用GLSurfaceView视图转变的:

 

GLSurfaceView - 一个旋转的三角形

Kube - 一个魔方例子

Translucent GLSurfaceView - 展示在一个透明的背景上显示3d动画

Textured Triangle - 显示一个带纹理的3D三角形

Sprite Text - 展示怎样用材质画出文字并混合进一个3d的场景中

Touch Rotate - 展示怎样旋转一个3D物体来响应用户的输入

分享到:
评论

相关推荐

    Gallary 3d源码之glSurfaceView分析

    本文将对Gallery 3d源码中的glSurfaceView进行分析,介绍了如何使用Android SDK提供的GLSurfaceView进行OpenGL ES开发。 一、GLSurfaceView简介 GLSurfaceView是Android SDK中提供的一个类,用于在OpenGL ES和View...

    GLSurfaceViewDemo:采用GLSurfaceView播放视频,并作了分层隔离

    下面将详细介绍GLSurfaceView的核心特性以及如何实现分层隔离。 首先,GLSurfaceView是Android平台专门为OpenGL ES提供的一种优化视图,它整合了Surface和SurfaceHolder,可以创建一个独立的渲染线程,从而避免UI...

    android GLSurfaceView 3D开发

    通过实例介绍android平台上通过GLSurfaceView来进行3D开发,开发一些很炫的UI界面空间

    一.GLSurfaceView介绍

    Android视频水印,学习过程记录,搭建最基本的OpenGLES框架,为绘制做准备。

    人工智能-项目实践-数据预处理-Camera2自定义采集视频数据,GlSurfaceView本地预览, 原始流上传,GlSurf

    以下将详细介绍这个过程涉及的关键知识点: 1. **Camera2 API**: Camera2是Android系统提供的高级相机接口,相较于旧版的Camera API,它提供了更精细的控制,包括对曝光、对焦、白平衡等参数的调整。在本项目中,...

    Android基于OpenGL的GLSurfaceView创建一个Activity实现方法

    下面将详细介绍如何使用`GLSurfaceView`创建一个Activity以及其相关的核心知识点。 1. **GLSurfaceView**: `GLSurfaceView`是Android中一个特殊的视图,它的主要目的是为OpenGL ES提供一个高效且方便的渲染环境。`...

    bitmap仿真书翻页,两种效果,GLSurfaceView,自定义View.zip

    以下是关于仿真技术的详细介绍: 仿真类型 按时间分类:仿真可以分为实时仿真(与现实时间同步)和非实时仿真(加速或减速)。 按形式分类:分为物理仿真(使用实物模型)和数字仿真(完全基于计算机模拟)。 仿真...

    NativeGL_demo:此程序使用android native代码实现EGL,并使用SurfaceView作为OpenGL绘图窗口。即可提高图形渲染性能,又可使用java层定义的图形界面

    1方案介绍 在实际应用中,经常遇到OpenGL ES渲染性能达不到要求,图像卡顿等GG问题。这时,在不改变平台选型的情况下,选择一个好的方案实现OpenGL渲染很重要。应用程序中使用OpenGL ES共有方案 使用GLSurfaceView...

    camera2 opengl实现滤镜效果录制视频

    在Android中,我们可以使用`GLSurfaceView` 或 `SurfaceTexture` 来创建这样的上下文。`SurfaceTexture` 将相机预览流绑定到OpenGL纹理,这样我们就可以在OpenGL渲染管线中处理图像了。 滤镜效果通常通过创建自定义...

    安卓 OpenGL ES 2.0 完全入门(一):基本概念和 hello world.docx

    本文将详细介绍安卓 OpenGL ES 2.0 的基本概念和 hello world 项目,帮助读者快速入门 OpenGL ES 2.0 的世界。 基本概念 OpenGL ES 2.0 是一种用于移动设备的图形处理 API,能够提供高性能的图形处理能力。OpenGL ...

    Android-一个Android基础项目方便您快速进行开发

    9. **README.md**:项目说明文件,通常包含项目的介绍、使用方法、注意事项等信息,对新用户非常有用。 这个基础项目可能还预设了一些常见的第三方库集成,比如用于网络请求的Retrofit,用于数据持久化的Room,用于...

    OpenGL预览摄像头

    下面将详细介绍这个过程的几个关键步骤: 1. **设置GLSurfaceView**:首先,你需要创建一个GLSurfaceView实例,并为其设置一个渲染器。渲染器是负责实际图形绘制的对象,你需要继承`GLSurfaceView.Renderer`并实现...

    android opengl

    下面将详细介绍如何在Android应用中集成并使用OpenGL。 ### Android OpenGL简介 OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。Android平台上的OpenGL...

    Android开发之OpenGL绘制2D图形的方法分析

    Android开发之OpenGL绘制2D图形的方法分析主要介绍了Android开发之OpenGL绘制2D图形的方法,结合实例形式分析了Android使用OpenGL ES的图形绘制组件实现2D图形绘制的原理、步骤及相关代码注意事项。 一、OpenGL ES...

    android开发之OpenGL ES教程

    本教程将聚焦于Android上的OpenGL ES 3D游戏开发,介绍如何设置OpenGL ES视图,这是任何图形应用的基础。 首先,我们要了解的是`GLSurfaceView`。在Android 1.5版本中引入的`GLSurfaceView`是一个API类,它为编写...

    Android OpenGL的一个简单的例子.rar

    本教程将通过一个简单的例子来介绍如何在Android应用中使用OpenGL。 首先,我们需要在Android项目中设置OpenGL环境。在AndroidManifest.xml文件中添加必要的权限: ```xml ``` 这表明我们的应用需要使用OpenGL ES...

    Android-EasyShow3D一个基于OpenGLES的简单易用的3D模型展示框架

    一、框架介绍 EasyShow3D的核心在于其对3D模型文件的解析和渲染能力。它能够自动分类解析多种格式的3D模型文件,如STL( Stereolithography)、OBJ(Wavefront Object)和3DS(3D Studio Max)。这些格式在3D建模...

    helloOpenGLES2.0

    在GLSurfaceView上使用OpenGL ES绘制一个简单的三角形和正方形,初步介绍OpenGL ES的使用方法

    Android_OpenGL_ES_简明开发教程

    并且,由于很多移动平台都支持OpenGL ES开发包,所以尽管教程是基于Android平台进行介绍,但所涉及的基本概念和开发步骤同样适用于其他平台。 总的来说,OpenGL ES是一个功能强大的API,允许开发者利用嵌入式设备的...

Global site tag (gtag.js) - Google Analytics