`

OpenGL ES之GLSurfaceView学习一:介绍

阅读更多

原文地址::http://120.132.134.205/cmdn/supesite/?uid-5358-action-viewspace-itemid-6527

GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。

GLSurfaceView提供了下列特性:
1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。
使用GLSurfaceView
通常会继承GLSurfaceView,并重载一些和用户输入事件有关的方法。如果你不需要重载事件方法,GLSurfaceView也可以直接使用, 你可以使用set方法来为该类提供自定义的行为。例如,GLSurfaceView的渲染被委托给渲染器在独立的渲染线程里进行,这一点和普通视图不一 样,setRenderer(Renderer)设置渲染器。
初始化GLSurfaceView
初始化过程其实仅需要你使用setRenderer(Renderer)设置一个渲染器(render)。当然,你也可以修改GLSurfaceView一些默认配置。
* setDebugFlags(int)
* setEGLConfigChooser(boolean)
* setEGLConfigChooser(EGLConfigChooser)
* setEGLConfigChooser(int, int, int, int, int, int)
* setGLWrapper(GLWrapper)

定制android.view.Surface
GLSurfaceView默认会创建像素格式为PixelFormat.RGB_565的surface。如果需要透明效果,调用 getHolder().setFormat(PixelFormat.TRANSLUCENT)。透明(TRANSLUCENT)的surface的像 素格式都是32位,每个色彩单元都是8位深度,像素格式是设备相关的,这意味着它可能是ARGB、RGBA或其它。
选择EGL配置
Android设备往往支持多种EGL配置,可以使用不同数目的通道(channel),也可以指定每个通道具有不同数目的位(bits)深度。因此, 在渲染器工作之前就应该指定EGL的配置。GLSurfaceView默认EGL配置的像素格式为RGB_656,16位的深度缓存(depth buffer),默认不开启遮罩缓存(stencil buffer)。
如果你要选择不同的EGL配置,请使用setEGLConfigChooser方法中的一种。
调试行为
你可以调用调试方法setDebugFlags(int)或setGLWrapper(GLSurfaceView.GLWrapper)来自定义 GLSurfaceView一些行为。在setRenderer方法之前或之后都可以调用调试方法,不过最好是在之前调用,这样它们能立即生效。
设置渲染器
总之,你必须调用setRenderer(GLSurfaceView.Renderer)来注册一个GLSurfaceView.Renderer渲染器。渲染器负责真正的GL渲染工作。
渲染模式
渲染器设定之后,你可以使用setRenderMode(int)指定渲染模式是按需(on demand)还是连续(continuous)。默认是连续渲染。
Activity生命周期
Activity窗口暂停(pause)或恢复(resume)时,GLSurfaceView都会收到通知,此时它的onPause方法和 onResume方法应该被调用。这样做是为了让GLSurfaceView暂停或恢复它的渲染线程,以便它及时释放或重建OpenGL的资源。
事件处理
为了处理事件,一般都是继承GLSurfaceView类并重载它的事件方法。但是由于GLSurfaceView是多线程操作,所以需要一些特殊的处 理。由于渲染器在独立的渲染线程里,你应该使用Java的跨线程机制跟渲染器通讯。queueEvent(Runnable)方法就是一种相对简单的操 作,例如下面的例子。
class MyGLSurfaceView extends GLSurfaceView {

private MyRenderer mMyRenderer;

public void start() {
mMyRenderer = ...;
setRenderer(mMyRenderer);
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
queueEvent(new Runnable() {
// 这个方法会在渲染线程里被调用
public void run() {
mMyRenderer.handleDpadCenter();
}});
return true;
}
return super.onKeyDown(keyCode, event);
}
}
(注:如果在UI线程里调用渲染器的方法,很容易收到“call to OpenGL ES API with no current context”的警告,典型的误区就是在键盘或鼠标事件方法里直接调用opengl es的API,因为UI事件和渲染绘制在不同的线程里。更甚者,这种情况下调用glDeleteBuffers这种释放资源的方法,可能引起程序的崩溃, 因为UI线程想释放它,渲染线程却要使用它。)
分享到:
评论

相关推荐

    opengl_GLsurfaceview.rar

    GLSurfaceView是Android SDK提供的一种用于在应用程序中集成OpenGL ES的组件。在Android应用开发中,GLSurfaceView使得开发者可以方便地创建和管理一个专用的Surface,专门用于OpenGL渲染,从而避免了与UI线程的冲突...

    OpenGL ES 纹理实例

    OpenGL ES(Embedded Systems)是OpenGL的一个精简版,专为嵌入式设备如智能手机、平板电脑等设计,用于处理2D、3D图形渲染。在移动设备上,OpenGL ES是应用开发中的重要部分,尤其在游戏和图形密集型应用中。本教程...

    Gallary 3d源码之glSurfaceView分析

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

    ExoPlayer 使用GLSurfaceView播放视频

    首先,GLSurfaceView是Android系统提供的一种用于在视图上显示OpenGL ES图形的组件。OpenGL ES是OpenGL的一个子集,专为嵌入式设备设计,广泛应用于移动设备的2D和3D图形渲染。通过GLSurfaceView,我们可以自定义...

    Android上opengl es3.0实现一个旋转的三角形(Android studio2.1.3)

    OpenGL ES 是一种针对嵌入式设备的图形处理接口,它基于 OpenGL 标准,并且针对移动设备进行了优化。OpenGL ES 3.0 是其一个重要版本,提供了更多的特性、更高的性能和更丰富的图形处理能力。在 Android 平台上,...

    Android平台使用OpenGLES2.0显示YUV数据

    总结起来,这个项目涉及到Android Camera API的使用,YUV到RGB的数据转换,OpenGLES2.0纹理处理,以及`GLSurfaceView`的使用。通过实践和学习这些知识点,开发者可以实现高效、流畅的摄像头预览效果,并为后续的视频...

    OpenGL ES从入门到精通

    OpenGL ES 是一种针对嵌入式系统的图形库,广泛应用于移动设备和嵌入式系统,如Android智能手机和平板电脑。它是OpenGL标准的一个子集,专为有限的硬件资源和低功耗设计。本教程将带你从入门到精通,深入理解OpenGL ...

    Android OpenGL ES 简明开发教程

    对于初次接触OpenGL ES的Android开发者,构建一个简单的OpenGL ES应用通常遵循以下步骤: 1. **创建GLSurfaceView实例**:在布局XML文件中定义或通过代码动态创建`GLSurfaceView`。 2. **设置Renderer**:通过`...

    Android OpenGL ES 绘制立方体 球体 圆柱 等几何形状

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建复杂的3D图形和动画。Android OpenGL ES 提供了一个接口,让开发者能够利用硬件加速的图形处理能力,来绘制出立方体、球体、...

    opengles渲染NV21

    要利用OpenGL ES渲染NV21数据,首先需要创建一个GLSurfaceView,它是Android系统提供的一个特殊视图,可以绑定到一个OpenGL ES上下文,允许我们绘制图形和处理图像。GLSurfaceView还提供了一个Renderer接口,我们...

    Android开发之OpenGL ES教程

    OpenGL ES (Embedded Systems) 是一个轻量...通过这个教程,开发者可以逐步学习如何在Android应用中设置和使用OpenGL ES,创建复杂的3D图形和动画,同时理解如何有效地利用`GLSurfaceView`提供的特性来优化性能和调试。

    Android OpenGL ES 2.0学习书籍.rar

    最后,了解如何与硬件加速的OpenGLES API交互,以及熟悉GLSL语言(OpenGL Shading Language),是成为OpenGL ES 2.0专家的必经之路。通过编写高效、可读性强的着色器代码,可以创造出各种复杂的视觉效果,实现令人...

    Android点击屏幕坐标对应OpenGL ES坐标

    在Android开发中,当涉及到图形渲染时,OpenGL ES(OpenGL for Embedded Systems)是一个常见的选择,它为移动设备提供了强大的2D和3D图形处理能力。本文将深入探讨如何将Android屏幕坐标转换为OpenGL ES坐标,并在...

    openGLES简单学习-demo

    2. **绘图表面(Surface)**:用于显示图形的区域,例如`GLSurfaceView`是Android中的一个视图类,提供了一个方便的接口来与openGLES交互。 3. **缓冲区(Buffers)**:用于存储数据,如顶点、颜色、纹理坐标等,...

    OpenGL ES实例1:上下跳动的正方形

    标签“OpenGLES实例”表明这是一个实践性的教程,旨在帮助开发者了解如何在实际项目中使用OpenGL ES。通过这个简单的跳动正方形,开发者可以学习到基本的OpenGL ES编程流程,包括设置着色器、处理顶点数据、以及利用...

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

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

    OpenGLES 在 android 上显示摄像头滤镜效果

    在Android平台上,OpenGLES(OpenGL for Embedded Systems)是一种用于渲染2D和3D图形的API,特别适用于移动设备。OpenGLES 2.0版本引入了着色器语言(GLSL),使得开发者能够利用GPU的强大计算能力来处理复杂的图像...

    Android Opengles 开发入门技术文档

    - GLSurfaceView:作为OpenGL ES渲染的视图组件,提供了一种管理OpenGL上下文和绘制循环的方式。 - GLDebugHelper、GLException:帮助调试OpenGL ES代码,捕捉和报告错误。 - Matrix类:处理OpenGL ES格式的矩阵...

Global site tag (gtag.js) - Google Analytics