`
Beyon_javaeye
  • 浏览: 67588 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

GLSurfaceView介绍

阅读更多
GLSurfaceView介绍

简介
  
  • SDK 中的 android.opengl.GLSurfaceView 类提供如下功能:
  • 在 OpenGL ES 和 View 系统之间建立联系;
  • 使得 OpenGL ES 可以工作在 Activity 生命周期中;
  • 可选择合适的 frame buffer 像素格式;
  • 创建并管理一个单独的渲染线程,可以实现平滑的动画;
  • 提供 debugging 工具和 API。
一个简单的 GLSurfaceView 应用
package com.example.android.apis.graphics;

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

  这个程序功能很简单,每帧绘制时将屏幕设置成黑色。但它是一个完整的工作在 Activity 生命周期中的 OpenGL 程序。当 activity 暂停时,它暂停渲染;当 activity 继续时,它继续渲染。可以将这个程序用作非交互式的 demo 程序。 可以在 ClearRenderer.onDrawFrame() 接口中增加 OpenGL 调用做很多的绘制。
  GLSurfaceView.Render 接口有三个方法:
  
  • onSurfaceCreated():该方法在渲染开始前调用,OpenGL ES 的绘制上下文被重建 时也会被调用。当 activity 暂停时绘制上下文会丢失,当 activity 继续 时,绘制上下文会被重建。另外,创建长期存在的 OpenGL 资源(如 texture)往往也在这里进行。
  • onSurfaceChanged():当 surface 的尺寸发生改变时该方法被调用。往往在 这里设置 viewport。若你的 camera 是固定的,也可以在这里设置camera。
  • onDrawFrame():每帧都通过该方法进行绘制。绘制时通常先调用 glClear  函数来清空 framebuffer,然后在调用 OpenGL ES 的起它的接口进行绘制。

输入如何处理
  若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可 以获取输入事件。下面有个例子:
package com.google.android.ClearTest;

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

  这个应用在每一帧中清空屏幕。当 tap 屏幕时,改变屏幕的颜色。这里在 ClearGLSurfaceView.onTouchEvent() 中使用了 queueEvent()。queueEvent() 方法用于在 UI 线程和渲染线程间通信。也可以用起它的 Java 线程通信技术, 如 synchronized 方法,但 queueEvent 最简单的线程通信方法。

其他的 GLSurfaceView 例子
在 Android SDK 的 API Demo例子程序中还有很多例子:
  • GLSurfaceView
  • Kube
  • Translucent GLSurfaceView:透明背景
  • Textured Triangle:纹理贴图
  • Sprite Text:在 texture 上写文本并显示在 3D 场景中
  • Touch Rotate:旋转 3D 对象

选择一个 Surface
  GLSurfaceView 提供了接口可选择 surface 的类型。默认情况下, GLSurfaceView 会使用一个 16 位 RGB frame buffer,带 16 位深度。你也可 以根据自己的需要进行选择,比如在 Translucent GLSurfaceView 例子里, 需要一个 Alpha 通道来实现透明。GLSurfaceView 提供了 setEGLSurfaceChooser()方法来选择 surface。

  选择一个 RGB (565)的16位 framebuffer,接口如下:
setEGLConfigChooser(boolean needDepth)

  若要定制 red, green, blue, alpha 和 depth,则用如下接口:
setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)

  使用自己实现的 EGLConfigChooser,用如下的接口:
setEGLConfigChooser(EGLConfigChooser configChooser)


持续型渲染模式 & 通知型渲染模式
  大多数 3D 应用,如游戏、模拟等都是持续型渲染的动画,还有些 3D 应用是反 应式的(reactive),它们往往先被动等待,当用户有了动作再做出反应。对于这 种应用,持续渲染屏幕是浪费时间。若开发反应式的应用,可以调用下面的方法GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);
  停止持续渲染。当调用GLSurfaceView.requestRender()时,程序再渲染屏幕。

调试
  GLSurfaceView.setDebugFlags() 方法可以激活 log 或者错误检测,它们可以 帮助调试 OpenGL ES 调用。具体使用时,在 GLSurfaceView 的构造函数中, 调用 setRender() 之前调用 GLSurfaceView.setDebugFlags()就可以了。下面 是个例子:
public ClearGLSurfaceView(Context context) {
    super(context);
    // Turn on error-checking and logging
    setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
    mRenderer = new ClearRenderer();
    setRenderer(mRenderer);
}

分享到:
评论

相关推荐

    一.GLSurfaceView介绍

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

    Gallary 3d源码之glSurfaceView分析

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

    android GLSurfaceView 3D开发

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

    android图像处理高级技术

    #### 七、GLSurfaceView介绍 `GLSurfaceView`是一个专门用于OpenGL ES渲染的视图,它提供了简单的接口来渲染复杂的3D图形。 - **渲染流程**:通过`GLSurfaceView`提供的`Renderer`接口来定义渲染逻辑。 - **用户...

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

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

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

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

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

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

    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建模...

Global site tag (gtag.js) - Google Analytics